串口通讯可以使用MFC控件,但是vs2010里边默认不带串口控件。
串口通讯也可以通过文件来操作,用的是Win32的API函数。
下边主要讲通过文件操作。
步骤:
一、打开串口
HANDLE hCom; //串口句柄
hCom = CreateFile( s,//COM口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式,不能共享
NULL,//安全属性
OPEN_EXISTING, //串口通讯必须为OPEN_EXISTING
0, //同步方式,FILE_FLAG_OVERLAPPED异步方式
NULL//串口通讯必须为NULL
);
if( hCom==INVALID_HANDLE_VALUE )
{
pDlg->MessageBox("打开串口失败!");
return 0;
}
参数:
s:是个字符串,“COM1”,“COM2”,“COM3”,“COM4”,“COM5”等等,大小写均可。
串口操作必须用同步方式打开文件。
二、配置串口
//设置波特率
DCB dcb;
GetCommState(hCom, &dcb); //先获取
((CComboBox*)pDlg->GetDlgItem(IDC_COMBO_BAUDRATE))->GetWindowText(s);
dcb.BaudRate = atoi(s);
dcb.Parity = 0;//校验方式为无校验
dcb.ByteSize = 8;//数据位为8位
dcb.StopBits = ONESTOPBIT;//停止位为1位
dcb.DCBlength = sizeof(DCB);//必须重新计算长度
SetCommState(hCom, &dcb); //在设置
//设置接收间隔超时
COMMTIMEOUTS timeouts;
GetCommTimeouts(hCom, &timeouts);//先获取
timeouts.ReadIntervalTimeout = 1;//间隔超时1ms
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hCom, &timeouts);//再设置
波特率的几个参数:
BaudRate :u32_t类型,比如:9600 ,19200等等
Parity :校验,0-4=None,Odd,Even,Mark,Space
ByteSize :数据位数,一般是8
StopBits :停止位,0,1,2 = 1, 1.5, 2
接收间隔超时的几个参数:
ReadIntervalTimeout:两字符之间最大的延时,毫秒单位。超时读函数立即返回。
ReadTotalTimeoutMultiplier:设置成0。
ReadTotalTimeoutConstant :接收总超时,毫秒单位。发出信息后,读取数据,会阻塞,这段时间内没有收到数据,读函数超时返回。
WriteTotalTimeoutMultiplier :设置成0。不使用写超时
WriteTotalTimeoutConstant :设置成0。不使用写超时
三、发送数据,
三项内容:设置接收总超时,清空内核发送缓冲,发送
//设置接收总超时
GetCommTimeouts(hCom, &timeouts);
timeouts.ReadTotalTimeoutConstant = 1000;//1秒
SetCommTimeouts(hCom, &timeouts);
PurgeComm(hCom, PURGE_TXCLEAR|PURGE_TXABORT);//清空内核发送缓冲
WriteFile( hCom, pDlg->m_pbSendBuf, i, &dwBytesWritten, NULL );//发送
参数:待发送数据指针,待发送数据个数,实际已发送数据个数指针(out)
四、接收数据
三项内容:清空内核接收缓冲,清空接收数组,读取串口数据
PurgeComm(hCom, PURGE_RXCLEAR|PURGE_RXABORT);//清空内核接收缓冲
memset( pDlg->m_pbRecvBuf, 0, BUF_LEN );//清空接收缓冲区
ReadFile( hCom, pDlg->m_pbRecvBuf, BUF_LEN, &nLenOut, NULL);//读取串口,会阻塞,超时返回
参数:接收缓冲区,接收缓冲区长度,实际接收数据个数指针
五、关闭串口
CloseHandle(hCom);//关闭串口