WinCE下的串口通信开发(VS2005,VB.Net,VC++)

WinCE下的串口通信开发(VS2005,VB.Net,VC++)
 

WinCE下的串口通信开发

一、利用Visual Basic 开发很简单,因为有现成的控件可以直接调用

以VS2005为例,首先要从工具箱中找到SerialPort控件,将其拖到设计视图的下方,因为这些控件(包括定时控件Timer等)在运行的时候不会显示在视图中的。可以通过两种方法对串口进行配置,即点击控件的属性页码,在里面直接修改;也可以通过代码来配置成功,主要如下:

If VBSerial.IsOpen Then

           VBSerial.Close()

       End If

        '串口设置:9600-N-8-1

       With VBSerial

           .PortName = "COM2"

           .BaudRate = 9600

           .Parity = Parity.None

           .ReceivedBytesThreshold = 13 '接受的数据包长度

           .DataBits = 8

           .StopBits = StopBits.One

        End With

串口的基本配置完成以后,下一步就是重要的事件属性了,既要设置数据接收的事件属性,在串口控件的属性页,点击事件标志(闪电状的),右方输入事件函数的名字即可,然后在事件函数中用Try,Catch读取串口字符,代码如下:

Dim rec_byte(LENGTH) As Byte '串口接收数据包     LENGTH是一个宏定义的数据包长度

       Try

           data_num = VBSerial.BytesToRead '串口接收到的字节数,用于测试调校程序

           Me.VBSerial.Read(rec_byte, 0, LENGTH)

           …………

           …………

           操作数组rec_byte(LENGTH)即可完成拆包等工作

       Catch ex AsTimeoutException       '超时后的处理,包括读、写超时等

           Timer1.Enabled = False

           VBSerial.Close()

           System.Threading.Thread.Sleep(300)

        End Try

至此,即可完成Vb2005 开发WinCE的串口简单操作。

 

二、利用Visual C++开发

Visual C++没有封装好的现成通信控件可以直接调用,故需要用API函数或者第三方的类,这里推荐一个现成的类,见参考文件1中第十章的内容,这个类的详细内容与使用方法,书中写的已经非常仔细,这里我只将我的一点建议叙述,该类的读线程代码主要如下:

while (TRUE)

     {

         if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))

         {            

              SetCommMask(ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );

              //表示串口收到字符    

              if (evtMask & EV_RXCHAR)

              {

                   ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);

                   if(cmState.cbInQue == (ceSeries->m_RThreshold) )//这个if内的内容是我的测试

                   {

                   willReadLen= cmState.cbInQue ;

                   if (willReadLen <= 0)

                   {

                       continue;

                   }

                  

                   //分配内存

                   readBuf= new BYTE[willReadLen];

                   ZeroMemory(readBuf,willReadLen);

                   //读取串口数据

                   ReadFile(ceSeries->m_hComm,readBuf, willReadLen, &actualReadLen,0);

                  

                   //如果读取的数据大于0,

                   if (actualReadLen>0)

                   {

                       //触发读取回调函数

                       if (ceSeries->m_OnSeriesRead)

                       {
                             ceSeries->m_OnSeriesRead(ceSeries->m_pOwner,readBuf,actualReadLen);
                        }

                   }

 

                   //释放内存

                   delete[] readBuf;

                   readBuf= NULL;

                   }

              }

         }

         //如果收到读线程退出信号,则退出线程

         if(WaitForSingleObject(ceSeries->m_hReadCloseEvent,500) == WAIT_OBJECT_0)

         {

              break;

         }

}

原来的代码中没有那个if来限制,这样每次读取的字符数最多有8个(之前我测试的时候,发现如果数据包长度大于8,就需要分几次读完,给实际应用中造成了不便),此处我加一个if语句来判别:

if(cmState.cbInQue ==(ceSeries->m_RThreshold) )

cmState.cbInQue表示现在的接受缓冲区队列中的字符个数,而ceSeries->m_RThreshold是需要预先设置好的,在串口的初始化中设置:

if(m_pSerial->OpenPort (this ,2,9600,0,8,0,16))

         SetTimer(1,1000,NULL);

     else

     AfxMessageBox(L"串口打开失败");

最后一个16代表设置的数据包字符个数,这个是由通信协议来确定的。这样每次当检测事件为收到字符时,先等到接收缓冲区队列中的字符个数是16,然后才一次性读取字符,再发送消息给主线程,便于在主线程中一次处理拆包解析工作。

 

 

 

参考文献

[1] 汪兵.Windows CE 嵌入式高级编程与实例详解(用C++实现),[M].中国水利水电出版社,2008

转载于:https://www.cnblogs.com/fozu/p/3616070.html

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
wince通过串口控制继电器的程序 包括串口通信全部底层代码 30多个按钮 互锁等处理都用类规范化 3种 1按钮和灯 2按钮和文字 3按钮文字和互锁另一组 public Form1 f1; public bool bigbl; public struct tp1 { public int n; public led LED led; public bool onoff; public bool onoff1; public Button btn; }; public List<tp1> t1 new List<tp1> ; public void t1add int n Button btn led LED led bool onoff1 { tp1 t new tp1 ; t n n; t btn btn; t led led; t onoff1 onoff1; t onoff onoff1; t led onoff onoff1; t1 Add t ; btn Click + new System EventHandler t1 click ; } public void t1 click object sender EventArgs e { for int i 0; i < t1 Count;i++ { if t1[i] btn sender { tp1 t; t t1[i]; MessageBox Show t btn Text ; t onoff t onoff; t led onoff t onoff; if t onoff f1 f3 on t n ; else f1 f3 off t n ; t1[i] t; } } } 调用: private void Form2 Load object sender EventArgs e { this Left 0; this Top 0; this Height 480; this Width 800; b new btns ; b f1 f1; b t1add 3 button6 led1 false ; b t1add 4 button7 led2 false ; b t1add 5 button8 led3 true ; b t1add 6 button4 led4 true ; b t1add 7 button5 led5 false ; b t2add 1 button2 label1 "IN" "OUT" false ; b t2add 2 button3 label2 "IN" "OUT" false ; } 注led小灯控件源码也在我资源内 ">wince通过串口控制继电器的程序 包括串口通信全部底层代码 30多个按钮 互锁等处理都用类规范化 3种 1按钮和灯 2按钮和文字 3按钮文字和互锁另一组 public Form1 f1; public bool bigbl; public struct tp1 { [更多]
©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值