Существуют ли существенные различия между тем, как старый элемент управления VB6 MSComm взаимодействует с последовательным портом и как это делает .Net SerialPort?
У нас есть устройство, которое подключается через 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
( см. Эту ссылку ничего не изменилось.
Что еще может происходить? Должно ли изучение данных, отправляемых через порт, дать ответ в конце концов, или может быть, что-то совсем другое происходит?
Ответы
Убедитесь, что порт 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
}}