直接贴出串口异步方式多线程操作代码,有注释,至于函数的更详细的功能,可以百度一下。
#include<windows.h>
#include<iostream>
#include <iomanip>
using namespace std;
DWORD WINAPI CommSend(LPVOID lpParameter);
DWORD WINAPI CommReceive(LPVOID lpParameter);
OVERLAPPED overRead,overWrite;
HANDLE m_hCom;
int main()
{
//打开串口
m_hCom=CreateFile("COM9", //文件名
GENERIC_READ|GENERIC_WRITE,//读写模式
0, //独占模式
NULL, //安全属性
OPEN_EXISTING, //创建文件的属性
FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED, //异步方式打开
NULL);
if(m_hCom==INVALID_HANDLE_VALUE)
{
cout<<"comm create error!"<<endl;
return 0;
}
//配置串口
DCB dcb;
GetCommState(m_hCom,&dcb);
dcb.BaudRate = 115200; // Current baud
dcb.fBinary = TRUE; // Binary mode; no EOF check
dcb.fParity = TRUE; // Enable parity checking
dcb.fOutxCtsFlow = FALSE; // No CTS output flow control
dcb.fOutxDsrFlow = FALSE; // No DSR output flow control
dcb.fDtrControl = DTR_CONTROL_ENABLE; // DTR flow control type
dcb.fDsrSensitivity = FALSE; // DSR sensitivity
dcb.fTXContinueOnXoff = TRUE; // XOFF continues Tx
dcb.fOutX = FALSE; // No XON/XOFF out flow control
dcb.fInX = FALSE; // No XON/XOFF in flow control
dcb.fErrorChar = FALSE; // Disable error replacement
dcb.fNull = FALSE; // Disable null stripping
dcb.fRtsControl = RTS_CONTROL_ENABLE; // RTS flow control
dcb.fAbortOnError = FALSE; // Do not abort reads/writes on // error
dcb.ByteSize = 8; // Number of bits/byte, 4-8
dcb.Parity = NOPARITY; // 0-4=no,odd,even,mark,space
dcb.StopBits = ONESTOPBIT; // 0,1,2 = 1, 1.5, 2 /
if(!SetCommState(m_hCom, &dcb))
{
printf("error=%d\n",GetLastError());
}
//设置缓冲区大小
SetupComm(m_hCom,1024,1024);
//缓冲区清空并强制收发数据
PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
//超时设置
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=100;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=0;
TimeOuts.WriteTotalTimeoutConstant=0;
SetCommTimeouts(m_hCom,&TimeOuts);
//创建读事件
memset(&overRead,0,sizeof(OVERLAPPED));
overRead.hEvent=CreateEvent(NULL,true,false,NULL);
//创建写事件
memset(&overWrite,0,sizeof(OVERLAPPED));
overWrite.hEvent=CreateEvent(NULL,true,false,NULL);
//创建收线程
HANDLE rThread=CreateThread(NULL,0,CommReceive,NULL,0,NULL);
CloseHandle(rThread);
//创建读线程
HANDLE sThread=CreateThread(NULL,0,CommSend,NULL,0,NULL);
CloseHandle(sThread);
while(1)
{
;
}
CloseHandle(m_hCom);
return 0;
}
DWORD WINAPI CommSend(LPVOID lpParameter)
{
DWORD dwBytesWrite;
DWORD WriteFlag;
DWORD numWrite;
DWORD sr;
char CommandStr[]="AT+CSQ\r";
while(1)
{
//写数据
WriteFlag=WriteFile(m_hCom,CommandStr,strlen(CommandStr),&dwBytesWrite,&overWrite);
if(!WriteFlag)
{
if(GetLastError()==ERROR_IO_PENDING)
{
sr = GetOverlappedResult(m_hCom,&overWrite,&numWrite,true);
cout<<"numWrite="<<numWrite<<endl;
PurgeComm(m_hCom,PURGE_TXABORT | PURGE_TXCLEAR);
}
}
Sleep(1000);
}//end of while
return 0;
};
DWORD WINAPI CommReceive(LPVOID lpParameter)
{
char str[1024];
DWORD dwBytesRead;
DWORD readFlag;
DWORD numRead;
DWORD rr ;
memset(str,0,1024);
while(1)
{
//读数据
readFlag=ReadFile(m_hCom,str,128,&dwBytesRead,&overRead);
if(!readFlag)
{
if(GetLastError()==ERROR_IO_PENDING)
{
rr = GetOverlappedResult(m_hCom,&overRead,&numRead,true);
cout<<"numRead="<<numRead<<endl;
cout<<str;
PurgeComm(m_hCom, PURGE_RXABORT | PURGE_RXCLEAR);
memset(str,0,numRead);
}
}//end of if
}//end of while
return 0;
};