你要用一个全局变量来保存每次读到的数据,直到读取完整了,也就是说,erialPort1.Read(data, 0, data.Length);有时候并不能一次性把数据读取完整,之前我也遇到过这样的问题,给你一段代码参考一下
#region serialPort1_DataReceived - 接受COM数据
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            lock (locker)
            {
                switch (e.EventType)
                {
                    case SerialData.Chars:
                        byte[] data = new byte[256];
                        int length = serialPort1.Read(data, 0, data.Length);                        if (length > 0)
                        {
                            if (data[length - 1] == 13)
                            {
                                if (length > 1)
                                {
                                    buffer += Encoding.ASCII.GetString(data, 0, length - 1);
                                }
                                string temp = buffer;
                                buffer = "";
                                //DealBarcode(temp);
                                this.Invoke(new DealBarcodeEvent(this.DealBarcode), new object[] { temp });
                            }
                            else if (data[length - 1] == 10)
                            {
                                if (length == 1)
                                {
                                    return;
                                }
                                else if (length == 2)
                                {
                                    string temp = buffer;
                                    buffer = "";
                                    //DealBarcode(temp);
                                    this.Invoke(new DealBarcodeEvent(this.DealBarcode), new object[] { temp });
                                }
                                else // length > 2 含有数据
                                {
                                    buffer += Encoding.ASCII.GetString(data, 0, length - 2);
                                    string temp = buffer;
                                    buffer = "";
                                    //DealBarcode(temp);
                                    this.Invoke(new DealBarcodeEvent(this.DealBarcode), new object[] { temp });
                                }
                            }
                            else
                            {
                                buffer += Encoding.ASCII.GetString(data, 0, length);
                            }
                        }
                        break;
                    case SerialData.Eof:
                        break;
                }
            }           
        }
        #endregion其中的temp就是前面说的全局变量
而this.Invoke(new DealBarcodeEvent(this.DealBarcode), new object[] { temp });就是在判定所有数据读完了之后,做的一段业务逻辑,自己去改改吧

解决方案 »

  1.   

    比如一个扫码枪读到条码之后,你需要通过多次serialPort1.Read(data, 0, data.Length);才能读到完整的数据,要不然就会出现断码的现象,特别是那种USB转COM的设备,这种情况特别容易出现
      

  2.   

    多次serialPort1.Read(data, 0, data.Length);什么意思,怎么做!!!上面给的代码看不懂!
      

  3.   

    1、设置大一点的缓冲区,如果一次读取不完,自然要分多次读取!
    2、关于SerialPort写串口程序的问题