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

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

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

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

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

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

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


person Dabblernl    schedule 08.12.2020    source источник


Ответы (1)


Убедитесь, что порт 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

}}

person Ken Lee    schedule 08.12.2020
comment
Спасибо, к сожалению, не все так просто. Запись прошла успешно, поэтому порт открыт. - person Dabblernl; 08.12.2020
comment
Я понимаю. Это кажется странным. Вы можете попробовать использовать другую библиотеку, если хотите (например, github.com/genielabs/serialport-lib-dotnet), так как иногда в библиотеках MS могут быть ошибки / нестабильности. - person Ken Lee; 08.12.2020
comment
Я решил это после дальнейшего изучения журнала последовательного порта. Команды должны были быть отправлены в очень определенном порядке. - person Dabblernl; 08.12.2020
comment
Здорово. так что изучение журналов - один из хороших способов исследовать. Хорошего дня. - person Ken Lee; 08.12.2020