linux下,PC机串口通信开发

 1、查看电脑的串口
~/share/bin/PC$ dmesg | grep tty
[    0.083244] printk: console [tty0] enabled
[    0.329145] 00:02: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
[    0.351177] 00:03: ttyS1 at I/O 0x2f8 (irq = 3, base_baud = 115200) is a 16550A
[    0.420781] tty tty48: hash matches

从回复信息中可以看出电脑有两个串口,分别是ttyS0,ttyS1

USB口的话,信息显示是ttyUSB0

 2、添加串口调试代码

简单实现控制灯开的函数

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>      /*文件控制定义*/
#include <termios.h>    /*PPSIX 终端控制定义*/
#include <sys/ioctl.h>
#include <errno.h>
#include <sys/select.h>
#include <sstream>
#include <iomanip>#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))using namespace std;static int lightOn();
static int sendRecv(uint8_t *sBuf, uint16_t sSize, uint8_t *rBuf, uint16_t rSize);
static int Open(const char* device, int baudrate, char parity = 'N', int bytesize = 8, int stopbits = 1);
static int set_parity(int fd,int databits,int stopbits,int parity,int baudrate);
int Read(void* buf, size_t maxLen);
int Write(const void* buf, size_t len);
std::string toHex(uint8_t *buf, uint16_t size);int m_fd;int main()
{Open("/dev/ttyS0", 9600);lightOn();return 0;
}int Open(const char* device, int baudrate, char parity/* = 'N'*/, int bytesize/* = 8*/, int stopbits/* = 1*/)
{printf("enter %s\n", __func__);m_fd = ::open(device, O_RDWR | O_NOCTTY | O_NDELAY);if (m_fd < 0){perror("打开COM口时出错");return -1;}//if( set_parity(m_fd,8,1,'N') < 0)if( set_parity(m_fd, bytesize, stopbits, parity, baudrate) < 0){perror("Set Parity Error\n");return -1;}tcflush(m_fd, TCIOFLUSH);printf("leave %s\n", __func__);return 0;
}int set_parity(int fd,int databits,int stopbits,int parity,int baudrate)
{struct termios optnew;speed_t speed = B19200;if ( fd >0 ) {/* Read with blocking behavior */fcntl(fd, F_SETFL, 0);/* Get current option */tcgetattr(fd, &optnew);/* initialize new option to raw input/output *///              memset(&optnew, 0, sizeof(optnew));cfmakeraw(&optnew);optnew.c_cc[VMIN ] = 0;optnew.c_cc[VTIME] = 2*10;/* set baudrate */switch (baudrate) {case   1200: speed =   B1200;  break;case   1800: speed =   B1800;  break;case   4800: speed =   B4800;  break;case   9600: speed =   B9600;  break;case  19200: speed =  B19200;  break;case  38400: speed =  B38400;  break;case  57600: speed =  B57600;  break;case 115200: speed = B115200;  break;default:    speed = B19200; break;}cfsetispeed(&optnew, speed);cfsetospeed(&optnew, speed);/* Set data bits */optnew.c_cflag &= ~CSIZE;optnew.c_cflag &= ~CRTSCTS;optnew.c_iflag &= ~(ICRNL|IXON);optnew.c_cflag |= CLOCAL | CREAD;optnew.c_oflag &= ~OPOST;switch (databits) {case 5: optnew.c_cflag |= CS5; break;case 6: optnew.c_cflag |= CS6; break;case 7: optnew.c_cflag |= CS7; break;default :optnew.c_cflag |= CS8; break;}/* Set parity checking */optnew.c_cflag |= PARENB;switch (parity) {case 'e':case 'E': optnew.c_cflag &= ~PARODD; break;case 'o':case 'O': optnew.c_cflag &=  PARODD; break;default :optnew.c_cflag &= ~PARENB; break;}/* Set stop bit(s) */if (stopbits == 2)optnew.c_cflag &=  CSTOPB;elseoptnew.c_cflag &= ~CSTOPB;optnew.c_lflag &= ~( ICANON | ECHO | ECHOE | ISIG );/* Apply new option */tcsetattr(fd, TCSANOW, &optnew);}return fd;
}int lightOn()
{uint8_t send[] = {0x2A, 0x4B, 0x0D};uint8_t right[] = {0x2A, 0x4B, 0x00, 0x0D};int retry = 2;while(retry--){uint8_t recv[sizeof(right)];memset(recv, 0, sizeof(right));printf("send %s\n", toHex((uint8_t *)send, sizeof(send)).c_str());const int recvCount = sendRecv(send, sizeof(send), recv, sizeof(recv));if(recvCount != sizeof(recv)){if(recvCount){printf("recv %s\n", toHex((uint8_t *)recv, sizeof(recv)).c_str());}continue;}if(0 != memcmp(right, recv, sizeof(right))){printf("recv %s\n", toHex((uint8_t *)recv, sizeof(recv)).c_str());continue;}//successprintf("recv %s\n", toHex((uint8_t *)recv, sizeof(recv)).c_str());retry = 0;break;}return retry;
}int sendRecv(uint8_t *sBuf, uint16_t sSize, uint8_t *rBuf, uint16_t rSize)
{printf("enter %s\n", __func__);//    m_mutex.lock();int ret = Write(sBuf, sSize);if (ret != 0){printf("%s Write error, Buf:%s\n", __func__, sBuf);goto _RET;}ret = Read(rBuf, rSize);if (ret != rSize){printf("%s read:%s ret:%d\n", __func__, rBuf, ret);goto _RET;}_RET:
//    m_mutex.unlock();return ret;
}int Write(const void* buf, size_t len)
{printf("enter %s\n", __func__);int ret = 0;int n = ::write(m_fd, buf, len);if(n != len){ret = -2;}
//    printf("send to uart result:%i\n", ret);return ret;
}/** return 接受到的字节数*/
int Read(void* buf, size_t maxLen)
{printf("enter %s\n", __func__);int offset = 0;while(offset < maxLen){fd_set rd;FD_ZERO(&rd);FD_SET(m_fd, &rd);timeval timeout;timeout.tv_sec = 1;int ready = select(m_fd+1, &rd, NULL, NULL, &timeout);if (ready == 0){    //timeout
//            offset = SER_TO;printf("timeout\n");break;}else if (ready == -1 && (errno != EINTR) ){ //erroroffset = -2;printf("error\n");break;}else if(ready == 1){if (FD_ISSET(m_fd, &rd)){int n = ::read(m_fd, buf + offset, maxLen - offset);if(n > 0){offset += n;}}}}return offset;
}std::string toHex(uint8_t *buf, uint16_t size)
{std::stringstream hexSS;for (int i = 0; i < size; i++){hexSS << std::setw(2) << std::setfill('0') << std::hex << (int)buf[i] << " ";}std::string hexStr = hexSS.str();return hexStr;
}
3、遇到open函数出错

在::open() 出错时,已经通过perror函数打印出出错信息,可以根据信息修改

1)比如报错信息提示权限不对,修改权限

chmod 666 /dev/ttyS0

或者以root权限运行可执行文件

// 假如可执行文件是a.out
sudo ./a.out

 

2)检查串口波特率

~/share/bin/PC$ stty -F /dev/ttyS0
speed 9600 baud; line = 0;
min = 0; time = 20;
-brkint -icrnl -imaxbel
-opost
-isig -icanon -iexten -echo -echoe

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/629221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】面向对象 OOP

文章目录 面向对象OOP概述一、对象内存相关二、类的成员之一&#xff1a;成员变量&#xff08;Field&#xff09;2.1 如何声明成员变量2.2 成员变量 与 局部变量 三、类的成员之一&#xff1a;成员方法&#xff08;Method&#xff09;3.1 方法调用内存分析3.2 方法的重载3.3 可…

vue 导出el-table表格数据

1.先安装 file-saver 、xlsx 组件 npm install file-saver -Snpm intsall xlsx -S 2.html 代码 <el-table :data"elTable" ref"" id"table-content"><el-table-column label"其他" align"center"></el-…

NAS入门(学习笔记)

文章目录 AutoMLNAS初期NAS当前NAS框架One-Shot NAS权重共享策略 Zero-Shot NASZen-NASNASWOTEPENAS 参考资料 AutoML 深度学习使特征学习自动化 AutoML 使深度学习自动化 自动化机器学习 (automated machine learning) 是一种自动化的数据驱动方法, 并做出一系列决策。 按…

第2、3次作业

题目1&#xff1a; 基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 题目2&#xff1a; 给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[www.openlab.com/student](http://www.openlab.c…

泛微OA获取明细表单附件

明细表一个附件对应一个唯一标识,主要是需要sql查询出对应的imagefileid,代码如下: package weaver.interfaces.workflow.action;import weaver.conn.RecordSet; import weaver.file.ImageFileManager; import weaver.general.BaseBean; import weaver.soa.workflow.reques…

PyTorch 还提供的几种连接张量的方法

1. torch.stack() 方法&#xff1a; 行为&#xff1a; 创建一个新的维度&#xff0c;并在该维度上堆叠张量。结果张量的维度比原始张量多一维。适用场景&#xff1a; 当需要在新的维度上堆叠张量时&#xff0c;特别是在创建新批次或样本时。 import torchtensor1 torch.tens…

RIP【新华三与华为区别】

【介绍】 rip分为rip 1 与 rip 2 &#xff0c;rip 2 是对 rip 1 的一种升级&#xff0c;rip 2 可以进行认证等功能 【命令】 新华三&#xff1a; [HC3-R1] rip #启用rip [HC3-R1-rip] version 2 #告知rip 版本号 [HC3-R1-rip] network 192.168.1.0 #宣告其网段 [HC3-R1-rip] …

【python】py-spy 实时显示python进程内的线程堆栈CPU消耗 python CPU消耗分析

安装 pip install py-spy AI调用源码&#xff0c;红色调用时&#xff0c;python进程CPU 100% 启动程序&#xff0c;输入问题&#xff0c;观察CPU top sudo .local/bin/py-spy top --pid 7150 可以看到&#xff0c;此时与显卡交互占用了绝大部分CPU&#xff0c;有点死循环检测…

AI大模型预先学习笔记一:transformer和fine tune技术介绍

一、商业观点&#xff1a;企业借助大模型获得业务增长可能 二、底层原理&#xff1a;transformer 1&#xff09;备注 ①下面每个步骤都是自回归的过程&#xff08;aotu-regressive&#xff09;&#xff1a;已输出内容的每个字作为输入&#xff0c;一起生成下一个字 ②合起来就…

全自动网页制作系统流星全自动网页生成系统重构版输入网页信息即可制作

源码优点: 所有模板经过精心审核与修改&#xff0c;完美兼容小屏手机大屏手机&#xff0c;以及各种平板端、电脑端和360浏览器、谷歌浏览器、火狐浏览器等等各大浏览器显示。 免费制作 为用户使用方便考虑&#xff0c;全自动网页制作系统无需繁琐的注册与登入&#xff0c;直接…

CUTANA™ CUTRUN Assays ——实现超敏基因组定位

蛋白质和核酸是构成生命体最为重要的两类生物大分子&#xff0c;二者间的相互作用一直是分子生物学研究的中心问题之一。研究细胞内蛋白质-DNA相互作用的常用方法是染色质免疫沉淀(Chromatin Immunoprecipitation, ChIP) &#xff0c;同时ChIP还常被用于确定基因组上与组蛋白修…

MybatisPlus框架--如何让公共字段自动更新插入

目录 建一个springboot项目 引入mybatisplus依赖 功能区 如何让公共字段自动更新插入&#xff08;createTime&#xff0c;updateTime&#xff09; 1.创建表 2.项目 3.Application 4.application.yml 5.pom.xml 6.entity 7.mapper 8.service 9.service下的impl 10…

使用scipy处理图片——滤镜处理

大纲 black_tophatwhite_tophatconvolvecorrelategaussian_filtergaussian_laplacemaximum_filtermedian_filterminimum_filterpercentile_filterprewittrank_filtersobelspline_filteruniform_filter基础代码代码仓库 在《使用numpy处理图片——模糊处理》一文中&#xff0c;我…

iTMSTransporter上传ipa文件

背景 uni-app云打包之后生成的ipa包需要上传到app store上&#xff0c;applicationloader和香蕉云编都收费&#xff0c;转用iTMSTransporter上传 环境&#xff1a;mac 第1步 选择安装目录 xcode-select --switch /Applications/Xcode.app/Contents/Developer第2步 下载 xcru…

【绩效考核】分享:海底捞的考核方法

很多企业都希望学习海底捞的管理方法。在绩效考核方面&#xff0c;海底捞的“不考核利润、考核满意度”始终是一大特色。它重视门店管理者的绩效考核&#xff0c;并将客户满意度作为绩效考核的核心&#xff0c;这对其他企业是否具有借鉴意义&#xff1f;海底捞始终秉承“服务至…

鸿蒙OS应用开发之显示图片组件4

前面学习了比较复杂的图片显示,现在来学习一个简单的方式,就是采用网络图片显示。不过,这个需要APP向用户申请网络的权限。如果具备这个权限,只要连接上网,就可以动态地更新界面上显示的图片,这是比较方便的地方。 要显示网络的图片是比较简单的,只需要一行代码: Image…

MySQL——性能优化与关系型数据库

文章目录 什么是性能&#xff1f;什么是关系型数据库&#xff1f;数据库设计范式 常见的数据库SQL语言结构化查询语言的六个部分版本 MySQL数据库故事历史版本5.6/5.7差异5.7/8.0差异 什么是性能&#xff1f; 吞吐与延迟&#xff1a;有些结论是反直觉的&#xff0c;指导我们关…

ioctl操作实现

ioctl&#xff0c;避免使用三个全局变量&#xff0c;因此写进一个结构体里面 ioctl对文件属性进行操作 #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/cdev.h> #include <asm/uaccess.h>#define…

微信商家转账到零钱怎么开通?场景模板

商家转账到零钱是什么&#xff1f; 使用商家转账到零钱这个功能&#xff0c;可以让商户同时向多个用户的零钱转账。商户可以使用这个功能用于费用报销、员工福利发放、合作伙伴货款或分销返佣等场景&#xff0c;提高效率。 商家转账到零钱的使用场景有哪些&#xff1f; 商家…

pytest -- 进阶使用详解

pytest-html⽣成报告 Pytest-HTML 是⼀个插件&#xff0c;它可以⽣成漂亮且易于阅读的 HTML 测试报告。 pytest-html ⽣成报告的步骤 ① 安装 pytest-html 插件&#xff1a; pip install pytest-html ② 运⾏测试并⽣成报告&#xff1a; file name:main.pyimport pytest&qu…