【发布时间】:2011-12-22 15:49:16
【问题描述】:
我正在尝试从 IEC 870-5-101 win32 协议模拟器发送的串行端口读取原始字节,该模拟器使用在 Linux 32 位上运行的 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 结构的端口。
感谢您的任何想法!
【问题讨论】:
-
我注意到您说“第二个 4 位是错误的……”但您的数据似乎只显示高位正在被清除。 (&0x7f)
-
我对命名约定有点困惑。当然,高位是错误的。谢谢你的澄清。
标签: c linux serial-port posix