步骤:
1.打开串口
2.读取串口的DCB
3.设置串口事件:接收到一个字符
4.设置接收与发送的缓冲区大小
5.修改DCB
6.设置串口的DCB
7.读取超时参数
8.修改超时参数
9.设置超时参数
10. 清除收/发缓冲区
11.创建串口接收线程退出事件
12.定义串口接收线程
13.创建串口接收线程
14.发送数据
代码例程
接收线程
DWORD WINAPI CommRecvTread(LPVOID lparam)
{
DWORD dwLength;
char *recvBuf = new char[1024];
CSerialPortDlg *pDlg = (CSerialPortDlg*)lparam;
while(TRUE)
{ if (pDlg->m_hComm != INVALID_HANDLE_VALUE)
{ BOOL fReadState = ReadFile(pDlg->m_hComm, recvBuf, 3, &dwLength, NULL);
if(!fReadState)
{
//MessageBox(_T("err"));
}
else
{
if(dwLength != 0)
{
//OnCommRecv(pDlg, recvBuf, dwLength); /
TRACE("Rx %d byte:/t", dwLength);
for (int i=0;i<dwLength;i++)
{
TRACE("[%X] ", recvBuf[i]);
}
TRACE("/r/n");
}
}
}
}
delete[] recvBuf;
return 0;
}
打开串口
{
// 打开串口
m_hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if(m_hComm == INVALID_HANDLE_VALUE)
{
MessageBox(_T("无法打开端口或端口已打开!请检查是否已被占用."));
return ;
}
GetCommState(m_hComm, &dcb); // 读取串口的DCB
dcb.BaudRate = CBR_9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
// dcb.fParity = FALSE; // 禁止奇偶校验
// dcb.fBinary = TRUE;
// dcb.fDtrControl = 0; // 禁止流量控制
// dcb.fRtsControl = 0;
// dcb.fOutX = 0;
// dcb.fInX = 0;
// dcb.fTXContinueOnXoff = 0;
SetCommMask(m_hComm, EV_RXCHAR); 串口事件:接收到一个字符
//SetupComm(m_hComm, 16384, 16384); 设置接收与发送的缓冲区大小
SetupComm(m_hComm, 128, 128);
if(!SetCommState(m_hComm, &dcb)) // 设置串口的DCB //
{
MessageBox(_T("无法按当前参数配置端口,请检查参数!"));
//ClosePort();
SetCommMask(m_hComm, 0);
PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); // 清除收/发缓冲
CloseHandle(m_hComm); // 关闭串口操作句柄
m_hComm = INVALID_HANDLE_VALUE;
return ;
}
//设置超时参数
COMMTIMEOUTS CommTimeOuts;
GetCommTimeouts(m_hComm, &CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout = 10; // 接收字符间最大时间间隔
CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
CommTimeOuts.ReadTotalTimeoutConstant = 10; // 读数据总超时常量
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
if(!SetCommTimeouts(m_hComm, &CommTimeOuts))
{
MessageBox(_T("无法设置超时参数!"));
//ClosePort();
SetCommMask(m_hComm, 0);
PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); // 清除收/发缓冲
CloseHandle(m_hComm); // 关闭串口操作句柄
m_hComm = INVALID_HANDLE_VALUE;
return ;
}
PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); // 清除收/发缓冲区
m_ExitThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // 创建串口接收线程退出事件
DWORD IDThread;
HANDLE hRecvThread; // 接收线程句柄
// 创建串口接收线程
hRecvThread = CreateThread(0, 0, CommRecvTread, this, 0, &IDThread);
if (hRecvThread == NULL)
{
MessageBox(_T("创建接收线程失败!"));
return;
}
TRACE("/r/n打开串口成功!/r/n");
}
发送数据
{
char dd[] = "123456";
DWORD sndLen;
WriteFile(m_hComm, dd, 6, &sndLen, NULL); //从串口发送数据
FlushFileBuffers(m_hComm);
}