我在做一个串口连续发送接收二进制数据程序。通过串口向单片机发送两个字节的二进制数据,单片机接收到数据后,向串口发送十三个字节的二进制数据。发送端通过timer控制,间隔100ms发送一次,程序如下:
  private void timer3_Tick(object sender, EventArgs e) 
        {
                    Byte[] byt = new Byte[2];
                    byt[0] = 0xb8;
                    byt[1] = Convert.ToByte(timer3NumberVariable);
                    serialPort1.Write(byt, 0, 2);
                    timer3.Interval = 100;
         }接收数据用的serialPort1_DataReceived,程序如下:(程序中receive为string类型,是全局变量)
 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
                System.Threading.Thread.Sleep(50);                //接收数据位13个字节
                byte[] bytesReceive = new byte[13];
                serialPort1.Read(bytesReceive, 0, 13);
                
                for (int i = 0; i < 13; i++)
                {
                    receive += bytesReceive[i] + " ";
                }
         }
字符串receive可以在窗口中进行显示,这样可以比较清楚地看到接收到的数据。通过观察字符串receive,发现在串口接收数据过程中,如果进行其他的操作,比如:最大化、最小化窗口,就经常会出现数据丢失现象。本人接触c#时间不长,对于serialPort了解不是很多,希望各位高手不吝指教,帮我解决问题,非常谢谢!

解决方案 »

  1.   

    C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。 
    C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ? 
    C# 串口操作系列(3) -- 协议篇,二进制协议数据解析 
      

  2.   

    为什么要用:System.Threading.Thread.Sleep(50);
    去掉
      

  3.   

    回2楼:我也不是很清楚的,因为我实际的程序比较复杂,贴到上面的是个简化的。实际在serialPort1_DataReceived里面要执行很长一段程序。最初的时候没有System.Threading.Thread.Sleep(50);收到的数据出错几率很大,后来分析,认为是程序执行需要一定时间,加个延时会好点,就添加了上去,果然有点效果,不过原理我也没想太清楚的。