c# Обработка рукопожатия RTS / CTS - PullRequest
0 голосов
/ 09 марта 2020

Итак, немного контекста. У меня есть 2 устройства, которые связываются друг с другом через rs232 с помощью RTS / CTS, и мне нужно заменить одно из этих устройств на собственное устройство и программное обеспечение.

Я пытаюсь достигните этого, используя библиотеку System.IO.Ports.SerialPort, чтобы из того, что я мог собрать в Интернете, эта библиотека сама обрабатывала рукопожатие, если мы установили для свойства RtsEnable значение «true», а для свойства рукопожатия - «RequestToSend», но я столкнулся с некоторыми проблемы с получением данных с устройства.

При тестировании моего программного обеспечения я не могу получить ничего от устройства , но , если я изменю проводку, чтобы просто работать в качестве анализатора между двумя оригинальными устройства я могу получить данные правильно. Из того, что я могу собрать, должно быть что-то, что я делаю неправильно, чтобы справиться с рукопожатием.

Вот код, который я пытаюсь:

stationPort = new SerialPort(stationPortNumber, baudRate, parity, dataBits, stopBits);
stationPort.RtsEnable = true;
stationPort.Handshake = Handshake.RequestToSend;
stationPort.DataReceived += StationPort_DataReceived;
stationPort.Open();

private static void StationPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    byte[] bytes = new byte[20];
    stationPort.Read(bytes, 0, stationPort.BytesToRead);
    string hexConvert = BitConverter.ToString(bytes);
    Console.WriteLine("Station OUT >>> " + hexConvert);
}

Я также дважды проверил проводку, чтобы убедиться, он был правильно подключен и также изменил преобразователь, потому что иногда они не подключены должным образом, поэтому я выбрал более надежный MOXA UPort 1150.

Учитывая сказанное, мой вопрос заключается в том, что я делаю неправильно с моей реализацией ? Должен ли я сделать больше, чтобы гарантировать рукопожатие?

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 10 марта 2020

Возможно, используемое оборудование может быть полудуплексным.

В этом случае для связи с классом SerialPort C# необходимо установить Handshake на None и управлять включением / выключением сигнала RTS самой прикладной программой. .
API класса SerialPort не имеет этой функции.
Рукопожатие Enum

При использовании функции связи Win32API связь может быть возможна путем установки флага fRtsControl. RTS_CONTROL_TOGGLE в DCB.
структура DCB

RTS_CONTROL_TOGGLE 0x03
Указывает, что линия RTS будет высокой, если для передачи доступны байты. После того, как все буферизованные байты были отправлены, линия RTS будет низкой.

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


Вы также можете попробовать комментарий @ baddack.
Как уже отмечалось, тот факт, что сигнал DTR (DSR для другой стороны) включен, может быть основой для определения возможности связи .

В связи с этим, перекрестные соединения сигнальных линий?

Пересекаются ли между собой TxD / RxD, RTS / CTS, DTR / DSR?
Также проверьте что нужно сделать с этими спецификациями для вашего оборудования.

...