首页 > 系统相关 >Linux 串口读取

Linux 串口读取

时间:2023-11-01 14:11:05浏览次数:34  
标签:opt set cflag 读取 int 串口 fd Linux include

https://blog.csdn.net/wabil/article/details/118610070

  1. #include <stdlib.h>
  2. #include <fcntl.h>
  3. #include "stdio.h"
  4. #include "termios.h"
  5. #include "unistd.h"
  6. #include "limits.h"
  7. #include <stdint.h>
  8. #include "time.h"
  9. //===================
  10. #include <sys/select.h>
  11. #include <sys/time.h>
  12. //===================
  13. #define UART_DEV "/dev/ttyUSB0" //根据电脑插入的串口号定义
  14. void main()
  15. {
  16. int fd =0;
  17. int RxLen=0;
  18. uint8_t RxBuff[1024]={0};
  19. //==========串口打开============//
  20. fd = open(UART_DEV ,O_RDWR|O_NOCTTY);
  21. if(fd<0){
  22. printf("COM (%s) Open Fail ! \n",UART_DEV); //必须要权限.
  23. return;
  24. }
  25. printf("COM (%s) Open Success ! Watting recv...\n\n",UART_DEV);
  26. //==========配置串口============//
  27. struct termios opt; //配置串口的属性定义在结构体struct termios中
  28. tcgetattr(fd, & opt); //获取终端控制属性
  29. cfsetispeed(& opt, B115200); //指定输入波特率(若不设置系统默认9600bps)
  30. cfsetospeed(& opt, B115200); //指定输出波特率(若不设置系统默认9600bps)
  31. /* c_lflag 本地模式 */
  32. opt.c_cflag &= ~ INPCK; //不启用输入奇偶检测
  33. opt.c_cflag |= (CLOCAL | CREAD); //CLOCAL忽略 modem 控制线,CREAD打开接受者
  34. /* c_lflag 本地模式 */
  35. opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //ICANON启用标准模式;ECHO回显输入字符;ECHOE如果同时设置了 ICANON,字符 ERASE 擦除前一个输入字符,WERASE 擦除前一个词;ISIG当接受到字符 INTR, QUIT, SUSP, 或 DSUSP 时,产生相应的信号
  36. /* c_oflag 输出模式 */
  37. opt.c_oflag &= ~ OPOST; //OPOST启用具体实现自行定义的输出处理
  38. opt.c_oflag &= ~(ONLCR | OCRNL); //ONLCR将输出中的新行符映射为回车-换行,OCRNL将输出中的回车映射为新行符
  39. /* c_iflag 输入模式 */
  40. opt.c_iflag &= ~(ICRNL | INLCR); //ICRNL将输入中的回车翻译为新行 (除非设置了 IGNCR),INLCR将输入中的 NL 翻译为 CR
  41. opt.c_iflag &= ~(IXON | IXOFF | IXANY); //IXON启用输出的 XON/XOFF流控制,IXOFF启用输入的 XON/XOFF流控制,IXANY(不属于 POSIX.1;XSI) 允许任何字符来重新开始输出
  42. /* c_cflag 控制模式 */
  43. opt.c_cflag &= ~ CSIZE; //字符长度掩码,取值为 CS5, CS6, CS7, 或 CS8,加~就是无
  44. opt.c_cflag |= CS8; //数据宽度是8bit
  45. opt.c_cflag &= ~ CSTOPB; //CSTOPB设置两个停止位,而不是一个,加~就是设置一个停止位
  46. opt.c_cflag &= ~ PARENB; //PARENB允许输出产生奇偶信息以及输入的奇偶校验,加~就是无校验
  47. /* c_cc[NCCS] 控制字符 */
  48. opt.c_cc[VTIME] = 0 ; //等待数据时间(10秒的倍数),每个单位是0.1秒 若20就是2秒
  49. opt.c_cc[VMIN] = 0 ; //最少可读数据,非规范模式读取时的最小字符数,设为0则为非阻塞,如果设为其它值则阻塞,直到读到到对应的数据,就像一个阀值一样,比如设为8,如果只接收到3个数据,那么它是不会返回的,只有凑齐8个数据后一齐才READ返回,阻塞在那儿
  50. /* new_cfg.c_cc[VMIN] = 8;//DATA_LEN;
  51. new_cfg.c_cc[VTIME] = 20;//每个单位是0.1秒 20就是2秒
  52. 如果这样设置,就完全阻塞了,只有串口收到至少8个数据才会对READ立即返回,或才少于8个数据时,超时2秒也会有返回
  53. 另外特别注意的是当设置VTIME后,如果read第三个参数小于VMIN ,将会将VMIN 修改为read的第三个参数*/
  54. /*TCIFLUSH 刷清输入队列
  55. TCOFLUSH 刷清输出队列
  56. TCIOFLUSH 刷清输入、输出队列*/
  57. tcflush(fd, TCIOFLUSH); //刷串口清缓存
  58. tcsetattr(fd, TCSANOW, &opt); //设置终端控制属性,TCSANOW:不等数据传输完毕就立即改变属性
  59. while(1)
  60. {
  61. //==========串口接收(字符串)============//
  62. while( ((RxLen = read(fd, RxBuff,sizeof(RxBuff))) > 0) )
  63. {
  64. RxBuff[RxLen] = 0;
  65. printf( "%s",RxBuff);
  66. }
  67. }
  68. }

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/types.h>
  5. #include <fcntl.h>
  6. #include <termios.h>
  7. #include <unistd.h>
  8. /**
  9. * @brief set_baudrate 设置波特率
  10. * @param opt
  11. * @param baudrate
  12. */
  13. static void set_baudrate (struct termios *opt, unsigned int baudrate)
  14. {
  15. cfsetispeed(opt, baudrate);
  16. cfsetospeed(opt, baudrate);
  17. }
  18. /**
  19. * @brief set_data_bit 设置数据位
  20. * @param opt
  21. * @param databit
  22. */
  23. static void set_data_bit (struct termios *opt, unsigned int databit)
  24. {
  25. opt->c_cflag &= ~CSIZE;
  26. switch (databit) {
  27. case 8:
  28. opt->c_cflag |= CS8;
  29. break;
  30. case 7:
  31. opt->c_cflag |= CS7;
  32. break;
  33. case 6:
  34. opt->c_cflag |= CS6;
  35. break;
  36. case 5:
  37. opt->c_cflag |= CS5;
  38. break;
  39. default:
  40. opt->c_cflag |= CS8;
  41. break;
  42. }
  43. }
  44. /**
  45. * @brief set_parity 设置奇偶校验位
  46. * @param opt
  47. * @param parity
  48. */
  49. static void set_parity (struct termios *opt, char parity)
  50. {
  51. switch (parity) {
  52. case 'N': /* no parity check */
  53. opt->c_cflag &= ~PARENB;
  54. break;
  55. case 'E': /* even */
  56. opt->c_cflag |= PARENB;
  57. opt->c_cflag &= ~PARODD;
  58. break;
  59. case 'O': /* odd */
  60. opt->c_cflag |= PARENB;
  61. opt->c_cflag |= ~PARODD;
  62. break;
  63. default: /* no parity check */
  64. opt->c_cflag &= ~PARENB;
  65. break;
  66. }
  67. }
  68. /**
  69. * @brief set_stopbit 设置停止位
  70. * @param opt
  71. * @param stopbit
  72. */
  73. static void set_stopbit (struct termios *opt, const char *stopbit)
  74. {
  75. if (0 == strcmp (stopbit, "1")) {
  76. opt->c_cflag &= ~CSTOPB; /* 1 stop bit */
  77. } else if (0 == strcmp (stopbit, "1")) {
  78. opt->c_cflag &= ~CSTOPB; /* 1.5 stop bit */
  79. } else if (0 == strcmp (stopbit, "2")) {
  80. opt->c_cflag |= CSTOPB; /* 2 stop bits */
  81. } else {
  82. opt->c_cflag &= ~CSTOPB; /* 1 stop bit */
  83. }
  84. }
  85. int set_port_attr (
  86. int fd,
  87. int baudrate, // B1200 B2400 B4800 B9600 .. B115200
  88. int databit, // 5, 6, 7, 8
  89. const char *stopbit, // "1", "1.5", "2"
  90. char parity, // N(o), O(dd), E(ven)
  91. int vtime,
  92. int vmin )
  93. {
  94. struct termios opt;
  95. tcgetattr(fd, &opt);
  96. //设置波特率
  97. set_baudrate(&opt, baudrate);
  98. opt.c_cflag |= CLOCAL | CREAD; /* | CRTSCTS */
  99. //设置数据位
  100. set_data_bit(&opt, databit);
  101. //设置校验位
  102. set_parity(&opt, parity);
  103. //设置停止位
  104. set_stopbit(&opt, stopbit);
  105. //其它设置
  106. opt.c_oflag = 0;
  107. opt.c_lflag |= 0;
  108. opt.c_oflag &= ~OPOST;
  109. opt.c_cc[VTIME] = vtime;
  110. opt.c_cc[VMIN] = vmin;
  111. tcflush (fd, TCIFLUSH);
  112. return (tcsetattr (fd, TCSANOW, &opt));
  113. }
  114. int main(int argc, char **argv)
  115. {
  116. printf("=========BuildTime:[%s %s]============\n",__DATE__,__TIME__ );
  117. //通过指令 ls /dev/* 查看电脑硬件设备
  118. //一般 ttyS0 等价于Windows的COM1 ,以此类推
  119. //可用MobaXterm软件在Windows下运行linux程序
  120. char *devPath = "/dev/ttyS25";
  121. int fd = open(devPath ,O_RDWR);
  122. long baud = 115200;
  123. if(fd < 0){
  124. printf("[ERROR] uart [%s] open file failed .", devPath );
  125. return -1;
  126. }
  127. set_port_attr(fd,baud,8,"N",'1',0,0);
  128. printf("uart [%s] open sucess,baud=%d bps.\n",devPath , baud );
  129. char buf[1024*5] = {0};
  130. int max_size = sizeof(buf);
  131. int len = 0;
  132. while(1) //Ctrl+C 结束终端
  133. {
  134. memset(buf,0,max_size);
  135. len = read(fd, buf,max_size);
  136. if(len<=0)
  137. {
  138. usleep(1000);
  139. continue;
  140. }
  141. printf("Length:%d,Text:%s\r\n",len,buf);
  142. //printf("%s",buf);
  143. }
  144. close( fd );
  145. printf("Quit main program.\n");
  146. }

标签:opt,set,cflag,读取,int,串口,fd,Linux,include
From: https://www.cnblogs.com/mkmkbj/p/17802977.html

相关文章

  • java使用ImageIO读取CMYK图片转存为RGB图片在本地和线上表现不同的问题
    项目里有jpg图片是CMYK颜色模式,需要转成RGB颜色模式,我使用的方法简单粗暴,就是利用ImageIO转存一下,在我的本地正常。但是丢到服务器上就有问题了,色差很大。不知道是什么情况。`BufferedImageimg=ImageIO.read(src);ImageIO.write(img,"jpeg",dest);`本......
  • Linux 下 使用点阵在LCD上显示汉字,字符
    @TOC前言这篇文章主要讲一下如何在LCD上使用点阵显示汉字,字符,修改颜色及效果展示。其中包含了几个核心函数,我们需要了解。一、显示字符1.获取点阵:各个字符对应的点阵都保存在一个数组里,大家可以打开font_8x16.c中得到点阵。(不同的点阵对应不同的代码,这里我使用的是8x16的点......
  • Linux 挂载磁盘详解及实操步骤
    转自:https://www.jb51.net/server/288639rwu.htm步骤如下:一、磁盘分区在Linux中,磁盘是通过分区来使用的。分区是将一个硬盘划分成几个逻辑部分来使用,在每个分区中可以存储不同的文件系统。因此,在挂载磁盘之前,我们需要先对磁盘进行分区。磁盘分区的过程可以通过命令行工具或图形......
  • linux 安装 mysql8
    安装查看版本查看状态......
  • 查看linux操作系统版本:Ubuntu?Centos?还是其他?
    查看内核版本和操作系统版本:uname-a查看系统架构:uname-m查看系统主机名:hostname查看当前登录用户:whoami查看系统已安装的软件包列表:dpkg-l查看系统内存使用情况:free-h查看系统磁盘使用情况:df-h查看系统CPU使用情况:top查看系统网络连接状态:ifconfig查看系统已安装的软件包数量:a......
  • Linux时间校准、时间同步(ntpdate及C代码NTP客户端代码校准示例)
    背景机器每次机启后时间就会出现异常,因为机器无法访问外网,只能访问局域网的ntp服务,所以需要保证局域网内部有ntp服务,如何安装ntp服务,参考Ubuntu20.04Ntp服务安装及验证。网络时间协议NetworkTimeProtocol(NTP)是一种确保时钟保持准确的方法。如果可以访问互联网,只需安装ntp......
  • 宝塔linux面板命令大全
    CentOS安装脚本yuminstall-ywget&&wget-Oinstall.shhttp://download.bt.cn/install/install_6.0.sh&&shinstall.shUbuntu/Deepin安装脚本wget-Oinstall.shhttp://download.bt.cn/install/install-ubuntu_6.0.sh&&sudobashinstall.shDeb......
  • 带有最小间隔时间的队列读取实现 —— Python异步编程
     (注:照片源自免费网站,地址:https://www.freepik.com/photos/angry-panda/13)  ==================================================   ==================================================......
  • Linux配置环境变量
    1.什么是环境变量环境变量(environmentvariables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path......
  • 如何在linux系统中安装python3.8.1 并卸载 python3.6.2 更新python3引导到3.8.1
    安装python3.8.1步骤1:检查Python版本在终端中输入以下命令来检查当前安装的Python版本:python--version步骤2:安装编译Python所需的依赖项更新系统软件包,并安装构建Python所需的一些工具和库。在终端中运行以下命令:sudoaptupdatesudoapt-getinstall-ybuild-essen......