CSerialPort类详解:串口通信的API使用指南

4星 · 超过85%的资源 需积分: 50 76 下载量 37 浏览量 更新于2024-07-26 收藏 89KB DOC 举报
"CSerialPort类是用于操作串行通信接口的类库,它提供了一系列的成员函数来实现对串口的全面控制。这个类库包括两个主要的类:CSerialException,用于处理串口操作中可能出现的异常情况,以及CSerialPort,实际执行串口的打开、关闭以及数据的读写等操作。" CSerialPort类是基于Windows API构建的,主要用于处理串行端口(COM端口)的操作。这个类提供了丰富的功能,使得开发者可以方便地进行串行通信,而无需深入了解底层的通信协议和细节。 1. **异常处理**: - `CSerialException` 类用于捕获和处理在串口操作中可能出现的错误。例如,当尝试打开一个已经被占用的端口时,或者在传输过程中发生错误,都会抛出一个`CSerialException`。`GetErrorMessage` 方法返回错误消息,`m_dwError` 成员变量存储了错误代码。 2. **串口操作**: - `CSerialPort` 类包含了串口管理的主要功能。构造函数`CSerialPort` 初始化对象,析构函数`~CSerialPort` 关闭并释放相关资源。 - `Open` 和 `Close` 分别用于打开和关闭指定的串口。 - `Attach` 和 `Detach` 用于附加和分离串口句柄,允许动态绑定到已存在的串口。 - `operator HANDLE` 允许将`CSerialPort`对象转换为系统句柄,以便在需要低级别操作时使用。 - `IsOpen` 检查串口是否已经打开。 - `Dump` 用于调试,打印串口当前的状态信息。 3. **数据传输**: - `Read` 和 `ReadEx` 用于从串口读取数据,`Write` 和 `WriteEx` 用于向串口写入数据。 - `TransmitChar` 单独发送一个字符。 - `GetOverlappedResult` 获取异步读写操作的结果。 - `CancelIo` 取消正在进行的I/O操作。 4. **配置和状态控制**: - `GetConfig` 和 `SetConfig` 用于获取和设置串口的配置,如波特率、数据位、停止位、校验位等。 - `GetDefaultConfig` 和 `SetDefaultConfig` 获取和设置默认配置。 - `ClearBreak` 和 `SetBreak` 控制串口的断点状态。 - `ClearError` 清除串口错误。 - `GetStatus` 和 `GetState` 获取串口的状态信息。 - `SetState` 修改串口的工作状态,如流控、DTR (Data Terminal Ready) 和 RTS (Request To Send) 线的控制。 5. **高级功能**: - `Escape` 执行特定的串口控制命令,如设置特殊通信模式。 - `ClearDTR` 和 `ClearRTS` 用于清除DTR和RTS信号,`SetDTR` 和 `SetRTS` 设置这些信号。 - `SetXOFF` 和 `SetXON` 控制流量控制,发送XOFF字符暂停数据传输,发送XON字符恢复数据传输。 通过这些接口,开发者可以轻松地创建应用程序,实现与外部设备的串行通信,如数据采集、远程控制等。无论是简单的数据传输还是复杂的通信协议实现,CSerialPort类都提供了足够的工具和灵活性。
2016-12-18 上传
CSerialPort First Version by Remon Spekreijse on 2000-02-08 http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2483/A-communication-class-for-serial-port.htm Second Version by mrlong on 2007-12-25 https://code.google.com/p/mycom/ 增加 ClosePort 增加 WriteToPort 两个方法 增加 SendData 与 RecvData 方法 by liquanhai on 2011-11-04 http://blog.csdn.net/liquanhai/article/details/4955253 增加 ClosePort 中交出控制权,防止死锁问题 by liquanhai on 2011-11-06 http://blog.csdn.net/liquanhai/article/details/6941574 增加 ReceiveChar 中防止线程死锁 by viruscamp on 2013-12-04 https://github.com/viruscamp/CSerialPort 增加 IsOpen 判断是否打开 修正 InitPort 中 parity Odd Even 参数取值错误 修改 InitPort 中 portnr 取值范围,portnr>9 时特殊处理 取消对 MFC 的依赖,使用 HWND 替代 CWnd,使用 win32 thread 函数而不是 MFC 的 增加用户消息编号自定义,方法来自 CnComm by itas109 on 2014-01-10 http://blog.csdn.net/itas109/article/details/18358297 解决COM10以上端口无法显示的问题 扩展可选择端口,最大值MaxSerialPortNum可以自定义 添加QueryKey()和Hkey2ComboBox两个方法,用于自动查询当前有效的串口号。 by liquanhai on 2014-12-18 增加一些处理措施,主要是对减少CPU占用率 by itas109 on 2016-05-07 http://blog.csdn.net/itas109 修复每次打开串口发送一次,当串口无应答时,需要关闭再打开或者接收完数据才能发送的问题。 解决办法:在m_hEventArray中调整m_hWriteEvent的优先级高于读的优先级。CommThread(LPVOID pParam)函数中读写的位置也调换。 参考:http://zhidao.baidu.com/link?url=RSrbPcfTZRULFFd2ziHZPBwnoXv1iCSu_Nmycb_yEw1mklT8gkoNZAkWpl3UDhk8L35DtRPo5VV5kEGpOx-Gea 修复停止位在头文件中定义成1导致SetCommState报错的问题,应为1对应的停止位是1.5。UINT stopsbits = ONESTOPBIT switch(stopbits)和switch(parity)增加默认情况,增强程序健壮性 by itas109 on 2016-06-22 http://blog.csdn.net/itas109 增加ReceiveStr方法,用于接收字符串(接收缓冲区有多少字符就接收多少字符)。 解决ReceiveChar只能接收单个字符的问题。 by itas109 on 2016-06-29 http://blog.csdn.net/itas109 解决RestartMonitoring方法和StopMonitoring方法命令不准确引起的歧义,根据实际作用。 将RestartMonitoring更改为ResumeMonitoring,将StopMonitoring更改为SuspendMonitoring。 增加IsThreadSuspend方法,用于判断线程是否挂起。 改进ClosePort方法,增加线程挂起判断,解决由于线程挂起导致串口关闭死锁的问题。 增加IsReceiveString宏定义,用于接收时采用单字节接收还是多字节接收 by itas109 on 2016-08-02 http://blog.csdn.net/itas109 https://github.com/itas109 改进IsOpen方法,m_hComm增加INVALID_HANDLE_VALUE的情况,因为CreateFile