Я использую библиотеку последовательного порта C#
для связи с датчиком и ПК. Я часто получаю таймауты с помощью метода SerialPort.Read()
, хотя там есть данные. Я использовал серийные снифферы, чтобы проверить, что я получаю весь пакет в порту, но некоторые, как .NET не выбирает их всех и время. Я читаю байты, а получаемые мной байты на 2112 меньше, чем размер буфера последовательного порта. Я попробовал несколько вещей и теперь думал об использовании родной C/C++
и звонил в C#
. Может ли кто-нибудь поделиться своими мыслями или использовать собственный код C/C++
в C#
.Таймауты в последовательном порту C#
ответ
работает на скорости передачи данных 460800 до 921600
Это довольно странные скорости передачи данных, довольно высокие. Очевидно, что вы не используете событие DataReceived, поэтому довольно важно, как часто вы вызываете метод Read(). Потратьте немного времени на то, чтобы сделать что-то еще, в том числе Windows, думая, что нужно что-то более важное, и контекст отключается от вашего потока, и буфер приема быстро переполняется. Невыполнение события SerialPort.ErrorReceived является стандартной ошибкой, поэтому вы просто не видите эти переполнения, все, что вы видите, - это отсутствие данных.
Написание этого кода на C++ вряд ли принесет облегчение. Существует только один api для последовательных портов, SerialPort - это всего лишь тонкая оболочка и использует функции winapi, такие как ваш код на C++.
Так возьмите все из следующих этапов:
- Реализовать событие ErrorReceived так что вы знаете что переливается происходят
- Favor используя событие DataReceived, так что вы не зависят от вызова Read() часто достаточно
- Установите ReadBufferSize на большое большое количество, чтобы драйвер мог занять слабину.
- Установите свойство «Рукопожатие», чтобы драйвер мог сообщить устройству прекратить отправку, когда буфер заполнен
- Проверьте, можете ли вы реализовать протокол, чтобы устройство не просто шланговое устройство не работало.
- Опустите скорость передачи в бодах, если она по-прежнему недостаточно надежна.
- 1. Чтение/запись в последовательном порту Linux C
- 2. Данные, потерянные в последовательном порту C++
- 3. C# ожидание данных на последовательном порту
- 4. Считывание ожиданий на последовательном порту?
- 5. ASP.NET Как дождаться события в последовательном порту
- 6. portList.hasMoreElements() возвращает ложь в последовательном порту
- 7. Очистить данные на последовательном порту в Linux в C?
- 8. Как обнаружить сигналы в последовательном порту COM1?
- 9. Скорость передачи в виртуальном последовательном порту USB
- 10. Невозможно прочитать запись на последовательном порту в C++
- 11. Как получить пакеты на последовательном порту MCU?
- 12. Обработка больших данных, полученных на последовательном порту
- 13. Управление отдельными контактами на последовательном порту
- 14. Как получить данные на последовательном порту синхронно?
- 15. Я получаю мусор на последовательном порту
- 16. Не удается обнаружить первые данные, отправленные в последовательном порту
- 17. Исходящий сигнал, когда байты принимаются в последовательном порту
- 18. Как получить конкретную информацию о последовательном (COM) порту в Windows?
- 19. Обнаружение 5-вольтового сигнала в последовательном порту в vb.net
- 20. Не удалось проверить полученное значение на последовательном порту в Matlab
- 21. Как печатать ответ на AT-команды в последовательном порту Arduino?
- 22. Читать все доступные данные в последовательном порту с повышением ASIO
- 23. Считывание данных в последовательном порту на окнах с php
- 24. Как я могу контролировать данные на последовательном порту в Linux?
- 25. Невозможно напечатать значение символа, полученное на последовательном порту в Matlab
- 26. Чтение и запись на последовательном порту в Ubuntu с C/C++ и LibSerial
- 27. Таймауты для соединений в C
- 28. Получить/прочитать условие BREAK на последовательном порту Linux
- 29. Есть ли способ узнать количество данных, доступных на последовательном порту?
- 30. Как обеспечить 250-миллисекундную задержку между записью на последовательном порту?