Existem diferenças ciríticas entre como o controle VB6 MSComm antigo se comunica com uma porta serial e como o .Net SerialPort faz isso?

Dec 08 2020

Temos um dispositivo que é conectado por meio de um cabo USB e emula uma porta COM. Usando nosso aplicativo VB6 antigo e o controle MSComm após abrir a conexão, o dispositivo envia um byte de volta sempre que o aplicativo VB6 envia um byte ao dispositivo.

Agora, estamos portando o aplicativo VB6 para .Net e usar a SerialPortclasse para comunicação. port.Writeé bem-sucedido, mas port.ReadByteencontra um TimeOutExceptionpara cada pensável ReadTimeOutque usamos.

Aparentemente, todas as configurações como Baudrate, Parity, etc. são iguais. O estranho é que, se primeiro iniciarmos o aplicativo VB6 antigo e o fecharmos (que se conecta ao dispositivo), o código .Net também começará a funcionar até desconectar e reconectar o dispositivo.

Portanto, de alguma forma, o controle MSComm dá vida ao dispositivo de uma forma que ele SerialPortnão consegue. O código no aplicativo VB6 que abre a conexão e inicia a comunicação é direto e foi convertido para C #.

Usei um monitor de porta para ver quais dados foram realmente enviados e, de fato, o controle MSComm envia muito mais bytes de controle para o dispositivo antes de iniciar a transferência de dados real. A única diferença significativa que consegui perceber é que o controle MSComm usa outros chars de controle para Xon Xof, EvtChar, etc. Mas depois de ajustar estes para o SerialPorttambém ( veja este link nada mudou.

O que mais pode estar acontecendo? A investigação dos dados enviados pela porta ainda mais de perto deve dar a resposta no final, ou será que algo totalmente diferente está acontecendo?

Respostas

KenLee Dec 08 2020 at 17:11

Certifique-se de que a porta MSComm esteja aberta (quando o programa é inicializado e se comunica com o dispositivo)

Em C # .NET, é algo como:

  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

}}