8051과 mpc860간의 시리얼 통신을 하는데 문제점이...도움 부탁

frenheit의 이미지

안녕하세요. ^^*
시리얼 통신 하는데 문제점이 생겼는데 좀 도와주세여~

밑에 프로그램으로 컴파일 해보고 실행을 시켜보았습니다.
일단 target board의 ttyS1은 PC의 COM1과 연결하고 HOST PC에서 minicom을 실행한 상태에서요.

그랬더니 write에 그냥 문자열을 넣어서 보냈을 경우 잘 넘어갔고,
밑에 프로그램 처럼 hex 값을 입력하고,8051 보드를 연결하였더니
8051보드에서 P1에 연결된 LED가 반응이 없더군요.
몇 일째 이것 때문에 고생하고 있는데 도움 부탁드립니다. ~~;;

--linux application program--

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/types.h>
#include <linux/serial.h>

#include <termios.h>
#include <sys/signal.h>

//NON-CANONICAL
//MAIN function

int main(int argc, char **argv)
{
struct termios oldtio,newtio;

volatile int fd,size,val,i;
volatile unsigned char data;

size=sizeof(unsigned char);

//OPEN COM2 PORT
fd=open("/dev/ttyS1",O_RDWR | O_NOCTTY );
if(fd<0)
{
//OPEN FILE FAILED
printf("can't open serial port 0\n");
return -1;
}

//통신환경 설정
tcgetattr(fd,&oldtio); //현재 설정을 oldtio에 저장

memset(&newtio,0,sizeof(newtio));
newtio.c_cflag = B9600 | CS8 | CLOCAL |CREAD ;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;

tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);

while(1){
data=0;
for(i=0;i<8;i++){
val=(unsigned char)(1<<i);
data +=val;
write(fd,&data,size);
printf("HEX CODE = ");
printf("%02x\n",data);
sleep(1);
}
}//while end

tcsetattr(fd,TCSANOW,&oldtio);

close(fd);
return 0;

}//main end

--8051 firmware--

#include <reg51.h>

typedef unsigned char BYTE;

void init_serial(void);
void putch(char);
BYTE getch(void);
void delay(unsigned int);

void main(void)
{
unsigned int i;
BYTE ch;

for(i=0;i<5;i++){
P1=0xaa;
delay(10000);
}//LED 초기화

init_serial();//통신모드 초기화

while(1){
for(i=0;i<8;i++){
ch=getch();
P1=ch;
}P1, LED 카운터
}

}//main end

void putch(char ch){
while(!TI); // TX
SBUF=ch;
TI=0;
}

BYTE getch(void)
{
BYTE ch; //RX
while(!RI);
ch=SBUF;
RI=0;
return ch;
}

void init_serial(void)
{
TMOD=0x20;
PCON=0x80;
SCON=0x50;
TH1=0xfd;
TR1=1;
TI=1;
RI=0;
SBUF=0;
//통신 초기화. 8051보드 모니터 프로그램 부분 참조. 보레이트 9600BPS
}

void delay(unsigned int sleep)
{
unsigned int j;
for(j=0; j< sleep ;j++);
}

MasterQ의 이미지

찍어보셨나요?

crimsoncream의 이미지

P1에 led가 8개 달려 있는 건가요?
뭐 해 보셨겠지만 일단 테스트 프로그램에서 하나씩 무조건 켜는 놈 만들어서 led 체크하시고 무한루프에서 getch 되면 putch 로 echo back 하는 놈 만들어서 시리얼 포트 정상동작하는지 체크해보면 문제 발생지점이 어디인지 알 수 있지 않을까요?
그리고 보드 init이 다 된건가요? 기억이 가물가물한데 보드init하는 부분이 좀 길었었던 거 같은데 :)
그리고

P1 = ch;

한 다음에도 딜레이를 주시는게 혹시나 시리얼포트문제로 data가 burst로 들어오거나 0xff, 0x00 이따위 더미들이 뭉텡이로 들어오는 가능성에 대해서 체크할 수 있을 거 같은데요.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

eou4의 이미지

9600BPS = 1200CPS니까 초당 1200개의 문자가 ASC로

바뀌어서 LED에 찍히겠네요. 눈으로 바뀌는게 안보일듯한데....

그리고, printf 함수가 '\n'으로 끝났으니 마지막에 LED엔

'\n'에 해당하는 ASC코드가 보이겠네요.

근데 printf로 문자열찍으면 맨뒤에 NULL캐릭터가 붙던가?

붙을꺼같은데요..그럼 마지막에 LED는 다 껴지던지 다 꺼지겠죠.

putchar 함수로 테스트 해보세요.

ㅎㅁㅎ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.