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); //关闭串口句柄
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值