今天学习了wince下的串口通讯实验。现小结如下:
1。设备文件名:设备文件名前缀由3个大写字母组成, 用来标识与特殊流接口驱动程序相对应的特殊设备文件名。文件名前缀存储在注册表的相应驱动程序的键值中。如COM(串行驱动程序)、ACM(音频压缩管理器)等。
2。访问设备驱动方法:通过CreateFile、ReadFile、 WriteFile、 DeviceIoControl等函数访问。
3。串口通讯实现过程:
1)打开串行端口:HANDLE hCom = CreateFile(L"COM1:", GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0, NULL);//注意加冒号!!!!
2)设置DCB:
int InitDCB(HANDLE hPort)
{
DCB PortDCB;//DCB串口参数结构
PortDCB.DCBlength = sizeof(DCB);
GetCommState(hPort,&PortDCB);
PortDCB.BaudRate = 9600;//波特率
PortDCB.ByteSize = 8; //数据位
PortDCB.Parity = NOPARITY; //校验位
PortDCB.StopBits = ONESTOPBIT; //停止位
return SetCommState (hPort, &PortDCB);
}
3)为指定的串口设置响应延时时间参数:
int InitCommTimeouts(HANDLE hPort)
{
COMMTIMEOUTS CommTimeouts;//时间参数
GetCommTimeouts (hPort, &CommTimeouts);//取得时间参数
CommTimeouts.ReadIntervalTimeout = MAXDWORD; //最大时间参数
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.ReadTotalTimeoutConstant = 0;
CommTimeouts.WriteTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutConstant = 0;
return SetCommTimeouts (hPort, &CommTimeouts);
}
4)设置字符事件:SetCommMask(hCom , EV_RXCHAR);
5)设置串口读写缓冲区大小:SetupComm(hCom ,2048,2048);
6)创建接收线程:com_hThread = CreateThread(NULL, 0, ReadThreadPort, this, 0, NULL);
由于WinCE不支持重叠I/O。因此不要从主线程读写大量的串行数据,因为这些线程还负责处理用于它们窗口的消息队列。不能因为读大量的串行数据而阻塞它们。因此应用单独的专有线程来读写串口。
DWORD WINAPI ReadThreadPort(LPVOID lpvoid)//线程函数实现
{
CComChatDlg* pDlg = (CComChatDlg*)lpvoid;
BOOL fReadState;//读串口返回值
DWORD dwCommModemStatus;
DWORD dwLength;//未读字节个数
COMSTAT ComStat;//串口状态结构
DWORD dwErrorFlags;//错误码
DWORD dwBytesRead;//读字节个数
while (pDlg->com_hCom!=INVALID_HANDLE_VALUE&&pDlg->com_hCom!=NULL)
{
WaitCommEvent (pDlg->com_hCom,&dwCommModemStatus, NULL);//等待串口事件
if (dwCommModemStatus & EV_RXCHAR) //如果为数据到达事件
{
ClearCommError(pDlg->com_hCom,&dwErrorFlags,&ComStat);//读取串口状态并清除状态标志
dwLength=ComStat.cbInQue;//读缓冲区中的未读字节个数
if(dwLength>0&&dwLength<(500*sizeof(WCHAR)))
{ //读串口
memset(pDlg->com_ReadChar,0,sizeof(WCHAR)*500);
fReadState=ReadFile(pDlg->com_hCom,pDlg->com_ReadChar,dwLength,&dwBytesRead,NULL);
if(!fReadState)//读取失败不理会
{
}
else//读取成功
{
//插入读入的字符串
pDlg->com_Msg.Insert(0,pDlg->com_ReadChar);
pDlg->UpdateData(FALSE);
}
}
//返回串口状态
GetCommModemStatus (pDlg->com_hCom,&dwCommModemStatus);
}
}
return 0;
}
7)最后关闭串口:
oid ShutPort(HANDLE hPort)//关闭串口
{
SetCommMask(hPort,0);//取消串口事件
CloseHandle(hPort); //关闭串口句柄
}
注:本文源码来自实验手册!!!