首页 文章

从串口读取原始字节

提问于
浏览
11

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

它适用于像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结构的端口 .

谢谢你的任何想法!

1 回答

  • 14

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

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

相关问题