📄 serialportcontrol.cpp
字号:
#include "StdAfx.h"
#include "SerialPortControl.h"
HANDLE hCom; //全局变量,串口句柄
HANDLE hCommThread; //全局变量,串口线程
DWORD WINAPI SerialPort1ThreadProcess(HWND hWnd);
volatile bool hEventRun;
HWND hWnd;
DWORD swThreadID;
OVERLAPPED Eol={0};
OVERLAPPED Wol={0};
OVERLAPPED Rol={0};
volatile bool fStopMsg;
//打开并设置COM1
BOOL OpenSerialPort1()
{
hCom=CreateFile(
"COM1",
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 wdcb;
GetCommState (hCom, &wdcb);
wdcb.BaudRate=CBR_115200;//波特率:115200,其他:不变
wdcb.fBinary=true;
wdcb.fParity=true;
wdcb.ByteSize=8;
wdcb.Parity=ODDPARITY;
wdcb.StopBits=ONESTOPBIT;
SetCommState (hCom, &wdcb);
PurgeComm(hCom, PURGE_TXCLEAR);//清空缓冲区
}
else
{
AfxMessageBox("创建窗口失败!!");
}
return true;
}
//事件线程函数
DWORD WINAPI SerialPort1ThreadProcess(HWND hWnd)
{
DWORD dwEvtMask,dwRes;
Eol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
while (hEventRun)
{
WaitCommEvent(hCom,&dwEvtMask,&Eol);
dwRes=WaitForSingleObject(Eol.hEvent,100);
switch(dwRes)
{
case WAIT_OBJECT_0:
switch(dwEvtMask)
{
case EV_RXCHAR:
if(!fStopMsg)
{
fStopMsg=true;
::PostMessage(hWnd,
COM_RECVDATA,
0,
(LPARAM)EV_RXCHAR);
}
break;
case EV_TXEMPTY:
break;
default:
break;
}
break;
case WAIT_TIMEOUT:
break;
default:
break;
}
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -