从串口读取原始字节数据

11

我正在尝试使用C语言在Linux 32位系统上从串口读取IEC 870-5-101 win32协议模拟器发送的原始字节。

对于像0x00 - 0x7F这样的字节值,它能够正常工作。但是对于以0x80至0xAF开头的值,高位是错误的,例如:

0x7F -> 0x7F //correct
0x18 -> 0x18 //correct
0x79 -> 0x79 //correct
0x80 -> 0x00 //wrong
0xAF -> 0x2F //wrong
0xFF -> 0x7F //wrong

在研究了两天后,我仍然不知道是什么原因导致了这个问题。

这是我的串口配置:

    cfsetispeed(&config, B9600);
    cfsetospeed(&config, B9600);

    config.c_cflag |= (CLOCAL | CREAD);

    config.c_cflag &= ~CSIZE;                               /* Mask the character size bits */
    config.c_cflag |= (PARENB | CS8);                       /* Parity bit Select 8 data bits */

    config.c_cflag &= ~(PARODD | CSTOPB);                   /* even parity, 1 stop bit */


    config.c_cflag |= CRTSCTS;                              /*enable RTS/CTS flow control - linux only supports rts/cts*/


    config.c_iflag &= ~(IXON | IXOFF | IXANY);              /*disable software flow control*/ 

    config.c_oflag &= ~OPOST;                               /* enable raw output */
    config.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);      /* enable raw input */

    config.c_iflag &= ~(INPCK | PARMRK);                    /* DANGEROUS no parity check*/
    config.c_iflag |= ISTRIP;                               /* strip parity bits */
    config.c_iflag |= IGNPAR;                               /* DANGEROUS ignore parity errors*/

    config.c_cc[VTIME] = 1;                                 /*timeout to read a character in tenth of a second*/

我正在使用以下代码从串口读取数据:

*bytesread = read((int) fd, in_buf, BytesToRead);

在这个操作之后,“in_buf”包含错误的字节,所以我猜测我的配置有问题,这是从win32 DCB结构移植而来的。

感谢任何想法!


我注意到你说,“第二个四位是错误的...”但是你的数据似乎只显示高位被清除了。(&0x7f) - BRPocock
我对命名规范有点困惑。当然,高位是错误的。感谢澄清。 - punischdude
1个回答

14

根据你提供的示例,只有第8位(高位)是错误的,并且它总是0。在Linux端,您正在设置行规程中的ISTRIP,这将导致此问题。正如C代码中的注释所声称的那样,ISTRIP不会剥离奇偶校验位,而是剥离第8个数据位。

如果设置了ISTRIP,则有效输入字节将首先被剥离为7位;否则,将处理所有8位。 IEEE Std 1003.1, 2004 Edition, chapter 11, General Terminal Interface


感谢关于8E1的信息,我以前不知道。 - David K. Hess
一定要喜欢那些误导性的注释。 - Michael Burr
这个也把我咬了。不是因为注释(我从未看到)有误,而是因为它显然是默认值,在我看到的文档中根本没有提到这个标志。谢谢! - MickeyfAgain_BeforeExitOfSO
我的错。这可能是一个默认设置,但它是根据错误的文档在代码中设置的。 - MickeyfAgain_BeforeExitOfSO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接