8051과 mpc860간의 시리얼 통신을 하는데 문제점이...도움 부탁
안녕하세요. ^^*
시리얼 통신 하는데 문제점이 생겼는데 좀 도와주세여~
밑에 프로그램으로 컴파일 해보고 실행을 시켜보았습니다.
일단 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++);
}
찍어보셨나요?
찍어보셨나요?
P1에 led가 8개 달려 있는 건가요?뭐 해 보셨겠지만 일단 테스
P1에 led가 8개 달려 있는 건가요?
뭐 해 보셨겠지만 일단 테스트 프로그램에서 하나씩 무조건 켜는 놈 만들어서 led 체크하시고 무한루프에서 getch 되면 putch 로 echo back 하는 놈 만들어서 시리얼 포트 정상동작하는지 체크해보면 문제 발생지점이 어디인지 알 수 있지 않을까요?
그리고 보드 init이 다 된건가요? 기억이 가물가물한데 보드init하는 부분이 좀 길었었던 거 같은데 :)
그리고
한 다음에도 딜레이를 주시는게 혹시나 시리얼포트문제로 data가 burst로 들어오거나 0xff, 0x00 이따위 더미들이 뭉텡이로 들어오는 가능성에 대해서 체크할 수 있을 거 같은데요.
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
음..
9600BPS = 1200CPS니까 초당 1200개의 문자가 ASC로
바뀌어서 LED에 찍히겠네요. 눈으로 바뀌는게 안보일듯한데....
그리고, printf 함수가 '\n'으로 끝났으니 마지막에 LED엔
'\n'에 해당하는 ASC코드가 보이겠네요.
근데 printf로 문자열찍으면 맨뒤에 NULL캐릭터가 붙던가?
붙을꺼같은데요..그럼 마지막에 LED는 다 껴지던지 다 꺼지겠죠.
putchar 함수로 테스트 해보세요.
ㅎㅁㅎ
댓글 달기