2018年6月28日星期四

串口通信中的INPCK和ISTRIP标志位

网上有很多软件开发方面的教程,真的很感谢那些人。有时候工作需要用到一块知识,在网上看教程是最快的,比买书还快还省钱。开始写博客的我,深知写这些教程的不易。这类教程很多,往往同一个主题有很多类似的文章。不过这些文章的水平也良莠不齐,同一个主题一定要多看几篇文章,互相参照。
前段时间我要写Linux下的串口初始化的函数,就在网上找了几篇文章学习,并主要参考了一篇认为写得不错的文章,copy了他的例程中的部分代码。其中有一句代码,
options.c_iflag &= !INPCK;
不论串口参数怎么配置,他都把这个INPCK的标志位关闭。我对此深信不疑,也没有深究,直到前几天看一本书,书中正好讲到串口参数配置这个地方的时候,不论串口参数怎么配置,他都有一句
newtio.c_iflag |= (INPCK | ISTRIP);
这引起了我的注意。到底这个INPCK标志位应该打开还是关闭,还有这个ISTRIP标志位为什么都要打开,而之前那个人根本就没操作这个标志位?
于是查资料、做实验,最终弄明白了这两个标志位。
INPCK指的是是否对输入进行奇偶校验。PARENB标志位只是“告诉”了串口有奇偶校验,但是别人发来的数据是否要进行校验,则是看这个标志位是不是打开。没有打开INPCK的话,发送方加了校验或者不加校验,我们要配置的这个串口都不关注,只看数据位是什么。如果打开了INPCK,而发送方的数据和校验不一致,我们要配置的这个串口将会把这个字节置为0;只有校验一致,我们才会正确接收。
ISTRIP指的是是否丢掉8位数据位的最高比特。如果打开了这个标志位,则不论数据位的最高一个bit是1还是0,则一律置为0。比如你的串口接收到了一个字节是0xFF, 如果打开了ISTRIP标志位,那你只能从串口中读到0x7F.打开这个标志位,如果只是传输ASCII字符,那不会有问题,而且可以一定程度上防止乱码。但如果传输的数据不仅仅有ASCII字符,那麻烦就大了。

没有评论:

发表评论