弄了一下串口,一个小问题多折腾了下,备忘。
软件环境:
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.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <errno.h>
  6. #include <termios.h>
  7. /**
  8. * 写/读数据
  9. **/
  10. int main(int argc, char* argv[])
  11. {
  12. int i;
  13. int fd; /* File descriptor for the port */
  14. int iRet;
  15. char buf[1024];
  16. fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
  17. if (fd < 0) { /** error **/
  18. printf("[%s-%d] open error!!!\n", __FILE__, __LINE__);
  19. goto err1;
  20. }
  21. //fcntl(fd, F_SETFL, FNDELAY);
  22. fcntl(fd, F_SETFL, 0);
  23. iRet = write(fd, "a1b2c3\r", 7);
  24. if (iRet < 0) {
  25. printf("[%s-%d] write error!!!\n", __FILE__, __LINE__);
  26. }
  27. iRet = read(fd, buf, 1024);
  28. for(i = 0; i < iRet; i++) {
  29. if((i & 0xf) == 0) {
  30. printf("\n");
  31. }
  32. printf("0x%02x ", buf[i]);
  33. fflush( fflush(stdout));
  34. }
  35. printf("\n");
  36. close(fd);
  37. err1:
  38. return 0;
  39. }

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

    修改后的代码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <errno.h>
  6. #include <termios.h>
  7. /**
  8. * 读数据
  9. **/
  10. int main(int argc, char* argv[])
  11. {
  12. int i;
  13. int fd; /* File descriptor for the port */
  14. int iRet;
  15. struct termios options_old, options;
  16. unsigned char buf[1024];
  17. fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
  18. if (fd < 0) { /** error **/
  19. printf("[%s-%d] open error!!!\n", __FILE__, __LINE__);
  20. goto err1;
  21. }
  22. //fcntl(fd, F_SETFL, FNDELAY);
  23. fcntl(fd, F_SETFL, 0);
  24. /*********************************************************/
  25. /** * Get the current options for the port... **/
  26. tcgetattr(fd, &options);
  27. options_old = options;
  28. /*** Set the baud rates to 9600... **/
  29. // cfsetispeed(&options, B9600);
  30. // cfsetospeed(&options, B9600);
  31. options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
  32. //options.c_oflag |= OPOST; /** 加工过的输出 **/
  33. options.c_oflag &= ~OPOST; /** 选择原始输出 **/
  34. /*** Enable the receiver and set local mode... **/
  35. // options.c_cflag |= (CLOCAL | CREAD);
  36. /*** Set the new options for the port... **/
  37. tcsetattr(fd, TCSANOW, &options);
  38. /*********************************************************/
  39. iRet = write(fd, "a1b2c3\r", 7);
  40. if (iRet < 0) {
  41. printf("[%s-%d] write error!!!\n", __FILE__, __LINE__);
  42. }
  43. iRet = read(fd, buf, 1024);
  44. for(i = 0; i < iRet; i++) {
  45. if((i & 0xf) == 0) {
  46. printf("\n");
  47. }
  48. printf("0x%02x ", buf[i]);
  49. fflush(stdout);
  50. }
  51. printf("\n");
  52. tcsetattr(fd, TCSANOW, &options_old);
  53. close(fd);
  54. err1:
  55. return 0;
  56. }

简单测试,发现win7每次发出数据,ubuntu一端都可以收到。并且win7一端没有再收到自己发出的数据。
     但win7一次发出很长一段数据(如456789abcdef)时,ubuntu只收到前面的数据(0x34 0x35 0x36 0x37 0x38 0x39 0x61 0x62)。估计是串口速度慢,read()系统调用等不了那么长时间,接收到一部分数据后就返回了。
               测试循环执行read()系统调用,并打印收到的数据,确实可以收到更多数据。

至此,问题已经清晰:ubuntu下的/dev/ttyS0设备打开时,默认设置了终端相关的特性,会根据收到不同的数据做出不同的反应。如果用作纯粹的数据传输通道,需要进行设置,去除终端相关特性设定。

ubuntu下串口编程备忘的更多相关文章

  1. t420 win7 硬盘安装ubuntu 10.04 LTS 备忘

    http://zhangwen.sinaapp.com/?p=5 t420 win7 硬盘安装ubuntu 10.04 LTS 备忘 发表于 2011 年 10 月 25 日 对ubuntu的新版没有 ...

  2. Windows下串口编程

     造冰箱的大熊猫@cnblogs 2019/1/27 将Windows下串口编程相关信息进行下简单小结,以备后用. 1.打开串口 打开串口使用CreateFile()函数.以打开COM6为例: HAN ...

  3. ubuntu下C编程,编译基础( 转)

    buntu下C编程,编译基础     C 编程中相关文件后缀 .a 静态库 (archive) .c C源代码(需要编译预处理) .h C源代码头文件 .i C源代码(不需编译预处理) .o 对象文件 ...

  4. Linux下串口编程【转】

    本文转载自:http://blog.csdn.net/w282529350/article/details/7378388 /************声明:本人只是见到这篇文章对我帮助很大才转载的,但 ...

  5. Linux下串口编程入门

    简介: Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍. 串口简介  串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用 ...

  6. ubuntu和raspberry下调试python_spi备忘

    Ubuntu12.04 自安装python3.3中头文件Python.h路径:usr/local/python3.3/include/python3.3m Ubuntu12.04 自带的Python2 ...

  7. ubuntu 下串口调试工具 minicom安装与配置cutecom安装

    安装minicom:     $sudo apt-get install minicom 配置minicom:    如果您的系统的默认语言不是英文,请执行下面的命令:     $LANG=EN    ...

  8. Xeon Phi 编程备忘

    ▶ 闲鱼的 Xeon Phi 3120A 配办公室的新 Xeon 服务器,记录一下环境安装过程. ● 原本尝试搭 Ubuntu 服务器,参考[https://software.intel.com/en ...

  9. ubuntu 下串口调试工具 minicom安装与配置

    检查系统是否支持USB转串口: lsmod | grep usbserial 如果有usbserial,说明系统支持USB转串口. 识别串口设备: 插上USB转串口,在终端输入命令: #dmesg | ...

随机推荐

  1. Call to undefined function mysql_connect()错误原因

    从PHP5.0开始就不推荐使用mysql_connect()函数,到了php7.0则直接废弃了该函数,替代的函数是: mysqli_connect();

  2. JAVA并发编程学习笔记------线程的三种创建方式

    创建线程一般有如下几个方式: 1. 通过继承Thread类来创建一个线程: /** * 步骤1:定义一个继承Thread类的子类 * 步骤2:构造子类的一个对象 * 步骤3:启动线程: * */ pu ...

  3. 00_Python面试题_迭代更新

    一.Python是什么类型的语言,以及和其他语言对比 1.Python是一种解释性语言,他和C语言以及C衍生的语言不通,在Python运行之前不需要编译,其他解释语言还有Ruby.PHP. 2.Pyt ...

  4. virtualbox创建虚拟机及增加硬盘记录

    创建虚拟机 jken01VBoxManage createvm --name "jken01" --basefolder /data/virtualDir/jken01 --reg ...

  5. Swing小技巧总结

    1. 使JDialog位于屏幕的中央 public void setToScreenCenter(JDialog jd) {           Dimension screenSize = Tool ...

  6. ant基础[转]

    原文链接:http://www.cnblogs.com/wufengxyz/archive/2011/11/24/2261797.html 1,什么是antant是构建工具2,什么是构建概念到处可查到 ...

  7. Codeforces 250 E. The Child and Binary Tree [多项式开根 生成函数]

    CF Round250 E. The Child and Binary Tree 题意:n种权值集合C, 求点权值和为1...m的二叉树的个数, 形态不同的二叉树不同. 也就是说:不带标号,孩子有序 ...

  8. ASP.NET Core 入门

    关于ASP.NET Core ASP.NET Core 是一个全新的开源.跨平台框架,可以用它来构建基于网络连接的现代云应用程序,比如:Web 应用,IoT(Internet Of Things,物联 ...

  9. Bootstrap+Vue.js 练习入门一

    一. 效果如下图所示,输入用户名和年龄,点击添加,数据会自动添加到下面的用户信息表内.当没有数据时,用户信息表显示:暂无数据……,当有数据时,显示 删除全部 按钮,这里为了方便快捷,我没有做删除按钮的 ...

  10. pip install 提示"no previously-included directories found matching"及"no previously-included files matching found anywhere in distribution",且偶发无法关联安装 PyPI 库的故障

    环境描述: Python 2.7.5 CentOS-7.2   报错现象: (1).在虚拟环境下运行 pip install 命令安装 PyPI 第三方库,出现类似如下告警. Running setu ...