从串口读取原始字节

我试图从一个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 

现在挖了两天后,我不知道是什么原因造成的。

这是我的串口configuration:

  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”包含错误的字节,所以我想我的configuration出了问题,这是一个win32 DCB结构的端口。

感谢您的任何想法!

Solutions Collecting From Web of "从串口读取原始字节"

根据你的例子,只有第8位(高位)是错误的,并且总是为0是错误的。你在Linux端设置ISTRIP在你的线上,这会导致这种情况。 正如C代码中的评论所言,ISTRIP并没有去掉奇偶校验位。 它剥离第8个数据位。

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