BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #6732同步于 2009/11/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

请教串口接收数据丢失问题。

zyy08
2009/11/30镜像同步1 回复
我用串口调试助手向ARM板发送数据的时候,发的是22位数据,接收的确是9位,不知道这是怎么回事,麻烦大家给看看,下面是我的程序 #include <stdio.h> /*标准输入输出定义*/ #include <stdlib.h> /*标准函数库定义*/ #include <unistd.h> /*Unix 标准函数定义*/ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> /*文件控制定义*/ #include <termios.h> /*PPSIX 终端控制定义*/ #include <errno.h> /*错误号定义*/ #include <time.h> #define FALSE -1 #define TRUE 0 /** *@brief 设置串口通信速率 *@param fd 类型 int 打开串口的文件句柄 *@param speed 类型 int 串口速度 *@return void */ int speed_arr[] = {B115200,B38400,B19200,B9600,B4800,B2400,B1200,B300,B115200,B38400,B19200,B9600,B4800,B2400,B1200,B300,}; int name_arr[] = {115200,38400,19200,9600,4800,2400,1200,300,115200,38400,19200,9600,4800,2400,1200,300,}; void set_speed(int fd, int speed){ int i; int status; struct termios Opt; tcgetattr(fd, &Opt); for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) { if (speed == name_arr[i]) { tcflush(fd, TCIOFLUSH); cfsetispeed(&Opt, speed_arr[i]); cfsetospeed(&Opt, speed_arr[i]); status = tcsetattr(fd, TCSANOW, &Opt); if (status != 0) { perror("tcsetattr fd1"); return; } tcflush(fd,TCIOFLUSH); } } } /** *@brief 设置串口数据位,停止位和效验位 *@param fd 类型 int 打开的串口文件句柄 *@param databits 类型 int 数据位 取值 为 7 或者8 *@param stopbits 类型 int 停止位 取值为 1 或者2 *@param parity 类型 int 效验类型 取值为N,E,O,,S */ int set_Parity(int fd,int databits,int stopbits,int parity) { struct termios options; if ( tcgetattr( fd,&options) != 0) { perror("SetupSerial 1"); return(FALSE); } options.c_cflag &= ~CSIZE; switch (databits) /*设置数据位数*/ { case 7: options.c_cflag |= CS7; break; case 8: options.c_cflag |= CS8; break; default: fprintf(stderr,"Unsupported data size\n"); return (FALSE); } switch (parity) { case 'n': case 'N': options.c_cflag &= ~PARENB; /* Clear parity enable */ options.c_iflag &= ~INPCK; /* Enable parity checking */ break; case 'o': case 'O': options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/ options.c_iflag |= INPCK; /* Disnable parity checking */ break; case 'e': case 'E': options.c_cflag |= PARENB; /* Enable parity */ options.c_cflag &= ~PARODD; /* 转换为偶效验*/ options.c_iflag |= INPCK; /* Disnable parity checking */ break; case 'S': case 's': /*as no parity*/ options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB;break; default: fprintf(stderr,"Unsupported parity\n"); return (FALSE); } /* 设置停止位*/ switch (stopbits) { case 1: options.c_cflag &= ~CSTOPB; break; case 2: options.c_cflag |= CSTOPB; break; default: fprintf(stderr,"Unsupported stop bits\n"); return (FALSE); } /* Set input parity option */ if (parity != 'n') options.c_iflag |= INPCK; tcflush(fd,TCIFLUSH); options.c_cc[VTIME] =0; /* 设置超时15 seconds*/ options.c_cc[VMIN] = 22;/* Update the options and do it NOW */ if (tcsetattr(fd,TCSANOW,&options) != 0) { perror("SetupSerial 3"); return (FALSE); } return (TRUE); } int OpenDev(char *Dev) { int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY if (-1 == fd) { perror("Can't Open Serial Port"); return -1; } else return fd; } int main(int argc, char **argv){ int fd; int nread=0; char buff[22]; char command[22]; char *dev = "/dev/tts/1"; //串口二 fd = OpenDev(dev); set_speed(fd,115200); if (set_Parity(fd,8,1,'N') == FALSE) { printf("Set Parity Error\n"); exit (0); } tcflush(fd,TCIOFLUSH);清输入输出缓冲区 bzero(command,22);给command赋0值 command[0]=0x36; command[3]=0x07; command[10]=0x55; write(fd,command,sizeof(command)); sleep(1); tcflush(fd,TCIFLUSH);清缓冲区 while (1) //循环读取并打印数据 { while((nread = read(fd, buff, 22))>0) { printf("buff\n"); for(nread=0;nread<22;nread++) printf("%x ",buff[nread]); printf("\n"); } //sleep(1); } //close(fd); // exit (0); }
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
qzp机器人#1 · 2009/12/9
options.c_cc[VTIME] =0; /* 设置超时15 seconds*/ options.c_cc[VMIN] = 22;/* Update the options and do it NOW */ 设置的是收到22个字节才截止,不是22位 你的设置是否考虑了空格,回车? tcflush(fd,TCIOFLUSH);清输入输出缓冲区 最好在两个vwhile间加入