Linux下读写UART串口的代码,从IBM Developer network上拿来的东西,操作比較的复杂,就直接跳过了,好在代码能用,记录一下~

两个实用的函数~

  1. ////////////////////////////////////////////////////////////////////////////////
  2. /**
  3. *@brief 设置串口通信速率
  4. *@param fd 类型 int 打开串口的文件句柄
  5. *@param speed 类型 int 串口速度
  6. *@return void
  7. */
  8. int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
  9. B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
  10. int name_arr[] = {115200, 38400, 19200, 9600, 4800, 2400, 1200, 300,
  11. 115200, 38400, 19200, 9600, 4800, 2400, 1200, 300, };
  12. void set_speed(int fd, int speed){
  13. int i;
  14. int status;
  15. struct termios Opt;
  16. tcgetattr(fd, &Opt);
  17. for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {
  18. if (speed == name_arr[i]) {
  19. tcflush(fd, TCIOFLUSH);
  20. cfsetispeed(&Opt, speed_arr[i]);
  21. cfsetospeed(&Opt, speed_arr[i]);
  22. status = tcsetattr(fd, TCSANOW, &Opt);
  23. if (status != 0) {
  24. perror("tcsetattr fd1");
  25. return;
  26. }
  27. tcflush(fd,TCIOFLUSH);
  28. }
  29. }
  30. }

  1. ////////////////////////////////////////////////////////////////////////////////
  2. /**
  3. *@brief 设置串口数据位,停止位和效验位
  4. *@param fd 类型 int 打开的串口文件句柄
  5. *@param databits 类型 int 数据位 取值 为 7 或者8
  6. *@param stopbits 类型 int 停止位 取值为 1 或者2
  7. *@param parity 类型 int 效验类型 取值为N,E,O,,S
  8. */
  9. int set_Parity(int fd,int databits,int stopbits,int parity)
  10. {
  11. struct termios options;
  12. if ( tcgetattr( fd,&options) != 0) {
  13. perror("SetupSerial 1");
  14. return(FALSE);
  15. }
  16. options.c_cflag &= ~CSIZE;
  17. switch (databits) /*设置数据位数*/
  18. {
  19. case 7:
  20. options.c_cflag |= CS7;
  21. break;
  22. case 8:
  23. options.c_cflag |= CS8;
  24. break;
  25. default:
  26. fprintf(stderr,"Unsupported data size\n"); return (FALSE);
  27. }
  28. switch (parity)
  29. {
  30. case 'n':
  31. case 'N':
  32. options.c_cflag &= ~PARENB; /* Clear parity enable */
  33. options.c_iflag &= ~INPCK; /* Enable parity checking */
  34. break;
  35. case 'o':
  36. case 'O':
  37. options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
  38. options.c_iflag |= INPCK; /* Disnable parity checking */
  39. break;
  40. case 'e':
  41. case 'E':
  42. options.c_cflag |= PARENB; /* Enable parity */
  43. options.c_cflag &= ~PARODD; /* 转换为偶效验*/
  44. options.c_iflag |= INPCK; /* Disnable parity checking */
  45. break;
  46. case 'S':
  47. case 's': /*as no parity*/
  48. options.c_cflag &= ~PARENB;
  49. options.c_cflag &= ~CSTOPB;break;
  50. default:
  51. fprintf(stderr,"Unsupported parity\n");
  52. return (FALSE);
  53. }
  54. /* 设置停止位*/
  55. switch (stopbits)
  56. {
  57. case 1:
  58. options.c_cflag &= ~CSTOPB;
  59. break;
  60. case 2:
  61. options.c_cflag |= CSTOPB;
  62. break;
  63. default:
  64. fprintf(stderr,"Unsupported stop bits\n");
  65. return (FALSE);
  66. }
  67. /* Set input parity option */
  68. if (parity != 'n')
  69. options.c_iflag |= INPCK;
  70. tcflush(fd,TCIFLUSH);
  71. options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/
  72. options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
  73. if (tcsetattr(fd,TCSANOW,&options) != 0)
  74. {
  75. perror("SetupSerial 3");
  76. return (FALSE);
  77. }
  78. options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
  79. options.c_oflag &= ~OPOST; /*Output*/
  80. return (TRUE);
  81. }

调用的方法比較的简单,例如以下。fd是打开的tty设备的文件句柄

  1. set_speed(fd,115200);
  2. if (set_Parity(fd,8,1,'N') == FALSE) {
  3. printf("Set Parity Error\n");
  4. }

总的測试代码例如以下。

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <termios.h>
  5. #include <stdio.h>
  6. #define BAUDRATE B115200
  7. #define UART_DEVICE "/dev/ttyS3"
  8. #define FALSE -1
  9. #define TRUE 0
  10. ////////////////////////////////////////////////////////////////////////////////
  11. /**
  12. *@brief 设置串口通信速率
  13. *@param fd 类型 int 打开串口的文件句柄
  14. *@param speed 类型 int 串口速度
  15. *@return void
  16. */
  17. int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
  18. B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
  19. int name_arr[] = {115200, 38400, 19200, 9600, 4800, 2400, 1200, 300,
  20. 115200, 38400, 19200, 9600, 4800, 2400, 1200, 300, };
  21. void set_speed(int fd, int speed){
  22. int i;
  23. int status;
  24. struct termios Opt;
  25. tcgetattr(fd, &Opt);
  26. for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {
  27. if (speed == name_arr[i]) {
  28. tcflush(fd, TCIOFLUSH);
  29. cfsetispeed(&Opt, speed_arr[i]);
  30. cfsetospeed(&Opt, speed_arr[i]);
  31. status = tcsetattr(fd, TCSANOW, &Opt);
  32. if (status != 0) {
  33. perror("tcsetattr fd1");
  34. return;
  35. }
  36. tcflush(fd,TCIOFLUSH);
  37. }
  38. }
  39. }
  40. ////////////////////////////////////////////////////////////////////////////////
  41. /**
  42. *@brief 设置串口数据位,停止位和效验位
  43. *@param fd 类型 int 打开的串口文件句柄
  44. *@param databits 类型 int 数据位 取值 为 7 或者8
  45. *@param stopbits 类型 int 停止位 取值为 1 或者2
  46. *@param parity 类型 int 效验类型 取值为N,E,O,,S
  47. */
  48. int set_Parity(int fd,int databits,int stopbits,int parity)
  49. {
  50. struct termios options;
  51. if ( tcgetattr( fd,&options) != 0) {
  52. perror("SetupSerial 1");
  53. return(FALSE);
  54. }
  55. options.c_cflag &= ~CSIZE;
  56. switch (databits) /*设置数据位数*/
  57. {
  58. case 7:
  59. options.c_cflag |= CS7;
  60. break;
  61. case 8:
  62. options.c_cflag |= CS8;
  63. break;
  64. default:
  65. fprintf(stderr,"Unsupported data size\n"); return (FALSE);
  66. }
  67. switch (parity)
  68. {
  69. case 'n':
  70. case 'N':
  71. options.c_cflag &= ~PARENB; /* Clear parity enable */
  72. options.c_iflag &= ~INPCK; /* Enable parity checking */
  73. break;
  74. case 'o':
  75. case 'O':
  76. options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
  77. options.c_iflag |= INPCK; /* Disnable parity checking */
  78. break;
  79. case 'e':
  80. case 'E':
  81. options.c_cflag |= PARENB; /* Enable parity */
  82. options.c_cflag &= ~PARODD; /* 转换为偶效验*/
  83. options.c_iflag |= INPCK; /* Disnable parity checking */
  84. break;
  85. case 'S':
  86. case 's': /*as no parity*/
  87. options.c_cflag &= ~PARENB;
  88. options.c_cflag &= ~CSTOPB;break;
  89. default:
  90. fprintf(stderr,"Unsupported parity\n");
  91. return (FALSE);
  92. }
  93. /* 设置停止位*/
  94. switch (stopbits)
  95. {
  96. case 1:
  97. options.c_cflag &= ~CSTOPB;
  98. break;
  99. case 2:
  100. options.c_cflag |= CSTOPB;
  101. break;
  102. default:
  103. fprintf(stderr,"Unsupported stop bits\n");
  104. return (FALSE);
  105. }
  106. /* Set input parity option */
  107. if (parity != 'n')
  108. options.c_iflag |= INPCK;
  109. tcflush(fd,TCIFLUSH);
  110. options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/
  111. options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
  112. if (tcsetattr(fd,TCSANOW,&options) != 0)
  113. {
  114. perror("SetupSerial 3");
  115. return (FALSE);
  116. }
  117. options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
  118. options.c_oflag &= ~OPOST; /*Output*/
  119. return (TRUE);
  120. }
  121. ////////////////////////////////////////////////////////////////////////////////
  122. int main(int argc, char *argv[])
  123. {
  124. int fd, c=0, res;
  125. char buf[256];
  126. printf("Start...\n");
  127. fd = open(UART_DEVICE, O_RDWR);
  128. if (fd < 0) {
  129. perror(UART_DEVICE);
  130. exit(1);
  131. }
  132. printf("Open...\n");
  133. set_speed(fd,115200);
  134. if (set_Parity(fd,8,1,'N') == FALSE) {
  135. printf("Set Parity Error\n");
  136. exit (0);
  137. }
  138. printf("Reading...\n");
  139. while(1) {
  140. res = read(fd, buf, 255);
  141. if(res==0)
  142. continue;
  143. buf[res]=0;
  144. printf("%s", buf);
  145. if (buf[0] == 0x0d)
  146. printf("\n");
  147. if (buf[0] == '@') break;
  148. }
  149. printf("Close...\n");
  150. close(fd);
  151. return 0;
  152. }

Linux下读写UART串口的代码的更多相关文章

  1. Linux下读写芯片的I2C寄存器

    要想在Linux下读写芯片的I2C寄存器,一般需要在Linux编写一份该芯片的I2C驱动,关于Linux下如何编写I2C驱动,前一篇文章<手把手教你写Linux I2C设备驱动>已经做了初 ...

  2. linux下的qt串口通信

    1.linux下的qt串口通信跟windows唯一的差别就是端口号的名字,windows下面是COM,而linux是ttyUSB0的路径 2.一般情况下linux插上USB转串口线就可以在/dev/目 ...

  3. SSL握手通信详解及linux下c/c++ SSL Socket代码举例

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例 摘自:http://www.169it.com/article/3215130236.html   分享到:8     发布时 ...

  4. SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...

  5. Linux下9种优秀的代码比对工具推荐

    大家好,我是良许. 在我们编写代码的时候,我们经常需要知道两个文件之间,或者同一个文件不同版本之间有什么差异性.在 Windows 下有个很强大的工具叫作 BeyondCompare ,那在 Linu ...

  6. linux下怎样对串口编程

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

  7. Linux下ffmpeg添加Facebook/transform代码块实现将全景视频的球模型转换成立方体模型

    Facebook事实上已开始在平台中支持360度全景视频的流播,但公司对此并不满足.其工程师更是基于锥体几何学设计出了一套全新的视频编码,号称最高能将全景视频的文件大小减少80%.(VR最新突破:全景 ...

  8. linux下使用gcc/g++编译代码时gets函数有错误

    今天在linux中使用个g++编译一个名为myfirst.cpp的代码的时候,出现如下错误 myfirst.cpp: In function ‘int main()’:myfirst.cpp:11:2 ...

  9. Linux下读写寄存器

    arm裸机下读写寄存器很容易,各个寄存器和内存的地址是单一地址空间,他们是用相同的指令进行读写操作的.而在linux下就要复杂很多,因为linux支持多个体系架构的CPU.比如arm和x86就不一样, ...

随机推荐

  1. 解决CentOS“Zabbix discoverer processes 75% busy”的问题

    解决CentOS“Zabbix discoverer processes 75% busy”的问题 运维  立杰  4年前 (2014-08-11)  1104℃  0评论 在使用Zabbix过程中, ...

  2. iscroll 上拉加载和下拉刷新

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  3. 常见的HTTP状态码详细解析

    http状态码分为五类 : 1XX 信息 服务器收到请求,需要请求者继续操作 2XX 成功 请求被成功接手并返回给请求者 3XX 重定向 需要进一步操作才能完成请求 4XX 客户端错误 请求包含语法错 ...

  4. UltraISO刻录CentOS 7安装指南

    CentOS 7.2 安装指南(U盘版) 一.准备阶段 1.下载CentOS7镜像文件(ISO文件)到自己电脑,官网下载路径: http://isoredirect.centos.org/centos ...

  5. java基础之Math类

    Math类概述Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数. 成员方法 public static int abs(int a):绝对值 public static ...

  6. ftp文件上传下载命令

    介绍:从本地以用户wasqry登录的机器1*.1**.21.67上通过ftp远程登录到ftp服务器上,登录用户名是lte****,以下为使用该连接做的实验.  查看远程ftp服务器上用户lte**** ...

  7. spark编程入门-idea环境搭建

    原文引自:http://blog.csdn.net/huanbia/article/details/69084895 1.环境准备 idea采用2017.3.1版本. 创建一个文件a.txt 2.构建 ...

  8. 【论文翻译】NIN层论文中英对照翻译--(Network In Network)

    [论文翻译]NIN层论文中英对照翻译--(Network In Network) [开始时间]2018.09.27 [完成时间]2018.10.03 [论文翻译]NIN层论文中英对照翻译--(Netw ...

  9. PKUWC&SC 2018 刷题记录

    PKUWC&SC 2018 刷题记录 minimax 线段树合并的题,似乎并不依赖于二叉树. 之前写的草率的题解在这里:PKUWC2018 minimax Slay the Spire 注意到 ...

  10. List--列表合成

    1,基本规则是,一对中括号里面包含一个表达式,表达式里可以有for语句,还可以有分支的for或者if语句. 2,例如: 3,列表合成可以快速地合并多个列表. 例如: 当然还可以直接加:[1, 2, 3 ...