ubuntu下串口编程备忘

前端之家收集整理的这篇文章主要介绍了ubuntu下串口编程备忘前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
弄了一下串口,一个小问题多折腾了下,备忘。
软件环境:
zl@zhanglong:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.4 LTS"
zl@zhanglong:~$uname -a
Linux zhanglong 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 17:37:58 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
硬件环境:
另有一台win7,有串口及读写串口的工具软件。两机通过交叉串口线相连

代码如下:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<string>
  3. #include<unistd<fcntl<errno<termios>

  4. /**
  5. *写/读数据
  6. /

  7. intmain(intargc,char*argv[])
  8. {
  9. inti;
  10. intfd;*File descriptorforthe port/
  11. intiRet;
  12. char buf[1024;

  13. fd=open"/dev/ttyS0"|O_NOCTTY|O_NDELAY);
  14. if(fd<0{error/
  15. printf"[%s-%d] open error!!!\n"__LINE__;
  16. goto err1}
  17. /fcntlFNDELAY;
  18. fcntl;

  19. iRet=write"a1b2c3\r"(iRet{
  20. printf"[%s-%d] write error!!!\n"}

  21. iRet=read1024for(i=0;i<iRet+{
  22. (&0xf="\n"}
  23. printf"0x%02x "[i fflush(fflush(stdout));
  24. ;

  25. close;
  26. err1:
  27. return 0}
编译运行此代码后发现:
win7能够收到ubuntu发出的数据,但win7发出的数据,自己意外收到了,而ubuntu却收不到。或有时能收到数据(如win7以十六进制发4567890a时,ubuntu能收到数据0x45 0x67 0xffffff89 0x0a)。
  将charbuf[1024]数组改成unsigned char buf[1024]后,0xffffff89变成了0x89。
  win7机器上单独发以十六进制,先发"7890a",ubuntu无打印输出,再发"457890a",ubuntu无打印输出,然后发"4567890a"时,ubuntu上的程序打印收到的数据,并且前面几次发出的都收到了。
  网上发现一说法, 如果不是终端使用Raw Mode方式来通讯。偿试将串口设置成Raw Mode,再读数据。

修改后的代码如下:

点击(此处)折叠或打开

*读数据
  • ;
  • struct termios options_old;
  • unsigned char buf;

  • /
  • Getthe current options./
  • tcgetattr&options;
  • options_old=optionsSetthe baud ratesto9600/cfsetispeed/cfsetospeed;

  • options.c_lflag&~(ICANON|ECHO|ECHOE|ISIG*Input/options.c_oflag|=OPOST*加工过的输出/
  • options~OPOST*选择原始输出/

  • *Enable the receiverandsetlocal mode.c_cflag(CLOCAL|CREADSetthe new options/
  • tcsetattr/

  • iRet;
  • fflush(stdout;

  • tcsetattr&options_old;
  • close}
  • 简单测试,发现win7每次发出数据,ubuntu一端都可以收到。并且win7一端没有再收到自己发出的数据。      但win7一次发出很长一段数据(如456789abcdef)时,ubuntu只收到前面的数据(0x34 0x35 0x36 0x37 0x38 0x39 0x61 0x62)。估计是串口速度慢,read()系统调用等不了那么长时间,接收到一部分数据后就返回了。 测试循环执行read()系统调用,并打印收到的数据,确实可以收到更多数据。 至此,问题已经清晰:ubuntu下的/dev/ttyS0设备打开时,默认设置了终端相关的特性,会根据收到不同的数据做出不同的反应。如果用作纯粹的数据传输通道,需要进行设置,去除终端相关特性设定。

    猜你在找的Ubuntu相关文章