根据
《Visual C++ 实践与提高 — 串口通信与工程应用篇 第2版》 第7章内容整理
仅仅是演示 代码有漏洞
代码如下:
// SerialTG.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
HANDLE hCom;
HANDLE hThreadEvent;
DWORD ThreadProcEvent(LPVOID pParam);
bool bEventRun;
HWND hWnd;
DWORD dwThreadID;
OVERLAPPED Eol={0};
OVERLAPPED Wol={0};
OVERLAPPED Rol={0};
bool fStopMsg;
LONG OnReceiveEvent(void)
{
BYTE myByte[50];
DWORD dwRes;
DWORD dwRead;
DWORD dwErrors;
COMSTAT Rcs;
fStopMsg = true;
BOOL bResult ;
memset(myByte,0,sizeof(myByte));
ClearCommError(hCom,
&dwErrors,
&Rcs );
bResult = ReadFile(hCom,
&myByte,
9,
NULL,
&Rol);
if(bResult){
printf("recv success myByte = %s\r\n",myByte);
}else{
Rol.hEvent = CreateEvent(NULL,
TRUE,
FALSE,
NULL );
dwRes = WaitForSingleObject(Rol.hEvent,
5000 );
switch(dwRes){
case WAIT_OBJECT_0:
bResult = GetOverlappedResult(hCom,
&Rol,
&dwRead,
TRUE );
if(!bResult){
printf("fail\r\n");
}else{
printf("success dwRead = %d\r\n",dwRead);
printf("recv data = %s\r\n",myByte);
}
break;
case WAIT_TIMEOUT:
break;
default:
break ;
}
}
fStopMsg = false ;
return 0 ;
}
DWORD ThreadProcEvent(LPVOID pParam)
{
DWORD dwEvtMask;
DWORD dwRes;
Eol.hEvent = CreateEvent(NULL,
TRUE,
FALSE,
NULL );
while(bEventRun){
WaitCommEvent(hCom,
&dwEvtMask,
&Eol);
dwRes = WaitForSingleObject(Eol.hEvent,100);
switch(dwRes){
case WAIT_OBJECT_0:
switch(dwEvtMask){
case EV_RXCHAR:
OnReceiveEvent();
break;
case EV_TXEMPTY:
break ;
}
break;
}
}
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
hCom = CreateFile(TEXT("COM6"),
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL
);
if(hCom != INVALID_HANDLE_VALUE){
SetupComm(hCom,1024,512);
DCB myDCB;
GetCommState(hCom,&myDCB);
myDCB.BaudRate = CBR_9600; // 设置波特率9600
myDCB.fBinary = TRUE; // 设置二进制模式,此处必须设置TRUE
myDCB.fParity = FALSE; // 支持奇偶校验
myDCB.fOutxCtsFlow = FALSE; // No CTS output flow control
myDCB.fOutxDsrFlow = FALSE; // No DSR output flow control
myDCB.fDtrControl = DTR_CONTROL_DISABLE; // No DTR flow control
myDCB.fDsrSensitivity = FALSE; // DSR sensitivity
myDCB.fTXContinueOnXoff = TRUE; // XOFF continues Tx
myDCB.fOutX = FALSE; // No XON/XOFF out flow control
myDCB.fInX = FALSE; // No XON/XOFF in flow control
myDCB.fErrorChar = FALSE; // Disable error replacement
myDCB.fNull = FALSE; // Disable null stripping
myDCB.fRtsControl = RTS_CONTROL_DISABLE; //No RTS flow control
myDCB.fAbortOnError = FALSE; // 当串口发生错误,并不终止串口读写
myDCB.ByteSize = 8; // 数据位,范围:4-8
myDCB.Parity = NOPARITY; // 校验模式
myDCB.StopBits = 0; // 1位停止位
SetCommState(hCom,&myDCB);
}else{
printf("创建串口失败!\r\n");
}
DWORD dwParam;
if(!SetCommMask(hCom,EV_RXCHAR |EV_TXEMPTY)){
printf("建立事件掩码失败 \r\n");
}
hThreadEvent = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadProcEvent,
&dwParam,
0,
&dwThreadID );
if(hThreadEvent == INVALID_HANDLE_VALUE){
printf("事件线程创建失败!");
}
bEventRun = true ;
BYTE myByte[9]="AT\r\n";
Wol.hEvent = CreateEvent(NULL,
TRUE,
FALSE,
NULL );
WriteFile(hCom,
&myByte,
4,
NULL,
&Wol );
printf("Running\r\n");
while(1){
Sleep(3000);
}
return 0;
}
运行结果:
Running
recv success myByte = AT
OK