wince串口通信(续)

 

DWORD CSerial::WritePort(TCHAR *buf,DWORD dwCharToWrite)

{

       BOOL fWriteState;

       DWORD dwBytesWritten;

       //写入数据

       fWriteState=WriteFile(hPort,buf,dwCharToWrite*sizeof(TCHAR),&dwBytesWritten,NULL);

       if(!fWriteState)

       {

              //不能写数据

              MessageBox(NULL,TEXT("Can't Write String to Comm"),TEXT("Error"),MB_OK);

              dwBytesWritten=0;

       }

       return dwBytesWritten;

}

DWORD WINAPI ReadPortThread(LPVOID lpvoid)

{

       BOOL fReadState;

       DWORD dwCommModemStatus;

       DWORD dwLength;

       COMSTAT ComStat;

       DWORD dwErrorFlags;

       while (hPort != INVALID_HANDLE_VALUE)

       {

              //等待串口的事件发生

              WaitCommEvent (hPort, &dwCommModemStatus, 0);

              if (dwCommModemStatus & EV_RXCHAR)

              {

                     ClearCommError(hPort,&dwErrorFlags,&ComStat);

                     //cbInQue返回在串行驱动程序输入队列中的字符数

                     dwLength=ComStat.cbInQue;

                     if(dwLength>0)

                     {

                            //从串口读取数据

                            TCHAR* buf=new TCHAR[256];

                            fReadState=ReadFile(hPort,buf,dwLength,&dwLength,NULL);

                            if(!fReadState)

                            {

                                   //不能从串口读取数据

                                   MessageBox(NULL,TEXT("Error in read from serial port"),TEXT("Read Error"),MB_OK);

                            }

                            else

                            {

                                   //把数据赋值给全局变量

                                   strInChar=buf;

                            }

                            delete[] buf;

                     }    

              }

             

              GetCommModemStatus (hPort, &dwCommModemStatus);

       }

       return 0;

}

BOOL CSerial::ClosePort(HANDLE hCommPort)

{

       if (hCommPort != INVALID_HANDLE_VALUE)

       {

              //设置连接属性为FALSE

              m_bConnected=FALSE;

              //结束线程中WaitCommEvent的等待

              SetCommMask(hPort,0);

             

              //阻塞至线程停止

              if(hReadThread)

              {

                     TerminateThread(hReadThread,0);

                     CloseHandle(hReadThread);

              }

             

              //清除端口上指定信号的状态

              EscapeCommFunction(hPort,CLRDTR);

              EscapeCommFunction(hPort,CLRRTS);

              //清除驱动程序内部的发送和接收队列

              PurgeComm(hPort,PURGE_TXCLEAR|PURGE_RXCLEAR);

              //关闭串口

              CloseHandle (hCommPort);

              hCommPort = INVALID_HANDLE_VALUE;

              return TRUE;

       }

       else

       {

              return TRUE;

       }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值