CSerialPort教程(2) - CSerialPort源码简介


如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

文章目录

  • CSerialPort教程(2) - CSerialPort源码简介
    • 前言
    • 1. CSerialPort源码目录结构
    • 2. CSerialPort常用函数
      • 2.1 串口信息相关函数
        • 2.1.1 获取串口信息列表函数 availablePortInfos
      • 2.2 串口操作相关函数
        • 2.2.1 串口初始化函数 init
        • 2.2.2 打开串口函数 open
        • 2.2.3 关闭串口函数 close
        • 2.2.4 是否打开串口成功函数 isOpened
        • 2.2.5 向串口写入数据函数 writeData
        • 2.2.6 从串口读取数据函数 readAllData
        • 2.2.7 获取CSerialPort版本信息函数 getVersion
        • 2.2.8 错误码 SerialPortError
    • 3. CSerialPort简单代码示例

前言

CSerialPort项目是基于C++的轻量级开源跨平台串口类库,用于实现跨平台多操作系统的串口读写。

CSerialPort项目的开源协议自 V3.0.0.171216 版本后采用GNU Lesser General Public License v3.0

为了让开发者更好的使用CSerialPort进行开发,特编写基于4.x版本的CSerialPort教程系列。

本文对CSerialPort 4.1.1版本源码进行简介。

CSerialPort项目地址:

  • https://github.com/itas109/CSerialPort
  • https://gitee.com/itas109/CSerialPort

1. CSerialPort源码目录结构

|-- CSerialPort # root|-- .clang-format # code format 代码规范|-- CHANGELOG.md # change log 修改日志|-- CMakeLists.txt|-- LICENSE # LGPL3.0 license|-- README.md|-- README-EN.md|-- VERSION # version 版本号|-- cserialport.cppcheck|-- doc # document 文档目录|   |-- CSerialPort_doc_cn.chm # Chinese documnet 简体中文说明书|   |-- CSerialPort_doc_en.chm # English documnet 英文说明书|   |-- directory_list.md # directory list 目录列表|   |-- FAQ.md # Frequently Asked Questions 常见问题回答|   |-- error_guide.md # error guide 错误指南文档|   |-- How To Use.txt|   |-- suspending.txt|-- examples # example 示例目录|   |-- CommMFC # CSerialPort MFC Demo use source code win32直接调用源码MFC程序示例|   |-- CommDLL # CSerialPort MFC Demo use Win32 Dll |   |-- CommNoGui # CSerialPort No Gui Demo 无界面程序示例|   |-- CommQT # CSerialPort QT Demo QT程序示例|   |-- CommTui # CSerialPort tui Demo 文本界面程序示例|-- include # headers 头文件|   |-- CSerialPort|       |-- Doxyfile # Doxyfile Doxy文档配置文件|       |-- SerialPort.h # Lightweight library of serial port, which can easy to read and write serical port on windows and linux with C++ 轻量级跨平台串口读写类库|       |-- SerialPortBase.h # CSerialPort Base class 串口基类 |       |-- SerialPortInfo.h # CSerialPortInfo class 串口信息辅助类 |       |-- SerialPortInfoBase.h # CSerialPortInfo Base class 串口信息辅助类基类 |       |-- SerialPortInfoUnixBase.h # CSerialPortInfo unix class unix串口信息辅助类基类 |       |-- SerialPortInfoWinBase.h # CSerialPortInfo windows class windows串口信息辅助类基类|       |-- SerialPortUnixBase.h # CSerialPort unix Base class unix串口基类|       |-- SerialPortWinBase.h # CSerialPort Windows Base class windows串口基类 |       |-- SerialPort_global.h # Global difine of CSerialPort 串口全局定义 |       |-- osplatformutil.h # os platform define 操作系统定义|       |-- sigslot.h # signal and slot 信号与槽|-- lib # lib 库目录|   |-- CMakeLists.txt # CSerialPort library cmake file [recommend]|   |-- Linux # windows lib windows库目录|   |-- Windows # windows lib windows库目录|-- pic # picture 图片|-- src # source 源代码|-- test # unit test 单元测试

2. CSerialPort常用函数

2.1 串口信息相关函数

2.1.1 获取串口信息列表函数 availablePortInfos

该函数获取串口信息列表,主要包括串口名称(如COM2)和描述信息(如Prolific USB-to-Serial Comm Port)。

static vector<SerialPortInfo> itas109::CSerialPortInfo::availablePortInfos()

2.2 串口操作相关函数

2.2.1 串口初始化函数 init

该函数用于串口初始化。

void itas109::CSerialPort::init(std::string portName,                                 // 串口名称 Windows:COM1 Linux:/dev/ttyS0int baudRate = itas109::BaudRate9600,                 // 波特率itas109::Parity parity = itas109::ParityNone,         // 校验位itas109::DataBits dataBits = itas109::DataBits8,      // 数据位itas109::StopBits stopbits = itas109::StopOne,        // 停止位itas109::FlowControl flowControl = itas109::FlowNone, // 流控制unsigned int readBufferSize = 512                     // 读取缓冲区大小
)

注意:

  • 5位数据位不能使用2位停止位
  • 1.5位停止位不能使用5位数据位
  • POSIX系统8位数据位不能使用0校验
  • windows数据位范围为4 - 8
  • 1.5位停止位仅对windows有效
  • 停止位数字1表示StopOneAndHalf,即1.5位停止位,并非1位停止位

2.2.2 打开串口函数 open

该函数用于打开串口。

bool itas109::CSerialPort::open()

true表示打开成功,false表示打开失败。

打开失败可用itas109::CSerialPort::getLastError()获取错误码

2.2.3 关闭串口函数 close

该函数用于关闭串口。

void itas109::CSerialPort::close()

2.2.4 是否打开串口成功函数 isOpened

该函数用于获取是否打开串口成功。

bool itas109::CSerialPort::isOpened()

true表示串口打开成功,false表示串口打开失败。

2.2.5 向串口写入数据函数 writeData

该函数用于向串口写入数据。

int itas109::CSerialPort::writeData(const char *data, // 待写入数据int maxSize       // 写入长度
)

成功则返回写入字节数,失败则返回-1。

写入失败可用itas109::CSerialPort::getLastError()获取错误码。

2.2.6 从串口读取数据函数 readAllData

该函数用于从串口读取所有数据。

int itas109::CSerialPort::readAllData(char *data // 读取结果
)

正常则返回读取字节数,失败则返回-1。

读取失败可用itas109::CSerialPort::getLastError()获取错误码。

注意:
CSerialPort异步操作模式下,需要配合sigslot::signal0 itas109::CSerialPort::readReady使用。详见第三节的代码示例。

2.2.7 获取CSerialPort版本信息函数 getVersion

该函数用于获取CSerialPort版本信息。

std::string itas109::CSerialPort::getVersion()

返回CSerialPort版本信息,如https://github.com/itas109/CSerialPort - V4.1.1.210903

2.2.8 错误码 SerialPortError

错误码数值 错误码宏定义 错误码说明
-1 SystemError system error 系统错误(如空指针、内存访问异常等)
0 NoError No error occurred 没有错误
1 DeviceNotFoundError device not found 未找到设备
2 PermissionError permission error 权限错误
3 OpenError open error 打开串口错误
4 ParityError parity error 校验位错误
5 FramingError
6 BreakConditionError
7 WriteError write error 写数据错误
8 ReadError read error 读数据错误
9 ResourceError
10 UnsupportedOperationError
11 UnknownError unknown error 未知错误
12 TimeoutError time out error 超时
13 NotOpenError not open serial port error 串口未打开
14 InvalidParameterError invalid parameter error 无效的参数

3. CSerialPort简单代码示例

  • 操作步骤
$ mkdir CSerialPortDemo
$ cd CSerialPortDemo
$ git clone https://github.com/itas109/CSerialPort
$ touch CSerialPortDemo.cpp
$ touch CMakeLists.txt
$ mkdir bin
$ cd bin
$ cmake ..
$ cmake --build .
  • 目录结构
$ tree
.
+--- CMakeLists.txt
+--- CSerialPort
|   +--- include
|   +--- src
|   +--- ...
+--- CSerialPortDemo.cpp
  • CSerialPortDemo.cpp

注意:接收函数需要继承sigslot::has_slots<>

#include <iostream>#include "CSerialPort/SerialPort.h"
#include "CSerialPort/SerialPortInfo.h"#include <vector>
using namespace itas109;
using namespace std;class mySlot : public has_slots<>
{
public:mySlot(CSerialPort *sp){recLen = -1;p_sp = sp;};void OnSendMessage(){// readrecLen = p_sp->readAllData(str);if (recLen > 0){str[recLen] = '\0';std::cout << "receive data : " << str << ", receive size : " << recLen << std::endl;}};private:mySlot(){};private:CSerialPort *p_sp;char str[1024];int recLen;
};int main()
{CSerialPort sp;mySlot receive(&sp);std::cout << "Version : " << sp.getVersion() << std::endl << std::endl;vector<SerialPortInfo> m_availablePortsList = CSerialPortInfo::availablePortInfos();if (0 == m_availablePortsList.size()){std::cout << "No valid port" << std::endl;return 0;}sp.init(m_availablePortsList[0].portName, // windows:COM1 Linux:/dev/ttyS0itas109::BaudRate9600, itas109::ParityNone, itas109::DataBits8, itas109::StopOne);sp.open();if (sp.isOpened()){std::cout << "open " << m_availablePortsList[0].portName << " success" << std::endl;}else{std::cout << "open " << m_availablePortsList[0].portName << " failed" << std::endl;return 0;}// 绑定接收函数sp.readReady.connect(&receive, &mySlot::OnSendMessage);// 写入数据sp.writeData("itas109", 7);for (;;);return 0;
}
  • CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)set(APP_NAME CSerialPortDemo)if(APPLE)find_library(IOKIT_LIBRARY IOKit)find_library(FOUNDATION_LIBRARY Foundation)
endif()include_directories(CSerialPort/include)file(GLOB_RECURSE COMMON_SOURCES CSerialPort/src/SerialPort.cpp CSerialPort/src/SerialPortBase.cpp CSerialPort/src/SerialPortInfo.cpp CSerialPort/src/SerialPortInfoBase.cpp)
IF (CMAKE_HOST_WIN32)file(GLOB_RECURSE OS_ABOUT_SOURCES CSerialPort/src/SerialPortInfoWinBase.cpp CSerialPort/src/SerialPortWinBase.cpp)
ELSEIF (CMAKE_HOST_UNIX)file(GLOB_RECURSE OS_ABOUT_SOURCES CSerialPort/src/SerialPortInfoUnixBase.cpp CSerialPort/src/SerialPortUnixBase.cpp)
ENDIF ()    add_executable( ${APP_NAME} CSerialPortDemo.cpp ${COMMON_SOURCES} ${OS_ABOUT_SOURCES})IF (WIN32)target_link_libraries( ${APP_NAME} setupapi )
elseif(APPLE)target_link_libraries( ${APP_NAME} ${FOUNDATION_LIBRARY} ${IOKIT_LIBRARY})
elseif(UNIX)target_link_libraries( ${APP_NAME} pthread )
ENDIF ()
  • 运行结果(windows下环回测试)
Version : https://github.com/itas109/CSerialPort - V4.1.1.210903open COM2 success
receive data : i, receive size : 1
receive data : t, receive size : 1
receive data : a, receive size : 1
receive data : s, receive size : 1
receive data : 1, receive size : 1
receive data : 0, receive size : 1
receive data : 9, receive size : 1

License

License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎

如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033


Reference:

  1. https://github.com/itas109/CSerialPort
  2. https://gitee.com/itas109/CSerialPort
  3. https://blog.csdn.net/itas109

CSerialPort教程(2) - CSerialPort源码简介相关推荐

  1. CSerialPort教程(1) - CSerialPort项目简介

    CSerialPort教程(1) - CSerialPort项目简介 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 CSe ...

  2. 135k代驾安装教程+功能模块源码+前端源码

    简介: 135k代驾安装教程+功能模块源码+前端源码 网盘下载地址: http://kekewangLuo.net/pOYRFCVcFvC0 教程: 微信公众号配置: 登录服务号,注意:必须是服务号, ...

  3. 后台管理系统怎么实现操作日志原理_springboot角色权限后台管理系统脚手架实战开发教程包含完整源码...

    自从猿来入此发布实战开发教程以来,我们截至目前一共发布了22个Java实战项目开发教程,从最基础的Java控制台实战项目到数据库封装教程再到swing的单机项目教程.servlet的web实战教程.s ...

  4. 【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )

    文章目录 一.ClassLoader 源码简介 二.BaseDexClassLoader 源码简介 三.DexClassLoader 源码简介 四.PathClassLoader 源码简介 五.InM ...

  5. 【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用简介 | Launcher 应用源码简介 | Launcher 应用快捷方式图标点击方法分析 )

    文章目录 一. Launcher 应用简介 二. Launcher 应用源码简介 三. Launcher 图标点击方法分析 一. Launcher 应用简介 Launcher 应用 : Android ...

  6. Hyperledger Fabric Rest API服务开发教程【含源码】

    Hyperledger Fabric Rest API服务开发教程[含源码] Hyperledger Fabric 提供了软件开发包/SDK以帮助开发者访问fabric网络 和部署在网络上的链码,但是 ...

  7. jsp mysql视频_手把手教你做jsp servlet mysql实现的图书管理系统附带视频开发教程和完整源码...

    上一个教程我们做的是对数据库框架底层原理的讲解,然后教大家做了一个自己的数据库框架,这次我们做的这个图书管理系统就是用我们上个教程自己写的数据库框架,整个项目做完框架运行的很稳定,没有出现任何问题.如 ...

  8. c语言程序设计教程赵乘,《C语言程序设计教程》例题源码.pdf

    <C语言程序设计教程>例题源码 练习一 [例1.1]打印 "常熟理工学院"的汉语拼音. 程序源码如下: voidmain() { printf("chang ...

  9. linux内核体系学习路径_Linux内核分析(一)linux体系简介|内核源码简介|内核配置编译安装...

    从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底,同时在博文中如果那些地方有问题还请各位大神为我讲解. 今天我们会分析到以下内容: 1. Linux体系结构简介 ...

最新文章

  1. java数数字及while和do while 的使用,以及程序的调试与验证
  2. Codeforces Round #294 (Div. 2)
  3. 常见激活函数及其求导相关知识
  4. Sentinel(七)之网关限流
  5. vue企业网站模板_模板网站VS定制网站,企业如何选择?
  6. bay trail android 平板,英特尔再推9款平板专用BayTrail-T处理器
  7. 卷积和池化后特征图的大小~
  8. HTTP长连接和短连接(转)
  9. JDBCUtils——DBCP
  10. jmeter使用_jmeter概念及使用
  11. 群晖nas存储系统原理_一篇看懂黑群晖重装系统
  12. JavaScript 实现全选,分组全选,列表折叠。
  13. 国密算法 SM2 公钥加密 非对称加密 数字签名 密钥协商 python实现完整代码
  14. 这届年轻人追热点、爱国货 2021年购物车里藏着“青年情绪”
  15. TestNg测试框架
  16. 沉默的大多数(王小波)
  17. 怎样恢复电脑丢失的文件?
  18. Kafka+Scram认证+eagle管理
  19. 开始闭关修炼 冥思微软之大未来
  20. P2550 彩票摇奖

热门文章

  1. 从指定位置删除指定长度的字符串(串)
  2. 开机启动卡在主板LOGO界面,并长时间提示检测中,最后启动失败
  3. javascript事件循环Event Loop,宏任务与微任务
  4. python-opencv 垫片缺陷检测
  5. Ubuntu安装AMD/ATI显卡驱动
  6. 多媒体计算机辅助教学的特性,多媒体计算机辅助教学系统定义及特点
  7. 横幅广告(1)Admob
  8. 【方向盘】YourBatman原创技术专栏
  9. 站外seo优化有用吗?值得投入时间和精力吗?
  10. SpringMVC源代码学习外传(一)xml命名空间的解析NamespaceHandler