Как отправить и получить через последовательный порт RS485?
-
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);
}
. Не связан с StackOverflow