用c#实现串口通信读取数据时只读前8位
            byte[] TxData1 = new byte[] { };
            n = sp.BytesToRead;
            byte[] TxData = new byte[n];//声明一个临时数组存储当前来的串口数据
            sp.Read(TxData, 0, n); //读取缓冲数据 
            Array.Resize(ref   TxData1, TxData1.Length + n);//改写数组大小
            TxData.CopyTo(TxData1, TxData1.Length - TxData.Length);//复制
我想实现读取完整怎么办 例如:我应该接收11位数据,它只读了前8位,余下的3位怎么读。麻烦各位帮忙一下。

解决方案 »

  1.   

    fisher_ch能说的详细一点吗   我知道要在这里设置  我用的延时的方法  也能实现  但这样做不是很合理   
      

  2.   

    楼主,对于datareceived事件,只要串口来数据了,该事件就会被触发,而且对于串口的一次发送来说,它的接收可能被分为多次完成,比如你发了一次12字节的数据,它可能会3次触发datareceived事件,才接收完12字节,所以你在datareceived事件里,应该有个拼帧的处理,看是否接收到了完整帧
      

  3.   

    解决了  这样可以解决  需要的可以参考一下
                int n = sp.BytesToRead;
               byte[] TxData = new byte[n];
                sp.Read(TxData, 0, n);  
                m = m + n;
                this.Invoke((EventHandler)
                   (delegate
                        {     
                           
                            Array.Resize(ref  TxData2, m);
                            TxData.CopyTo(TxData2, m - TxData.Length);
                            if (m == p)
                            {
                                byte[] data = new byte[p-2];
                                for (int i = 0; i < TxData2.Length -2;i++ )                            { 
                                    data[i]=TxData2[i];
                                }
                                byte[] data2 = new byte[2];
                                data2[0] = TxData2[TxData2.Length - 2];
                                data2[1] = TxData2[TxData2.Length - 1];
                                byte[] data1 = new byte[2];
                                data1 = CRC16_C(data);
                                if (data1[0] == data2[1] && data1[1] == data2[0])
                                {
                                    for (int j = 3; j <= m - 4; j = j + 2)
                                    {
                                        string s1 = TxData2[j].ToString();
                                        string s2 = TxData2[j + 1].ToString();
                                        string s = s1 + s2;
                                        int g = Convert.ToInt32(s, 10);
                                        string h = g.ToString();
                                        textBox1.Text += h + "  ";
                                    }
                                    textBox7.Text = "读取成功";
                                }
                                else
                                {
                                    textBox7.Text ="读取失败";
                                }
                                m = 0;
                            }                    }
                   )
                );