`
nathan09
  • 浏览: 145662 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Win CE串口通讯

 
阅读更多

今天学习了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); //关闭串口句柄
}

注:本文源码来自实验手册!!!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics