2011-12-22 106 views
11

我试图从一个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结构的端口。

感谢您的任何想法!

+0

我注意到你说“第二个4位是错的......”但你的数据似乎只显示高位被清除。 (&0x7f) – BRFennPocock 2011-12-22 15:59:28

+0

我对命名约定有点困惑。当然,最高位是错误的。 Thx的澄清。 – punischdude 2011-12-22 16:40:37

回答

14

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

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

+0

感谢有关8E1的信息。从来不知道。 – 2011-12-22 16:31:56

+0

谢谢! 'config.c_iflag&=〜ISTRIP;'搞定了。 – punischdude 2011-12-22 16:37:04

+0

得爱这些误导评论。 – 2011-12-22 16:51:22