串口之完整封装包含发送和接收(windows+ubuntu已通过初步测试)(持续更新)
这里下载源码
更新日志
16-08-2021 V1.0.3
1.修复接收数据没有将数据传递给应用层的bug
2.windows版本:设置接收数据相邻字节间间隔为5ms
24-09-2020 V1.0.3
1. 增加linux获取可用串口代码
2.example下的main.cc增加Linux显示可用串口代码
23-09-2020 V1.0.3
1.增加Linux调试输出函数
2.增加Linux创建接收线程,并调用接收函数
3.cmake配置文件去掉 构建Windows项目时的used_in_mfc_flag
22-09-2020 V1.0.3
1. ubuntu测试完毕,初步测试结果:发送正常
2. 移除fmt库的引用及ext/fmt下的文件
3. 解除interface.h中的serial_port_info类,改到接口类中
4. example/shared/main.cc示例代码优化
5. 解决seral_port_win_base.h中使用spdlog引起的bug(log函数少写了1个"}"
6. CMAKE配置文件增加代码优化、增加Linux库生成
20-09-2020 V1.0.2
1. 增加ubuntn测试代码
20-09-2020 V1.0.2
1.将cmake的配置文件改为modern cmake
2.引入fmt和spdlog库,并使用spdlog记录日志,增加宏_lib_sp_use_spdlog_和_lib_sp_use_fmt_
3.增加cmake文件,使用fetchcontent管理其他模块(组件,库)
4.接口文件中serial_port_prop_结构体增加变量_is_to_log
5.接口的初步测试已经通过
@todo
1.静态库测试
2.增加对MFC的支持
3.64位动态库测试
19-09-2020 V1.0.1
1.增加模板config.h.in 和 version.rc.in
18-09-2020 V1.0.1
1.屏蔽自定义函数返回类型,改为int
2.完善函数注释
3.改为modern cmake语法
17-09-2020 V1.0.0
1.增加cxx11线程接收数据,初步测试通过
2.增加read_data函数调用on_recv_data函数(落下了)
3.完善代码注释
4.增加utils类,包括基础数据类型之间的相互转换,剥离出项目
5.增加获取Windows可以用串口的接口
6.将部分宏定义分离到universe_def.h中
todo:
1.增加fmt库的引用
2.增加spdlog库的引用
3.增加记录日志的功能
16-09-2020 V1.0.0
1.封装初步完成,测试收发正常
2.增加测试用例,且测试接口结果:正常
1.About
- lib_serial_port is an library to operate serial port, which is written by c++11. .It is convenient to read and write data to the serial port after openning. And also, it supports to query the information of available serial port.
- to receive data, this library creates a thread to do that.
- If an error occured, it will output the error information to the log file using spdlog library
- Now, it only works on windows.
2. Directory & File
the following is the description of this library
.
│ CMakeLists.txt # cmake file
│ del.bat # to delete middle objects of Visual Studio produced
│ readme.md # readme written by markdown
│ update-log.txt # the log of this project
│
├───build
│ del.bat # to delete middle objects of Visual Studio produced
├───config
│ config.h.in # definite some macro
│
├───example
│ └───shared # shared demo
│ main.cc # source file
│
├───ext # other project, like spdlog, fmt
├───include # header files' directory
│ │ universe_def.h # definite some macro
│ │ utils.h # a helper to switch basic type, like int -> std::string
│ │
│ └───serial_port # the serial port's header files
│ serial_port_interface.h # the serial port's interface
│ serial_port_win_base.h # definite some class to oprator serial port on windows platform
│ serial_port_win_info.h # include some interfaces to get serial port's information on windows platform
├───other_tools
│ │ VSPDP_9349.zip # Virtual Serial Port Driver Pro
│ │
│ └───AccessPort_23021 # Access port
│
└───src # the source files of serial port library
serial_port_interface.cpp # the source file of interface file
serial_port_win_base.cpp # the source file of serial_port_win_base.h
serial_port_win_info.cpp # the implemention of serial_port_win_base class
utils.cpp # the implemention of helper class
3. Configure & Generate
- You need CMake, whose version is greater than 3.14.
- Cmd
$ cd xx/serial_port/build
$ cmake ..
then, you will get the serial port's project files. And also, you could use the following cmd to compile your program:
cmake --build .. --config Release
4. Usage
If you wanna receive data, you should definite anther class to inherit irecv_data class and implement the on_recv_data function. Thus, you could get the data from serial port in the on_recv_data function.
4,1 include file:
#include "serial_port/serial_port_interface.h"
4.2 use namespace lib_sp:
using namespace lib_sp;
4.2 initialize
serial_port_prop spp;
spp._name = std::string("COM" + to_string(sp_id));
int ret_val = sp->init(spp);
4.3 open
int ret_val = sp->open();
4.4 send data
const char arr_send[] = {"123ABC-=+"};
int ret_val = sp->send(arr_send, sizof(arr_send));
4.5 to check if opened
bool is_open = sp->is_opened();
4.6 close serial port
int ret_val = sp->close();
4.7 to get information of library
std::string str_ver = sp->get_version();
cout << "version = " << str_ver.c_str() << "\n\n"; // 1.0.0.18-09-2020
4.8 to receive data
Definite another class inherited irecv_data class to receive data, Like this:
class serial_port : public irecv_data
{
// ...
}
then ,set the second parameter of init to this :
// if you wanna recv data, set the second param this, otherwise, set it nullptr
_psp->init(spp, this);
4.9 to create an library object
You could call sp_create_win(in the serial_port_interface.h) function to create an object
iserial_port *_psp = sp_create_win();
4.10 to release an object
You must call sp_release to release the object created by sp_create_win function.
sp_release(_psp);
5. Example
You could get further information to use it from xx/serial_port/example/shared/main.cc
6. Other tools
Note These tools only works on Windows
If you dont have any physical serial port, Configure Virtual Serial Port Driver could create more available virtual serial port pairs. Note, virtual serial port must be used in pairs. Like 10 and 20, 11 and 21
6.1 configure serial port
use Configure Virtual Serial Port Driver to add and delete serial port pairs
6.2 Access port
This tool could monitor and communicate with serial port.
7 License
串口之完整封装包含发送和接收(windows+ubuntu已通过初步测试)(持续更新)的更多相关文章
- 单片机C51串口发送、接收寄存器
所以,发送和接收寄存器可使用同一地址,编写验证程序(发送和接收是独立空间):读取一个数(1)->发送一个数(2)->再读取得1则是独立空间 不知道STM32串口寄存器和C51串口寄存器是否 ...
- Java实现RS485串口通信,发送和接收数据进行解析
最近项目有一个空气检测仪,需要得到空气检测仪的实时数据,保存到数据库当中.根据了解得到,硬件是通过rs485进行串口通讯的,需要发送16进制命令给仪器,然后通过轮询来得到数据. 需要先要下载RXTX的 ...
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
假设你还没有看上一篇 手把手教你Android手机与BLE终端通信--搜索,你就先看看吧,由于这一篇要接着讲搜索到蓝牙后的连接.和连接后的发送和接收数据. 评论里有非常多人问假设一条信息特别长,怎么不 ...
- DICOM医学图像处理:DIMSE消息发送与接收“大同小异”之DCMTK fo-dicom mDCM
背景: 从DICOM网络传输一文开始,相继介绍了C-ECHO.C-FIND.C-STORE.C-MOVE等DIMSE-C服务的简单实现,博文中的代码给出的实例都是基于fo-dicom库来实现的,原因只 ...
- boost asio 学习(八) 网络基础 二进制写发送和接收
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=9 8. Net ...
- JavaMail发送和接收邮件API(详解)
一.JavaMail概述: JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供的JavaMa ...
- 第一百六十一节,封装库--JavaScript,完整封装库文件
封装库--JavaScript,完整封装库文件 /** *feng_zhuang_ku_1.0版本,js封装库,2016/12/29日:林贵秀 **/ /** 前台调用 * 每次调用$()创建库对象, ...
- JavaMail发送和接收邮件
一.JavaMail概述: JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供 ...
- SIM900A—发送、接收中英文短信
文章目录 一.SMS简介 二.短信的控制模式与编码 1.Text Mode 2.PDU Mode 3.GSM编码 4.UCS2编码 三.收发英文短信 1.AT+CPMS查询短信数量 2.AT+CNMI ...
随机推荐
- time 查看命令执行时间
在命令执行完成之后就会打印出CPU的使用情况: real 0m5.064s <== 实际使用时间(real time) user 0m0.020s <== 用 ...
- wireshatk_teach
wireshark抓包新手使用教程 Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息.常用于开发测试过程各种问题定位.本文主要内容包括: 1.Wiresha ...
- SQL-关联表查询(连表查询)
0.例如:select * from T1,T2 where T1.a=T2.a 1.连表查询 <=> join(inner join)内连接查询 数据源: Persion表: ...
- A Child's History of England.1
A Child's History of England, by Charles Dickens (狄更斯) CHAPTER I ANCIENT ENGLAND AND THE ROMANS If y ...
- 前端知识,什么是BFC?
BFC全称是Block Formatting Context,即块格式化上下文.它是CSS2.1规范定义的,关于CSS渲染定位的一个概念.要明白BFC到底是什么,首先来看看什么是视觉格式化模型. 视觉 ...
- C语言产生随机数(伪)
C语言的获取随机数的函数为rand(), 可以获得一个非负整数的随机数.要调用rand需要引用头文件stdlib.h.要让随机数限定在一个范围,可以采用模除加加法的方式.要产生随机数r, 其范围为 m ...
- Fragment以及懒加载
1.Fragments Fragment是Activity中用户界面的一个行为或者是一部分,你可以在一个单独的Activity上把多个Fragment组合成为一个多区域的UI,并且可以在多个Activ ...
- springboot整合jetty
1.jetty介绍 通常我们进行Java Web项目开发,必须要选择一种服务器来部署并运行Java应用程序,Tomcat和Jetty作为目前全球范围内最著名的两款开源servlet容器,该怎么选呢. ...
- Spring MVC与html页面的交互(以传递json数据为例)
一.导入相jar包 主要包括spring相关jar包和fastjson jar包,具体步骤略. 二.配置相关文件 1.配置web.xml文件 <?xml version="1.0&qu ...
- 【JS】toLocaleString 日期格式,千分位转换
https://blog.csdn.net/Seven521m/article/details/108866881 类似于c里printf(m%)的意思 可以指定整数最少位数,小数最少与最多位数,有效 ...