• 关于串口的碎碎念


    最近总在用串口,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); 进行设置。

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

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


  • 相关阅读:
    二维数组中的查找
    循环语句
    掷骰子游戏和条件语句
    类型转换与键盘输入
    运算符(2)
    运算符(1)
    面向对象(2)
    面向对象(1)
    理解几种排序方法
    优盘、移动硬盘简便制作启动盘
  • 原文地址:https://www.cnblogs.com/yixiaoyang/p/2067424.html
Copyright © 2020-2023  润新知