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