serialport实现与地磅(一种称重设备)的串行通信,读数据时有时无?
读的时候有时DataReceived事件接受到的byte一直不为开始标示。。
很奇怪,不知道哪里设置有问题,还是其他什么原因?
通信协定:
波特率:1200
采用连续方式接收数据。
接收数据共12位长,开始为起始位(02),最后为结束位(03).
我这里通过判断起始和结束位来逐位读取地磅信息。
sp: 拖的一个SerialPort
source:  private void sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {            try
            {
                //取得第一个字节 
                if (sp.IsOpen)
                {
                    byte firstbyte = Convert.ToByte(sp.ReadByte());                    //判断第一个字节是否是起始位:16进制的0x02 
                    if (firstbyte == 0x02)
                    {
                        //定义接收数据长度 
                        int bytesRead = sp.ReadBufferSize;
                        //数据接收字节数组 
                        byte[] bytesData = new byte[bytesRead];
                        //接收字节 
                        byte byteData;
                        for (int i = 0; i <= bytesRead - 1; i++)
                        {
                            try
                            {
                                if (sp.IsOpen)
                                {
                                    byteData = Convert.ToByte(sp.ReadByte());
                                    //判断数据结束字节 
                                    if (byteData == 0x03)
                                    {
                                        break;
                                    }
                                    bytesData[i] = byteData;
                                }
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show("for " + ex.Message + ex.GetType().FullName);                            }
                        }
                        //将字节数组转换成字符串 
                        strReceive = System.Text.Encoding.Default.GetString(bytesData);                         Invoke(interfaceUpdateHandle, strczData);                        // BeginInvoke(interfaceUpdateHandle, strReceive);                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + ex.GetType().FullName);
            }        }

解决方案 »

  1.   

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                try
                {               //   接收缓冲区中数据的字节数 
                    int int_Len = serialPort1.BytesToRead;                //   接收数据 
                    byte[] bytes = new byte[int_Len];
                    serialPort1.Read(bytes, 0, int_Len);                //   将数据存入字符串缓冲区中 
                    for (int i = 0; i < bytes.Length; i++)
                    {
                        strReceive.Append(bytes[i] + "   ");//前面声明一个 private StringBuilder strReceive = new StringBuilder();   
                    }             }
                catch (Exception ex)
                {            } 
            }
    看下可以不,可以回个话
      

  2.   

    不行
    从调试看,得不到数据的时候,传过来的byte数组就是一堆无效的数据173,197.......
      

  3.   

    你看下你的SerialPort的parity属性这些设置了吗
      

  4.   

    时不时的读到这些无效数据,用串口测试工具测试了一下,也一样。
    C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 4F 68 09 82 82 82 8A 82 8A 8A 12 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD C1 C1 C1 C1 C5 C1 C5 C5 09。
      

  5.   

    上面这些数据是不是有特定的含义"C1 C1 C1 C1 C5 C1 C5 C5 09 0D 09 AD "
    都是这个循环!以前写过的一个串口设备你可以参考一下,可以考虑自己写接收功能,不用DataReceived#region Write command to OPW 
            /// <summary> 
            /// 发操作命令给OPW设备 
            /// 并返回状态 
            /// </summary> 
            /// <param name="sCommand"> </param> 
            /// <returns> </returns> 
            public string WriteCommand(string sCommand) 
            { 
                StringBuilder sb = new StringBuilder(); 
                bool bRead = true; 
                try 
                { 
                    ss_port.DiscardInBuffer(); 
                    ss_port.Write(sCommand); 
                    Thread.Sleep(1500); 
                    while (bRead) 
                    { 
                        _ReadBuffer = new byte[ss_port.BytesToRead]; 
                        ss_port.Read(_ReadBuffer, 0, _ReadBuffer.Length); 
                        sb.Append(Encoding.ASCII.GetString(_ReadBuffer)); 
                        Thread.Sleep(500); 
                        if (ss_port.BytesToRead <= 0) 
                        { 
                            bRead= false; 
                        } 
                    } 
                    if (sb.ToString().Length== 0) 
                    { 
                        nReadCount++; 
                    }                 if (nReadCount == 3) 
                    { 
                        nReadCount = 0; 
                        throw new Exception("设置不正确或没有联接设备!"); 
                    }              
                } 
                catch (Exception ex) 
                { 
                    throw new Exception("从设备获取数据失败!\r\n错误信息:" + ex.Message); 
                } 
                return sb.ToString(); ; 
            }