Как отправить и получить через последовательный порт RS485?

StackOverflow https://stackoverflow.com//questions/10689404

  •  12-12-2019
  •  | 
  •  

Вопрос

Я хочу общаться между моим компьютером и некоторыми контроллерами.

Ожидание заключается в том, что ПК отправят идентификатор доски на RS-485, а затем он должен получить ответ от доски.

Когда я пытаюсь получить ответ, я получаю неправильные данные.

Вот мой код:

public void set()
    {

        SerialPort sp = new SerialPort("COM1");
        sp.Open();
        if (sp.IsOpen)
        {
            byte[] id = new byte[]{0,0,0,0,0,0,0,0,0,0};
            byte[] rec = new byte[540];
            while (!end)
            {
                sp.Write(id,0,id.Length);

                sp.Read(rec,0,rec.Length);

                //do some with rec
                //WORKING
                //do soem with rec

            }
        }
        sp.Close();
    }
.

Работает, если я использую RS-232, но не при использовании RS-485.

<Сильное> Обновление:

Это провод RS-485 2 ( http://en.wikipedia.org/wiki/ RS-485 )

Это было полезно?

Решение

Я нашел проблему.

 sp.Read(rec,0,rec.Length);
.

Read - это метод безблокировки, поэтому он читает буфер, но не ждет всех байтов.Таким образом, вам нужно использовать возвращаемое значение этой функции, которая возвращает целое число с количеством байтов, которые он мог прочитать.

Я использую это:

int read = 0;
int shouldRead = readData1.Length;
int len;
while (read < shouldRead )
{
    len = serialport.Read(buffer, 0, readData1.Length);
    if (len == 0)
         continue;
    Array.Copy(buffer, 0, readData1, read, len);
    read += len;
    Thread.Sleep(20);
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top