从串行端口读取原始字节

时间:2021-02-06 00:03:50

I'm trying to read raw bytes from a serial port sent by a IEC 870-5-101 win32 protocol simulator with a program written in C running on Linux 32bit.

我正在尝试从IEC 870-5-101 win32协议模拟器发送的串行端口读取原始字节,并使用在Linux 32bit上运行的C编写的程序。

It's working fine for byte values like 0x00 - 0x7F. But for values beginning from 0x80 to 0xAF the high bit is wrong, e.g.:

它适用于像0x00 - 0x7F这样的字节值。但是对于从0x80到0xAF开始的值,高位是错误的,例如:

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

After digging around for two days now, I have no idea, what's causing this.

经过两天的挖掘,我不知道是什么造成了这种情况。

This is my config of the serial port:

这是我的串口配置:

    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*/

I'm reading from the serial port with:

我正在从串口读取:

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

Right after this operation "in_buf" contains the wrong byte, so I guess there's something wrong with my config, which is a port from a win32 DCB structure.

在此操作之后“in_buf”包含错误的字节,所以我猜我的配置有问题,这是来自win32 DCB结构的端口。

Thanks for any ideas!

谢谢你的任何想法!

1 个解决方案

#1


14  

Based on your examples, only the 8th bit (the high bit) is wrong, and it's wrong by being always 0. You are setting ISTRIP in your line discipline on the Linux side, and that would cause this. ISTRIP does not, as the comment in the C code claims, strip parity bits. It strips the 8th data bit.

根据您的示例,只有第8位(高位)是错误的,并且总是为0是错误的。您在Linux端的线路规则中设置了ISTRIP,这将导致这种情况。正如C代码中的评论所述,ISTRIP不会剥离奇偶校验位。它剥离了第8个数据位。

If ISTRIP is set, valid input bytes shall first be stripped to seven bits; otherwise, all eight bits shall be processed. IEEE Std 1003.1, 2004 Edition, chapter 11, General Terminal Interface

如果设置了ISTRIP,则应首先将有效输入字节剥离为7位;否则,应处理所有八个比特。 IEEE Std 1003.1,2004版,第11章,通用终端接口

#1


14  

Based on your examples, only the 8th bit (the high bit) is wrong, and it's wrong by being always 0. You are setting ISTRIP in your line discipline on the Linux side, and that would cause this. ISTRIP does not, as the comment in the C code claims, strip parity bits. It strips the 8th data bit.

根据您的示例,只有第8位(高位)是错误的,并且总是为0是错误的。您在Linux端的线路规则中设置了ISTRIP,这将导致这种情况。正如C代码中的评论所述,ISTRIP不会剥离奇偶校验位。它剥离了第8个数据位。

If ISTRIP is set, valid input bytes shall first be stripped to seven bits; otherwise, all eight bits shall be processed. IEEE Std 1003.1, 2004 Edition, chapter 11, General Terminal Interface

如果设置了ISTRIP,则应首先将有效输入字节剥离为7位;否则,应处理所有八个比特。 IEEE Std 1003.1,2004版,第11章,通用终端接口