通过串行io c#接收意外数据

时间:2018-11-19 05:38:15

标签: c# .net io serial-port

我正在尝试通过串行端口编写命令格式,希望得到答复。在接收过程中,即使我没有在另一端写相同的模式或数据,我也会接收一些未知的数据模式以及写为命令的任何内容。

串行端口创建

port= new SerialPort(s, 9200, Parity.None, 8, StopBits.One);


发送并接收

   public byte[] SendAndRecieve(COMMAND request)
    {

        Console.Write("\nSendAndRecieve\n");    
        Console.Write("\n\n");
        byte retry = 0;
           bool flag = false;

           while (retry < 3)
           {
               /
               Console.Write("\n Send&Recive retry {0} \n",retry);
              WriteCommandAsByte(request.ToByteArray());

              Stopwatch sw = new Stopwatch();
                 while (sw.Elapsed < TimeSpan.FromMilliseconds(3000))
                  {

                      if (readBuffer == null)
                      {
                          flag = true;
                          break;
                      }

                  }
                if (flag)
                    break; 
                retry++;
           }

           return readBuffer;
    }

写入功能

public void WriteCommandAsByte(byte [] data)
    {

        try
        {


                Console.Write("\nWriting Data: ");
                foreach (byte bt in data)
                    Console.Out.Write(" {0:x2}", bt);
                Console.Write("\n\n");
                port.DiscardOutBuffer();
                port.Write(data, 0, data.Length);
                port.Write("\n");
                port.DiscardOutBuffer();


        }
        catch (System.IO.IOException e)
        {
            Console.WriteLine("WriteCommandAsByte Error");

        }


    }

接收到的串行数据事件处理程序

private  void Port_DataReceived(object sender,SerialDataReceivedEventArgs e)
    {
        Thread.Sleep(1000);
        try
        {
                Console.WriteLine("\n Data Recieved\n");
                int ByteToRead = port.BytesToRead;
                readBuffer = new byte[ByteToRead];
                port.Read(readBuffer, 0, readBuffer.Length);
                port.DiscardInBuffer();
                Console.WriteLine("\n Data:  \n\n");
                foreach (byte bt in readBuffer)
                    Console.Write(" {0:x2}", bt);
        }catch(Exception ex)
        {
             //Handle exceptions
        }


索取数据: 文字数据:01 01 01 00 00 01 00 31 40 c9  

响应:   5e 41 5e 41 5e 41 5e 40 5e 和我发送的数据 31 40 c9

  5e 41 5e 41 5e 41 5e 40 5e 40 5e 41 5e 40 31 40 c9 0d 0a 5e 41 5e 41 5e 41 5e 40 5e 40 5e 41 5e 40 31 40 c9 0d 0a 5e 41 5e 41 5e 41 5e 40 5e 40 5e 41 5e 40 31 40 c9 0d 0a 5e 41 5e 41 5e 41 5e 40 5e 40 5e 41 5e 40 31 40 c9 0d 0a 5e 41 5e 41 5e 41 5e 40 5e 40 5e 41 5e 40 31 40 c9
为什么我收到我写的东西以及一些意外数据?

1 个答案:

答案 0 :(得分:2)

您忽略端口的返回值。Read调用是接收到的字节数。超出此值的readBuffer无效。