串口的应用层操作

2023-05-16

一、设备中一般会用第二串口与外设通信。需要可以配置波特率,实现应用层面的串口读写。
二、代码实现

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <string.h>
#include <sys/select.h>

int nComFd        = 0;
int flag        = 0;

void signal_handle(int sig)
{    
       printf("################## get signal: %d\n", sig);
       switch(sig) {    
               case SIGINT:    
               case SIGKILL:    
               case SIGTERM:        
                       flag = 1;        
                       break;    
               default:        
                       break;
       }

       return;
}

static int uart_init(char *dev)
{
       printf("file=%s,func=%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__);
       
       nComFd = open(dev, O_RDWR|O_NOCTTY);		//以阻塞的方式打开

       if (nComFd <= 0 )
       {
               printf("Couldn't open /dev/%s",dev);
               
               return -1;
       }else {
               printf("open %s success!",dev);
       }
       
       return 0;
}


static int uart_set_param(unsigned long bau_rate, unsigned char data_bits, unsigned char parity, unsigned char stop_bits)
{
       struct termios newtio;

       bzero(&newtio, sizeof(newtio));

       if(tcgetattr(nComFd, &newtio) != 0)
       {
               printf("SetupSerial 1");

               return -1;
       }

       newtio.c_cflag |= CLOCAL |CREAD;
       newtio.c_lflag &=~ICANON;
       newtio.c_cflag &= ~CSIZE;
       //选择原始模式
       newtio.c_oflag &= ~OPOST;
       newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
       
       switch(data_bits)
       {
               case 5:
                       newtio.c_cflag |= CS5;
                       break;
               case 6:
                       newtio.c_cflag |= CS6;
                       break;
               case 7:
                       newtio.c_cflag |= CS7;
                       break;
               case 8:
                       newtio.c_cflag |= CS8;
                       break;
               default:
                       newtio.c_cflag |= CS8;
                       break;
       }

       switch(parity)
       {
               case '2':
                       newtio.c_iflag |= (INPCK | ISTRIP);                
                       newtio.c_cflag |= PARENB;
                       newtio.c_cflag |= PARODD;
                       break;
               case '1':
                       newtio.c_iflag |= (INPCK | ISTRIP);
                       newtio.c_cflag |= PARENB;
                       newtio.c_cflag &= ~PARODD;
                       break;
               case '0':
                       newtio.c_cflag &= ~PARENB;
                       break;
               default:
                       newtio.c_cflag &= ~PARENB;
                       break;
       }

       switch(bau_rate)
       {  
               case 2400:
                       cfsetispeed(&newtio, B2400);
                       cfsetospeed(&newtio, B2400);
                       break;
               case 4800:
                       cfsetispeed(&newtio, B4800);
                       cfsetospeed(&newtio, B4800);
                       break;
               case 9600:
                       cfsetispeed(&newtio, B9600);
                       cfsetospeed(&newtio, B9600);
                       break;
               case 57600:
                       cfsetispeed(&newtio, B57600);
                       cfsetospeed(&newtio, B57600);
                       break;
               case 115200:
                       cfsetispeed(&newtio, B115200);
                       cfsetospeed(&newtio, B115200);
                       break;
               case 460800:
                       cfsetispeed(&newtio, B460800);
                       cfsetospeed(&newtio, B460800);
                       break;
               default:
                       cfsetispeed(&newtio, B9600);
                       cfsetospeed(&newtio, B9600);
                       break;
       }

       switch(stop_bits)
       {
               case 1:
                       newtio.c_cflag &= ~CSTOPB;
                       break;
               case 2:
                       newtio.c_cflag |= CSTOPB;
                       break;
               default:
                       newtio.c_cflag &= ~CSTOPB;
                       break;
       }

       newtio.c_cc[VTIME]       = 0;
       newtio.c_cc[VMIN]        = 1;

       tcflush(nComFd, TCIFLUSH);

       if((tcsetattr(nComFd, TCSANOW, &newtio)) != 0)
       {
               printf("com set error");

               return -1;
       }
       
       return 0;
}

int main(int argc, char *argv[])
{
       int i = 0, ret = -1;
       unsigned char char_val[]        	= {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};
       unsigned char rev_buf[100]   	= {0x00};
       struct timeval timeout;
       fd_set u_read;
       struct termios opt;
       unsigned long baud = 0;

       if(argc < 2)
       {
               printf("Usage: ./uart /dev/ttySAK1 \n");

               return -1;
       }

       
       signal(SIGINT, signal_handle);
       uart_init(argv[1]);
       baud = atol(argv[2]);
       printf("baudrate=%lu\n", baud);
       uart_set_param(baud, 8, 0, 1);
       printf("param init is end\n");

       while (!flag) {
               FD_ZERO(&u_read);
               FD_SET(nComFd, &u_read);

               timeout.tv_sec        = 3;
               timeout.tv_usec        = 0;

               ret = select(nComFd + 1, &u_read, NULL, NULL, &timeout);

               if (ret > 0) {
                       if (FD_ISSET(nComFd, &u_read)) {                        
                               int rret = read(nComFd, &rev_buf, 100);
                               if (rret > 0) {
                                       printf("value from reading:\n");
                                       for (i = 0; i < rret; i++) {
                                               printf("0x%x\n", rev_buf[i]);
                                       }
                               }else {
                                       printf("read error.\n");
                               }
                       }
               }else if (0 == ret) {
                       printf("time out%s.\n", __TIME__);
               }else {
                       printf("select error.\n");
               }

       }

#ifdef OTHER_WAY
       while(!flag)
       {
               printf("Now I am a sender!!!!\n");
               while(1)
               {
                       int ret = write(nComFd, &char_val[i], 1);
                       if(ret <= 0)
                       {
                               printf("%s send data error!\n", argv[1]);
                               close(nComFd);

                               return -1;
                       }else {
                               printf("Send data to %s success ret = %d value = %02x\n", argv[1], ret, char_val[i]);
                       }

                       i++;
                       if(i == 6)
                       {
                               i = 0;
                               break;
                       }

                       sleep(1);
               }

               printf("Now I am a rev!!!!!\n");
               while(1)
               {
                       int ret = read(nComFd, &rev_buf[i], 1);
                       if(ret <= 0)
                       {
                               printf("%s read data error!\n",argv[1]);
                               close(nComFd);

                               return -1;
                       }else {
                               printf("read data from %s success ret = %d value = %02x\n", argv[1], ret, rev_buf[i]);
                       }

                       i++;
                       if(i == 6)
                       {
                               i = 0;
                               memset(rev_buf, 0, sizeof(rev_buf));

                               break;
                       }
               }
       }
#endif

       close(nComFd);
}

属性配置参考:
https://www.huaweicloud.com/articles/52339d7f0d58bac66c0e814a6d8a4225.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

串口的应用层操作 的相关文章

随机推荐

  • latex图像注释位置

    latex图像注释的位置在左边 不知道谁把模板里的 usepackage caption 给注释掉了
  • pytorch pretrained model

    pytorch pretrained model two methods method 1 比较大小 self span class token punctuation span model span class token operato
  • 嵌入式100题(76):中断和异常的区别

    中断和异常的区别 1 异常 是指CPU内部出现的中断 即在CPU执行特定指令时出现的非法情况 同时异常也称为同步中断 因此只有在一条指令执行后才会发出中断 不可能在指令执行期间发生异常 产生的原因 程序的错误产生的 编程异常通常叫做软中断
  • 字节序、大端序与小端序及其相关转换

    大端序与小端序及其相关转换 一 字节序定义 字节序 xff0c 为字节的顺序 xff0c 就是大于一个字节类型的数据在内存中的存放顺序 xff0c 一个字节的数据当然就没有顺序可言了 xff0c 其实大部分人在实际的开发中都很少会直接和字节
  • SkeyeLive开源流媒体PC端推拉流直播软件源码功能框架解析

    SkeyeLive是OpenSKEYE开源流媒体团队开发的一款功能丰富的开源PC端流媒体推流拉流直播软件项目 xff0c 目前支持Windows Android版本 xff0c 后续将支持ios版本 xff0c 其中Windows版本的Sk
  • 融资租赁业务系统(财务中台)

    融资租赁业务系统 财务中台 产品白皮书 版本号 xff1a V1 1 李雷 微信号 xff1a yanan122914 平台概述 融资租赁财务中台产品是一套专门针对融资租赁行业设计的融资租赁财务统一解决方案 对租赁公司传统的大单回租 直租
  • InfoQ推荐语:我的梦想

    大家好 非常高兴能在这一期的架构师和大家见面 本人工作了十余载 先后在洪恩软件和用友集团任职 目前任职于用友集团瑞友科技研究院 主要关注领域 企业应用软件平台研发 领域驱动设计 OSGi 动态语言应 用 云计算 移动互联和Mac OS平台相
  • 【MySQL】------数据库连接

    分享第十九条励志语录 要想飞起来 xff0c 首先要有飞翔的信念 xff0c 如果没有这个信念 xff0c 永远不可能飞起来 但只要有了飞翔的信念 xff0c 再加上自己的努力 xff0c 就有可能能够飞起来 成功也是这样 xff0c 要想
  • 无人机调试记录(一)

    无人机调试记录 xff08 一 xff09 固件 xff1a PX4 地面站 xff1a QGC APM xff08 pixhawk xff09 飞控疑难杂症解决方法汇总 校准 1 确保陀螺仪 水平线校准正确 如果校准完成后 xff0c Q
  • VsCode中使用git

    你是否厌倦了每天早上到公司都要打开git 小黑框 执行git clone 地址去拉取代码 而强大的VsCode只需要点一下即可解决 1 添加到暂存区 xff0c 更改文件以后可以发现 点进去上图这个标志 如果没有 xff0c 右击左侧菜单栏
  • 虚拟机上无法运行ubuntu自带的gazebo仿真器报VMware: vmw_ioctl_command error 无效的参数

    问题说明 xff1a 虚拟机版本 xff1a VMware Workstation 16 Pro Ubuntu版本 xff1a Ubuntu 18 04 现象 xff1a gazebo闪退 xff0c 并报 VMware vmw ioctl
  • NVIDIA JETSON TX2镜像制作以及刷机流程

    一 安装环境准备 xff1a Ubuntu宿主主机一台 xff0c TX2新老板子各一个 xff08 老的用来镜像备份 xff0c 用这个镜像给新的刷机 xff09 xff0c USB Micro USB线一根 1 下载TX2驱动 直接在百
  • 各种排序混合---冒泡排序、选择排序、插入排序

    冒泡排序 不多说 xff0c 看代码 xff0c 就是把最大的数字或者最小的数字沉到最右边 xff0c 最后输出数组 include lt iostream gt include lt stdlib h gt include lt math
  • 【PyQt5】串口数据实时绘图

    常见的串口调试助手一般只有简单的文本界面 xff0c 偶然看到 Arduino IDE 自带的串口绘图工具 xff0c 觉得用户设计挺友好 想着利用一下周末空闲时间 xff0c 用 PyQt5 实现一个串口数据实时绘图小工具 xff0c 在
  • HTTPS、HTTPS、SSH、MSTSC等常用网络服务的端口号

    前言 今天在 powershell下使用curl命令访问 一个网址 返回 443 port 相关的错误信息 xff0c 我第一眼看 xff0c 还以为是HTTP STATUS CODE 于是去查了一会儿才发现 xff0c 是端口号的问题 下
  • vue服务端渲染——基础

    文章目录 vue服务端渲染 xff08 基础 xff09 Nuxt框架文件目录结构项目启动 打包生命周期SSRnuxtserverInitmiddleware 中间件全局中间件页面级中间件 validate 校验参数asynData校验参数
  • 变压变频调速的原理(VVVF)——基础补充

    1 变压变频调速系统的基本原则 xff1a 维持气隙磁通不变 根据电磁感应原理 xff0c 气隙磁通在定子绕组每相绕组中的感应电动势为 xff1a Fs 为定子频率 xff0c Ns 为定子每相绕组串联匝数 xff0c Kns为基波绕组系数
  • RIA迷你书序言

    RIA Minibook Prologue RIA迷你书序言 Rich Internet Applications or RIAs have truly revolutionized user experiences online When
  • Tensorflow版本和python对应关系,以及tensorflow下载路径

    A few installation mechanisms require the URL of the TensorFlow Python package The value you specify depends on your Pyt
  • 串口的应用层操作

    一 设备中一般会用第二串口与外设通信 需要可以配置波特率 xff0c 实现应用层面的串口读写 二 代码实现 span class token macro property span class token directive hash sp