转自:http://putstar.21ic.org/user1/1505/archives/2008/54316.html
linux的串口总感觉有些怪异, 首先是只支持七位数据,不支持8O1/8E1这样的数据格式;另外在使用中还发现收到的0x0D都变成了0x0A(8O1,raw mode)。下面是一些可以参考的链接:
user1/2613/archives/2008/48341.html
经查是串口参数设置的问题, 不过我在确定错误的时候弄错了一点:不是0x0c而是0x0d被映射成了0x0A(要是早知道是0x0d就没这么麻烦了,看来以后要更仔细才行).循着0x0d(CR)->0x0a(NL)的映射一找,就找到了错误所在.把代码贴出来分享吧:
tcgetattr( fd, &Opt );
Opt.c_cflag = (PARENB | PARODD | CS8 | CREAD | CLOCAL);
Opt.c_cflag &= ~CRTSCTS; /* disable hw flow ctrl */
Opt.c_cflag &= ~CSTOPB; /* 1 stop bit */
Opt.c_iflag &= ~(IXON | IXOFF | IXANY); // Disable sw flow ctrl
Opt.c_iflag |= INPCK; /* enable parity checking */
Opt.c_iflag &= ~ISTRIP; /* don't strip bit7 */
Opt.c_iflag &= ~(ICRNL | PARMRK | IGNCR | IUCLC); /* don't map CR to NL */
cfsetispeed( &Opt, B38400 ); /* 设置为 38400 bps */
cfsetospeed( &Opt, B38400 ); /* 只有很少的硬件支持输入/输出波特率不同 */
tcflush( fd, TCIOFLUSH );
Opt.c_cc[VTIME] = 5; /* 设置超时 500 ms */
Opt.c_cc[VMIN] = 0;
/* for raw mode */
Opt.c_lflag &= ~( ICANON | ECHO | ECHOE | ISIG ); /* Input */
Opt.c_oflag &= ~OPOST; /* Output */
程序中的红字是解决这一问题的关键。修改后程序收发数据完全正常。