关于串口的碎碎念

最近总在用串口,pic的,51的,arm的,linux串口驱动和应用编程.擦晕啊….

裸驱一般比较容易,参照ref和datasheet几乎都能搞定.

linux的串口驱动较为麻烦,慎入.总体来说需要对linux的字符终端驱动设备有较好的理解.

linux应用编程,额,设置项多而且杂,嗨,麻烦.

先推荐几篇文章(linux串口编程):

(1).《Linux Serial HOWTO 中譯版》,浏览地址:http://linux.cis.nctu.edu.tw/chinese/how-to/Serial-HOWTO.html。以及众多这个版本的摘选,内容是大同小异的。

(2).Serial Programming Guide for POSIX Operating Systems(必看)

(3). 串口的例子,http://www.comptechdoc.org/os/linux/programming/c/linux_pgcserial.html有点小复杂,慢慢啃吧

最后发现,其实串口编程麻烦的地方就是串口属性的设置。

而归纳一下,属性也就下面这么几个:

c_cflag Control options

c_lflag Line options

c_iflag Input options

c_oflag Output options

c_cc Control characters

c_ispeed Input baud (new interface)

c_ospeed Output baud (new interface)

关键是理解有那些属性参数可以设置以及是什么意思。

在做arm和cc2431的通讯时候,比较蛋疼的除了各种乱码(与正常字符夹杂),开始以为是电平或者流控的问题,排查了好几天,突然看到网上说到的两点设置,在实际中的情况往往是很多特例。

(1).在用write发送数据时没有键入回车,信息就将发送不出去的情况.这主要是因为我们在输出输入时是按照 规范模式接受到回车或者换行才发送,而很多情况我们是不需要回车和换行的,这时,应当切换到行方式输入,设置options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);不经处理直接发送。

(2).在我们发送字符0x0d的时候,往往接受端得到的字符是0x0a 这是怎么回事.原因是在串口设置中c_iflag和c_oflag中存在从NL-CR 和CR-NL的映射,也就是说,串口可以把回车和换行看成一个字符,所以,此时我们应该屏蔽掉这些,用options.c_oflag &=~(INLCR|IGNCR|ICRNL|);和options.c_oflag &=~(ONLCR|OCRNL); 进行设置。

呵呵,修改之后,发现确实很给力的解决了乱码问题。

总之,串口的设置是很复杂也很麻烦的东西,具体情况要具体分析,找到相应的办法,如果发现数据不能传送,不妨耐点心在串口设置上找答案.


原文地址:https://www.cnblogs.com/yixiaoyang/p/2067424.html