用API操作串口
// MyCom.h
UINT CommWatchProc(LPVOID pParam); // 串口监视线程函数
class CMyCom
{
public:
CMyCom();
~CMyCom();
BOOL SetupMyCom(); // 初始化端口
BOOL WriteMyCom(LPVOID lpSndBuffer, DWORD dwBytesToWrite); // 写端口
DWORD ReadMyCom(LPVOID lpInBuffer, DWORD dwBytesToRead=35); // 读端口
void CloseMyCom(); // 关闭端口
};
// MyCom.cpp
// 串行设备的初始化
// 利用CreateFile函数实现,该函数获得串行设备句柄并对其进行通信参数设置
// 包括设置输出/接受缓冲区大小、超时控制和事件监视等
BOOL CMyCom::SetupMyCom()
{
DCB dcb;
COMMTIMEOUTS timeouts;
if(bOpen)return FALSE; // 串口被占用
// 打开COM1
hComDev = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hComDev == INVALID_HANDLE_VALUE)
{
// MessageBox(NULL, _T("端口被占用,打印程序不能继续运行!"), _T("TRACE"), MB_OK);
return FALSE; // 打开端口失败
}
// 设置超时控制
SetCommTimeouts(hComDev, &timeouts);
// 设置接收缓冲区和输出缓冲区的大小
SetupComm(hComDev, 1024, 512);
// 获取缺省的DCB结构的值
GetCommState(hComDev, &dcb);
// 设定波特率为9600 bps
dcb.BaudRate = CBR_9600;
// 设定无奇偶校验
dcb.fParity = NOPARITY;
// 设定数据位为8
dcb.ByteSize = 8;
// 设定一个停止位
dcb.StopBits = ONESTOPBIT;
// 设定相应监视串口的错误和接收到字符两种事件响应
SetCommMask(hComDev, EV_ERR|EV_RXCHAR);
// 设置串行设备控制参数
SetCommState(hComDev, &dcb);
// 设置参数表示设备已打开
bOpen = TRUE;
// 创建一个人工重设,
hEvent = CreateEvent(NULL, FALSE, FALSE, "WatchEvent");
return TRUE;
}
// 数据发送
// 数据发送利用WriteFile函数实现。对于同步I/O操作,它的最后一个参数可为
// NULL;而对异步I/O操作,它的最后一个参数必需是一个指向OVERLAPPED结构的指针,
// 通过OVERLAPPED结构来获得当前的操作状态。
// lpSndBuffer为发送数据缓冲区指针,
// dwBytesToWrite为将要发送的字节长度
BOOL CMyCom::WriteMyCom(LPVOID lpSndBuffer, DWORD dwBytesToWrite)
{
BOOL bWriteState;
DWORD dwBytesWritten; // 实际发送的字节数
if(!bOpen)return FALSE; // 串口未打开
bWriteState = WriteFile(hComDev, lpSndBuffer, dwBytesToWrite, &dwBytesWritten, NULL);
if(!bWriteState || (dwBytesToWrite != dwBytesWritten))
return FALSE; // 发送数据失败
return TRUE;
}