Есть ли способ определить максимальную скорость последовательного порта?

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

Есть ли что-то в его аппаратном профиле или что-то, что хранит доступные скорости передачи данных для определенного порта, которые С# может запросить?


person Xantham    schedule 08.06.2012    source источник


Ответы (1)


Используя отражение, вы можете/должны сделать это следующим образом:

   serialPort = new SerialPort(portName);
   serialPort.Open();
   object p = serialPort.BaseStream.GetType().GetField("commProp", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(serialPort.BaseStream);
   Int32 bv = (Int32)p.GetType().GetField("dwSettableBaud", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).GetValue(p);

Примечание. Порт будет открыт для проверки устанавливаемой скорости передачи данных! :)

См. этот пост для получения дополнительной информации о том, как вы можете проверить скорость передачи данных: -serialport-class">Как программно найти все доступные скорости передачи в C# (класс serialPort)

person Faraday    schedule 08.06.2012
comment
Спасибо за ответ. К сожалению, ответ выдает почти четверть гигабода (никогда не думал, что напишу такой срок про обычный RS232). Таким образом, он указывает число, намного превышающее то, на что способен последовательный драйвер (на порте, который, как он заявил, может обрабатывать 268 894 207 (число, хранящееся в bv), установка его на 230 400 бод вызвала исключение). Есть ли какая-то фильтрация или формула, которую я должен использовать, чтобы получить истинную максимальную скорость передачи данных, с которой может справиться последовательный чип, или это просто предел того, что Windows попытается записать на него? - person Xantham; 08.06.2012
comment
RS232 — это асинхронная шина данных без какой-либо встроенной синхронизации или обнаружения/исправления ошибок. Таким образом, практический предел скорости передачи данных зависит от нескольких факторов, в том числе качества/длины последовательного соединения и характеристик точности скорости передачи данных с обеих сторон канала (насколько точна скорость передачи данных, генерируемая для Tx, и насколько велика ошибка в Rx). бод можно допустить с помощью передискретизации Rx). Если вы собираетесь раздвинуть ограничения скорости, лучше добавьте какой-нибудь протокол с CRC и повторными передачами для обработки случайных битовых ошибок. - person TJD; 08.06.2012
comment
@Xantham да, это почти 8 лет спустя, но для тех, кто смотрит на это смущенно по поводу значений, возвращаемых из dwSettableBaud, они являются константами, соответствующими определенному значению бода. Ссылку можно найти здесь: docs.microsoft .com/en-us/windows/win32/api/winbase/ - person Andy; 10.12.2019