推荐这篇文章
/*------------------------------------------------------------------------------------
* 版权声明: 在保证功能完整性的前提下,任何人都可以对源码进行修改和传播, 但务必包含此
* 文件说明及原作者信息!
*
* 类名: (C)EasyComm
* 作者: 魏孙鼎, weisunding(at)hotmail.com
* 日期: 2005-12-09
* 描述: 一个简单串口读写封装类, 支持同步和异步模式,默认为同步读写模式
*
*
* 接口: - Open(...) => 打开串口
* - Setup(...) => 设置串口参数
* - Read(...) => 读串口
* - Write(...) => 写串口
* - Close() => 关闭串口
*
* 异步监视模式
* - SetNotifyNum(...) => 设置通知字节数
* - SetHWND(...) => 设置要接收消息(EasyComm::WM_ONCOMM)的窗体句柄
* - StartListen() => 开始监视线程
* - StopListen() => 停止监视线程
* - OnReceive(...) => 数据到达时被调用, 虚函数,用于无窗体异步模式
*
* 示例
*
* EasyComm serial;
* serial.Open(1);//打开COM1
* serial.Setup(9600, 8, NOPARITY, ONESTOPBIT);
* serial.Write("Hello World!");
*
* char buffer[1024];
* serial.Read(buffer, 1024, 50);//最长等待50ms
*
*/////////////////////////////////////////////////////////////////////////////////////
#ifndef __EASY_COMM__
#define __EASY_COMM__
#pragma warning(disable: 4800) //disable waring of TRUE => true
#pragma warning(disable: 4267) //disable waring of size_t => int
#include <windows.h>
class EasyComm
{
public:
// 用于窗体模式的数据到达消息
enum {
WM_ONCOMM = WM_USER + 2005};
EasyComm(void) : m_hComm(NULL), m_hThread(NULL), m_bListen(false), m_nNotifyNum(1), m_hWnd(NULL)
{
memset(&m_WaitOverlapped, 0, sizeof(OVERLAPPED));
memset(&m_ReadOverlapped, 0, sizeof(OVERLAPPED));
memset(&m_WriteOverlapped, 0, sizeof(OVERLAPPED));
m_WaitOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
m_ReadOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
m_WriteOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
m_hCommEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
}
//---------------------------------------
// 功能: 打开串口
// @port 串口号
//---------------------------------------
bool Open(int port)
{
if (m_hComm)
return false; //串口已打开
char fileName[64] = {
0};
sprintf(fileName, "////.//COM%d", port);
m_nPort = port;
m_hComm = CreateFile(fileName,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0