重构串口驱动
前言:
最近调试串口获取机芯日志,要做个上位机工具能随时查看机芯的本地日志。起初想参考合泰源码做一份,但是考虑到通用性。如果未来要做其他项目,又得改串口类的代码,很麻烦。所以想整一份自己的专属串口类,方便后续移植使用。
网上参考了很多资料,基本上都是大同小异。打算自己重构一份,使用双线程,实现读写分离,环形数组收发数据。应用层可以向指定的环形数组,随时随地写入不定长度的数据。或者随时随地从指定的环形数组,读取不定长度的数据。
参考资料如下:
- 《MFC图文并茂详解.doc》
- 《SCOM_MFC2.rar》
- 《serial_src.zip》
- 《SerialCom_YiHai_TEST-master.zip》
- 《SerialComSoftware_自写详细注释.rar》
- 《VC_MFC串口通信编程详解.pdf》
- 《VC++串口通信20个经典源码合集.rar》
- 《串口通信处女作.zip》
- 《用MFC实现串口编程.doc》
关键API接口和结构体描述:
CreateFile 函数打开串口。
HANDLE CreateFile(
LPCTSTR lpFileName, // 指向文件名的指针
DWORD dwDesiredAccess, // 访问模式(写 / 读)
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针
DWORD dwCreationDisposition, // 如何创建
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 用于复制文件句柄
);
COMMTIMEOUTS 结构体,用来设置串口读写的超时时间
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; //读---间隔超时 ms 两字符之间的 间隔超时
DWORD ReadTotalTimeoutMultiplier; //读---时间系数 ms ReadTotalTimeoutMultiplier * 字节数 = 总超时
DWORD ReadTotalTimeoutConstant; //读---时间常量 ms 一次读取串口数据的固定超时
DWORD WriteTotalTimeoutMultiplier; //写---时间系数 ms WriteTotalTimeoutMultiplier * 字节数 = 总超时
DWORD WriteTotalTimeoutConstant; //写---时间常量 ms 一次写入串口数据的固定超时
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
DCB 结构体有28个参数,一般用来配置一些串口的主要参数
(1)DWORD BaudRate; 波特率设置。
(2)BYTE ByteSize; 数据位设置。
(3)DWORD fParity: 1; TRUE时, 支持奇偶检验。
(4)BYTE Parity; 奇偶检验位的设置
(5)BYTE StopBits; 停止位的设置
StopBits指定端口当前使用的停止位数,可取值:
取值 意义
ONESTOPBIT 1停止位
ONE5STOPBITS 1.5停止位
TWOSTOPBITS 2停止位
参考资料: https://blog.csdn.net/weixin_42639646/article/details/120319833
ReadFile 函数从串口读取数据
BOOL ReadFile(
HANDLE hFile, //文件的句柄
LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
DWORD nNumberOfBytesToRead, //要读入的字节数
LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针
LPOVERLAPPED lpOverlapped //如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。该结构定义了一