Я пытаюсь установить двунаправленную связь, используя 2 провода RS485, и все, что я пробовал до сих пор, не удалось.
Я могу отправлять данные, и периферийные устройства реагируют должным образом (значит, проводка правильная), но я никогда не получаю никакого ответа.
Я использую .NET SerialPort
, я пробовал использовать событие DataReceived
, а также цикл в Thread
опросе порта. Я даже пробовал просто блокировать чтение, пока не будет получено достаточно данных.
Я пробовал несколько вариантов оборудования:
- Карта PCI RS232 с преобразователем Sena RS232-RS485
- Карта PCI RS232 с преобразователем Moxa RS232-RS485
- Карта PCI RS485
Я играл с настройками драйвера: - Уровни срабатывания прерывания FIFO - Пороги управления потоком FIFO приемника - Включение буфера RS485 (нормальный, активный высокий, активный низкий)
Следуя различным рекомендациям (например, Может не получаю последовательные данные в .net 2.0, используя преобразователь rs232 в rs485), я попытался установить DtrEnable
в значение true или false или переключить его.
Я также пробовал переключать RtsEnable
при отправке и получении (следуя http://en.wikipedia.org/wiki/RS-232#RTS.2FCTS_handshaking).
Я не вижу сейчас ничего другого, что можно было бы попробовать, не прибегая к другой разводке. Что могло быть не так?
По запросу, некоторый код (это всего лишь снимок после многих попыток):
Открытым:
_serialPort = new SerialPort(comboBoxSerialPort.Text, 9600, Parity.None, 8, StopBits.One)
{
WriteTimeout = 500,
ReadTimeout = 500,
Handshake = Handshake.None
};
_serialPort.Open();
_serialPort.DtrEnable = true;
_serialPort.RtsEnable = true;
Послать:
_serialPort.RtsEnable = false;
_serialPort.Write(data, 0, data.Length);
_serialPort.RtsEnable = true;
Thread.Sleep(1);
_dataSent.Set();
Читатель ветки:
var port = form1._serialPort;
byte[] buffer = new byte[128];
int read = 0;
do
{
Array.Clear(buffer, 0, buffer.Length);
read = 0;
try
{
form1._dataSent.WaitOne();
//if (port.BytesToRead > 0)
read = port.Read(buffer, 0, buffer.Length);
}
catch (TimeoutException)
{
}
catch (Exception ex)
{
form1.Invoke(form1.AddErrorMethod, ex.ToString());
continue;
}
if (read > 0)
{
form1.Invoke(form1.AddOutputMethod, ByteListToString(buffer));
}
Thread.Sleep(20);
}
while (_continue);
Примечание: пакеты данных имеют длину 10 байтов в обоих направлениях.
SerialPort
. Прочитано - это количество байтов, фактически прочитанных методом (см. msdn.microsoft.com /en-us/library/ms143549.aspx), всегда 0. Изначально он использовался для смещения в буфер. - person jv42   schedule 04.09.2013