도와주세요!!
글 수 15,339
2003.05.30 08:55:36 (*.186.48.184)
6704
M01에서 시리얼 포트 사용하여 통신을 하는 프로그램을 하는데
ttySA0를 사용하여 packet을 주고 받는 프로그램을 만들고 싶은데
크로스 컴파일러로 컴파일하면 에러가 없이 컴파일이 됩니다.
그런데 보드에 업로드해서 실행을 하면 packet을 보내고 나면 응답오는
packet을 받을 수 가 없었습니다.
분명히 red hat 8.0에서는 되는 것을 확인하고 크로스 컴파일 하고 올린 것인
데
아시는 분 있으시면 왜 안되는지 알려 주세요....
아마도 com port setting하는 곳에서 이상이 있는 것 같은데
COM1을 가지고 packet을 주고 받을 수 있는 프로그램을 아시는 분이 있으시면
알려 주세요.... 메일로 주셔도 되고, 밑에 달아 주셔도 됩니다...
아래와 같이 com setting 을 했는데 잘 안되더군요....
void* COM_open(void* parameters)
{
struct COM_parms* com = (struct COM_parms*) parameters;
struct sigaction saio; /* signal action의 정의 */
printf("buf_size : %d
", com->buffer_size);
printf("port : %s
", com->port);
printf("baudrate : %ld
", com->baudrate);
/* Non-blocking 모드로 시리얼 장치를 연다(read 함수 호출 후 즉각 리
턴) */
fd = open(com->port, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd <0) {perror(com->port); exit(-1); }
/* install the signal handler before making the device asynchronous
*/
/* 장치를 비동기 모드로 만들기 전에 signal handler */
saio.sa_handler = signal_handler_IO;
//saio.sa_mask = 0;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);
/* file descriptor를 비동기로 만든다. (manual page를 보면
O_APPEND 와 O_NONBLOCK만이 F_SETFL에 사용할 수 있다고 되어 있다.)
*/
fcntl(fd, F_SETFL, FASYNC);
/* SIGIO signal을 받을 수 있도록 한다. */
fcntl(fd, F_SETOWN, getpid());
tcgetattr(fd,&oldtio); /* save current port settings */
/* 입력처리를 위한 포트 세팅 */
newtio.c_cflag = com->baudrate | CS8 | CLOCAL | CREAD | CRTSCTS;
newtio.c_iflag = IGNPAR | ICRNL;
// newtio.c_cflag &= ~HUPCL; /* clear the HUPCL bit, close doesn't
change DTR */
newtio.c_oflag = 0;
// newtio.c_lflag = ICANON;
newtio.c_lflag = 0;
newtio.c_cc[VMIN]= 0;
newtio.c_cc[VTIME]= 0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
ttySA0를 사용하여 packet을 주고 받는 프로그램을 만들고 싶은데
크로스 컴파일러로 컴파일하면 에러가 없이 컴파일이 됩니다.
그런데 보드에 업로드해서 실행을 하면 packet을 보내고 나면 응답오는
packet을 받을 수 가 없었습니다.
분명히 red hat 8.0에서는 되는 것을 확인하고 크로스 컴파일 하고 올린 것인
데
아시는 분 있으시면 왜 안되는지 알려 주세요....
아마도 com port setting하는 곳에서 이상이 있는 것 같은데
COM1을 가지고 packet을 주고 받을 수 있는 프로그램을 아시는 분이 있으시면
알려 주세요.... 메일로 주셔도 되고, 밑에 달아 주셔도 됩니다...
아래와 같이 com setting 을 했는데 잘 안되더군요....
void* COM_open(void* parameters)
{
struct COM_parms* com = (struct COM_parms*) parameters;
struct sigaction saio; /* signal action의 정의 */
printf("buf_size : %d
", com->buffer_size);
printf("port : %s
", com->port);
printf("baudrate : %ld
", com->baudrate);
/* Non-blocking 모드로 시리얼 장치를 연다(read 함수 호출 후 즉각 리
턴) */
fd = open(com->port, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd <0) {perror(com->port); exit(-1); }
/* install the signal handler before making the device asynchronous
*/
/* 장치를 비동기 모드로 만들기 전에 signal handler */
saio.sa_handler = signal_handler_IO;
//saio.sa_mask = 0;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);
/* file descriptor를 비동기로 만든다. (manual page를 보면
O_APPEND 와 O_NONBLOCK만이 F_SETFL에 사용할 수 있다고 되어 있다.)
*/
fcntl(fd, F_SETFL, FASYNC);
/* SIGIO signal을 받을 수 있도록 한다. */
fcntl(fd, F_SETOWN, getpid());
tcgetattr(fd,&oldtio); /* save current port settings */
/* 입력처리를 위한 포트 세팅 */
newtio.c_cflag = com->baudrate | CS8 | CLOCAL | CREAD | CRTSCTS;
newtio.c_iflag = IGNPAR | ICRNL;
// newtio.c_cflag &= ~HUPCL; /* clear the HUPCL bit, close doesn't
change DTR */
newtio.c_oflag = 0;
// newtio.c_lflag = ICANON;
newtio.c_lflag = 0;
newtio.c_cc[VMIN]= 0;
newtio.c_cc[VTIME]= 0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);