Каждое устройство RS-232 должно использовать какой-то механизм управления потоком , чтобы уведомить противоположную часть о продолжающейся связи.Существует три основных механизма:
- аппаратный RTS / CTS по двум выделенным проводам, обычно используемый для управления отправкой отдельных фрагментов данных
- аппаратный DTR / DSR по двум выделенным проводам, обычно используется для управления всем сеансом связи
- на основе softwa XON / XOFF через пару выделенных символов (обратите внимание, чтов этом случае данные должны быть закодированы для предотвращения конфликтов с управляющими символами)
(запуск обновления)
Начальная длина очереди и время ожидания в устаревшем приложении:
1 IOCTL_SERIAL_SET_QUEUE_SIZE InSize: 1024 OutSize: 1024
2 IOCTL_SERIAL_SET_TIMEOUT RI:2000 RM:0 RC:2000 WM:0 WC:2000
пока вы их не установите.Попробуйте установить размеры очереди, используя SerialPort.WriteBufferSize
и SerialPort.ReadBufferSize
.Аналогичным образом установите время ожидания с помощью SerialPort.ReadTimeout
и SerialPort.WriteTimeout
.
(окончание обновления)
В вашем случаеУстаревшее приложение выполняет:
12 IOCTL_SERIAL_CLR_RTS
13 IOCTL_SERIAL_SET_DTR
, а вы:
12 IOCTL_SERIAL_CLR_RTS
13 IOCTL_SERIAL_CLR_DTR
Вы не устанавливаете сигнал DTR (Data Terminal Ready) и, следовательно, устройство не ожидает никаких данных или командна серийной линии.Следовательно, установите SerialPort.DtrEnable
на true
.
Вторая проблема - вы не включаете рукопожатие.Устаревшее приложение:
16 IOCTL_SERIAL_SET_HANDFLOW Shake:1 Replace:0 XonLimit:0 XoffLimit:0
18 IOCTL_SERIAL_SET_RTS
…
21 IOCTL_SERIAL_CLR_RTS
, а вы:
16 IOCTL_SERIAL_SET_HANDFLOW Shake:0 Replace:0 XonLimit:4096 XoffLimit:4096
Включите его, установив SerialPort.Handshake
в Handshake.RequestToSend
.
Кроме того, вы, похоже, очень часто открываете, закрываете и переконфигурируете последовательный порт.Попробуйте настроить порт и затем использовать один и тот же экземпляр SerialPort
для всего сеанса.Не пытайтесь открыть его снова, потому что вы будете вызывать переконфигурирование состояния контактов физического порта.
Последовательная связь не является черной магией, но она довольно чувствительна при настройке, а различные устройства требуют специальных настроек и обработки.Правильная синхронизация команд также может быть проблемой.
Если у вас есть какая-либо техническая документация для вашего устройства, прочитайте ее дважды и в первую очередь соблюдайте ее.По крайней мере, режимы рукопожатия, команды и т. Д. Должны быть задокументированы должным образом.
Если у вас нет документации, попробуйте уменьшить различия один за другим.
ОБНОВЛЕНИЕ: Отправка и получение данных.
Вы написали, что отправили команду 'Ping'
(как расшифровано из шестнадцатеричного в ASCII).Однако вы не упоминаете последовательность отправки и завершения команды. Обычно последовательные устройства ожидают последовательность конца строки (обычно CR LF) в качестве завершения команды.До того как устройство получит команду complete , включая конец строки, оно не сможет ответить.
Вы обрабатываете событие получения данных, вызывая ReadLine
- однако в месте, где вы не можете ожидать полную строку данных (т. Е. Включая конец строки, чтобы можно было обнаружить строку comlete).Вы должны проверить предоставленные аргументы события и прочитать побитовые байты.
Хорошая идея - создать класс-обертку, который будет обеспечивать индивидуальные функции отправки, получения, ответа, отправки и получения данных.Оболочка должна будет работать асинхронно внутри по отношению к остальной части вашего кода.Таким образом, у вас будет удобный пользовательский API и хорошо управляемая обработка последовательного порта.
Обратите внимание, что свойство SerialPort.NewLine
служит для указания того, как выглядит последовательность конца строки.(В другом своем вопросе вы упомянули, что пытались установить для него набор специальных символов. Это действительно было неправильно.)
Давным-давно я был героем серийного комм (это были дниу нас не было vmware, но было два компьютера с процессором 486 и пара напрямую подключенных модемов для разработки и отладки коммуникационных приложений :-)), но я надеюсь, что это поможет хотя бы немного.
Последнее, но не менее важное, некоторыеобщая терминология:
- DTE - оконечное оборудование данных = ваш абонент
- DCE - аппаратура передачи данных = ваше устройство, например модем