Общайтесь с Колером Метром в C#

Я пытаюсь связаться с Колером активным счетчиком. Это полудуплекс. Я прочитал весь протокол. Колер имеет собственное программное обеспечение для просмотра профилей. Пока он читал профили, я попытался посмотреть, как это происходит. Отправка и получение данных. Затем я попытался написать программу на C#. Для связи на первых шагах выбирается скорость передачи 300, а затем она должна быть 4800.

Вот мои проблемы:

  1. Если я пытаюсь отладить свою программу с помощью F5, она не связывается. Но если я использую шаг в режим F11, он работает? Я думаю, это должно подождать некоторое время. любая идея?

  2. Когда я пытаюсь изменить скорость передачи данных с 300 на 4800, переход в режим F11 не работает. Я проверил в программном обеспечении, если он меняется или нет, но это нормально. есть идеи о чем это?

3 ответа

  1. Это распространенная ошибка при работе с последовательными портами. Это очень медленные устройства, особенно на скорости 300 бод. Это только один символ на 33 миллисекунды, вечность на современной машине. Используя отладчик, вы искусственно замедляете свою программу. Много. Предоставление драйвера последовательного порта времени для получения полного ответа устройства. Когда вы запускаете без пошаговых или остановочных точек, вызов SerialPort.Read() возвращает только один или несколько символов за раз. Вы исправите это, используя ReadLine() с правильно установленным свойством NewLine или сохраняя полученные байты в буфере, пока не получите полный ответ.

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

"Free Serial Port Monitor" эта программа действительно открыла мне глаза. Большое вам спасибо @ferda. и я решил проблему. речь шла о времени ожидания. Сначала я увидел время для запроса и ответы с помощью этой программы. Затем я также использовал команду Flush. я смотрел результаты своей программы, снова используя программу FreeSerial Port Monitor. В конце я мог отправить данные и получить данные со скоростью 4800 бод. Просто изменение скорости передачи в C# сработало для Колера. Больше ничего не нужно.

Перед отправкой ваших запросов подождите некоторое время. Когда вы отлаживаете с F5, вы не ждете. Но с F11 вы неизбежно ждете. Это также показывает, что ваша программа работает лучше, когда вы ждете:) Используйте программу мониторинга, например "Free Serial Port Monitor", чтобы выяснить это время ожидания, сначала запустив собственную программу Kohler.
Вы можете использовать потоковый ридер и потоковый писатель для связи со счетчиком. подобно

 writer = new StreamWriter(((System.IO.Ports.SerialPort)serialPort).BaseStream);
 reader = new StreamReader(((System.IO.Ports.SerialPort)serialPort).BaseStream);

Не забудьте использовать команду writer.Flush() сразу после ввода команды пользователя. Иногда ждать, прежде чем отправлять команды на счетчик использования System.Threading.Thread.Sleep(250); код 250 в мсек. Я не рекомендую ждать после отправки запроса. Подождите, пока вы не отправите новый запрос, сообщение ACK и т. Д. Если собственная программа Колера ожидает слишком много между командами, задайте значения времени ожидания serialports...

(serialport).ReadTimeout = xxx;
(serialport).WriteTimeout = xxx;
Другие вопросы по тегам