WEB开发网
开发学院软件开发C语言 C#串口编程遇到的问题以及解决方法 阅读

C#串口编程遇到的问题以及解决方法

 2010-09-30 22:43:16 来源:WEB开发网   
核心提示: 在调试的过程中,当我spReceive_DataReceived函数中的byte[] recevied = new byte[15]; 后面在加上个初始化,C#串口编程遇到的问题以及解决方法(2),如下:for(inti=0;i<recevied.Lengthl;i++)recevied[

在调试的过程中,当我spReceive_DataReceived函数中的byte[] recevied = new byte[15]; 后面在加上个初始化,如下:

       for( int i=0; i<recevied.Lengthl;i++)
             recevied[i]=11;

这个时候界面显示的时候,凡是以00显示的地方都被11替换了。这肯定了这些00是由于传送的15个字节数组未被完全填充到我们定义的字节数组中,即 Read(byte [] bytes,int offset,int size)函数未一次性将字节数组填充完,而是分了两次。但是在此过程中我使用的是SerialPort类的DataReceived事件,即没收到一条数据便会触发,而这儿的现象仿佛是事件被触发了多次。后来自己在SerialPort类的属性里面找了下,突然发现了有个 ReceivedBytesThreshold属性,从这个属性可以看出我们可以控制接受多少个字节触发一次DataReceived事件。于是,我便将阀值设为15个字节,满以为问题解决了,可是结果却~

囧啊,可是这个属性也给了我们一些提示,也找到了问题的症结所在。那就是,DataRecevied事件触发的阀值,即接受到多少个字节数触发一次偏小,结果导致了我们一条大小为15个字节的数据触发了两次DataReceived事件。要解决这个问题,我们可以沿着这个思路走下去,那就是延迟 DataRecevied事件的触发直到我们一条数据接受完毕。

所以在spReceive_DataReceived事件函数中,我们做如下修改:

       byte[]  receiveBuffer=new byte[15];  
       public void spReceive_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
       {
              int bytesRead = 0;  
              spReceive.ReceivedBytesThreshold = 100000;     //延迟DataRecevied事件的再次触发
              
             while (true)
             { 
                   if (bytesRead >= 15)      //这儿的15是我一条数据的大小
                  { 
                        byte[] bytes = new byte[bytesRead]; 
                        Array.Copy(receiveBuffer, 0, bytes, 0, bytesRead);       
                        Array.Clear(receiveBuffer, 0, bytesRead); 
                        UpdateReceiveToUI(bytes);
                        bytesRead = 0; 
                        break; 
                  } 
                  try
                 {
                    receiveBuffer[bytesRead] = (byte)spReceive.ReadByte();
                    ++bytesRead;
                 }
                catch (Exception ex1)
                {
                    MessageBox.Show(ex1.Message);
                    break;
                } 
 
                bytesRead = 0;
                spReceive.ReceivedBytesThreshold = 1;            //将延迟改回正常
             } 
       } 

经过上述的改动,便可以解决读取串口数据冲突与丢失的问题了~不周之处,还望各位斧正~

上一页  1 2 

Tags:串口 编程 遇到

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接