Получение непредвиденных данных через последовательный порт io c # - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь записать формат команды через последовательный порт и ожидаю ответа.В процессе приема я получаю некоторый неизвестный шаблон данных вместе с тем, что записано в качестве команды, даже если я не пишу тот же шаблон или данные на другом конце.

Создание последовательного порта

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
        }


Данные запроса: Запись данных: 0101 01 00 00 01 00 31 40 c9

Ответ: Шаблон 5e 41 5e 41 5e 41 5e 40 5e и данные, которые я отправил 31 40c9

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 3140 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 415e 41 5e 41 5e 40 5e 40 5e 41 5e 40 31 40 c9
Почему я получаю всея пишу вместе с неожиданными данными?

1 Ответ

0 голосов
/ 19 ноября 2018

Вы игнорируете возвращаемое значение port.Read вызов, который является количеством полученных байтов.Все, что находится в readBuffer, кроме этого, недопустимо.

...