Существуют ли существенные различия между тем, как старый элемент управления VB6 MSComm взаимодействует с последовательным портом и как это делает .Net SerialPort?

Dec 08 2020

У нас есть устройство, которое подключается через USB-кабель и имитирует COM-порт. Используя наше старое приложение VB6 и элемент управления MSComm после открытия соединения, устройство отправляет байт обратно всякий раз, когда приложение VB6 отправляет байт устройству.

Теперь мы переносим приложение VB6 в .Net и используем этот SerialPortкласс для связи. port.Writeпреуспевает, но port.ReadByteсталкивается с TimeOutExceptionкаждым мыслимым, что ReadTimeOutмы используем.

На первый взгляд, все настройки, такие как скорость передачи данных, четность и т. Д., Одинаковы. Странно то, что если мы сначала запустим старое приложение VB6 и закроем его (которое подключается к устройству), код .Net также начнет работать, пока мы не отключим и не подключим устройство заново.

Итак, каким-то образом элемент управления MSComm оживляет устройство, чего SerialPortне может. Код в приложении VB6, открывающий соединение и запускающий обмен данными, прост и преобразован в C #.

Я использовал монитор порта, чтобы увидеть, какие данные были фактически отправлены, и действительно, элемент управления MSComm отправляет на устройство намного больше управляющих байтов перед началом фактической передачи данных. Единственная значимая разница, которую я смог различить, заключается в том, что элемент управления MSComm использует другие символы управления для Xon Xof, EvtChar и т. Д. Но после настройки и для них SerialPort( см. Эту ссылку ничего не изменилось.

Что еще может происходить? Должно ли изучение данных, отправляемых через порт, дать ответ в конце концов, или может быть, что-то совсем другое происходит?

Ответы

KenLee Dec 08 2020 at 17:11

Убедитесь, что порт MSComm открыт (когда ваша программа инициализируется и связывается с устройством)

В C # .NET это примерно так:

  serialPort = new SerialPort();

            if (serialPort is SerialPort)
            {
                serialPort.PortName = "COM1";
                serialPort.DataBits = 8;
                serialPort.Parity = Parity.None;
                serialPort.StopBits = StopBits.One;
                serialPort.BaudRate = 9600;

                try
                {
                    serialPort.Open();

/// and other commands

}}