0

我正在做一个项目,我通过串口发送命令并等待响应处理。它遵循某种协议。

我面临的问题是我收到的回复不完整,所以我无法处理它。一些响应在一个事件早期就出现了,而另一些则在之后响应。

我期待的回应是这样的:

05-00-0F-01-02-00-08-E2-00-60-03-11-73-D2-C1-86-5C

但我只会收到05-00,其余的会在之后发生,它会不时变化,所以我无法预测。

我需要将响应存储到缓冲区,直到它完成然后处理它。我怎样才能做到这一点?

我从串口接收的方式是这样的:

 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        try
        {
            int ByteToRead = serialPort1.BytesToRead;

            //create array to store buffer data
            byte[] inputData = new byte[ByteToRead];

            //read the data and store
            serialPort1.Read(inputData, 0, ByteToRead);

            //invoke the display in another thread
            this.BeginInvoke(new DelegateDisplay(Display), new object[] { inputData });
        }
        catch (SystemException ex)
        {
            MessageBox.Show(ex.Message, "Serial Port Error ");
        }
    }

然后在这里处理和显示:

  public void Display(byte[] inputData)
    {
        try
        {
            TboxOutput.AppendText(BitConverter.ToString(inputData, 0) + "\n");

            //Add  recieved data to List
            List<byte> Data = new List<byte>();

            try
            {
                for (int i = 0; i < inputData.Length; i++)
                {
                    Data.Add(inputData[i]);
                }
            }
            catch (SystemException ex)
            {
                MessageBox.Show(ex.Message + "Data Process");
            }


        }
        catch (SystemException ex)
        {
            MessageBox.Show(ex.Message, "Display Error");
        }
    }
4

3 回答 3

1

这应该这样做:

        const int timeout = 1000;
        const int step = 100;

        for (int t = 0; t < timeout; t += step)
        {
            Thread.Sleep(step);
            if (serialPort1.BytesToRead >= ResponseSize)
                break;
        }


        if (serialPort1.BytesToRead < ResponseSize)
        {
            serialPort1.DiscardInBuffer();
            throw new Exception("Incorrect buffer size!");
        }

        serialPort1.Read(inputData, 0, ResponseSize);

ResponseSize您希望收到的消息长度在哪里。

于 2013-07-05T09:36:26.583 回答
0

继续阅读,直到您得到完整的答复。协议规范应指定如何判断响应是否完整。

于 2013-07-05T09:06:59.053 回答
0

您可以使用列表或队列。但是正如@David Schwartz 所提到的,您必须确定正确的赞助人,可能是您尝试读取的链的大小,或者可能是用于发送者的协议。

这是我用来阅读的一个例子,7bit asccii。链使用格式 {STX}{CHAIN}{ETX}{CRC}。但它有一个特殊情况,一个字节的答案 {ACK}

这从串行端口读取,直到获得完整的链,并将该链作为字节数组返回:

public Byte[] RECIBE()
                {
                    int count = serialPort1.BytesToRead;
                    if (count > 0)
                    {
                        List<Byte> bytes = new List<Byte>();
                        bool ETX = false;
                        while (ETX == false)
                        {
                            Byte b = Convert.ToByte(serialPort1.ReadByte());
                            if (b == 0x06)
                            {
                                bytes.Add(b);
                                return bytes.ToArray();
                            }
                            if (b != 0x03)
                            {
                                bytes.Add(b);
                            }
                            else
                            {
                                bytes.Add(b);
                                ETX = true;
                            }
                        }
                        Byte b2 = Convert.ToByte(serialPort1.ReadByte());
                        bytes.Add(b2);
                        return bytes.ToArray();
                    }
                    else
                    {
                        return null;
                    }
                }
于 2014-04-06T03:24:53.507 回答