Existe-t-il des différences circulaires entre la façon dont l'ancien contrôle VB6 MSComm communique avec un port série et comment le .Net SerialPort le fait?

Dec 08 2020

Nous avons un appareil qui est connecté via un câble USB et émule un port COM. En utilisant notre ancienne application VB6 et le contrôle MSComm après l'ouverture de la connexion, l'appareil renvoie un octet chaque fois que l'application VB6 envoie un octet à l'appareil.

Maintenant, nous portons l'application VB6 vers .Net et utilisons la SerialPortclasse pour la communication. port.Writeréussit, mais se port.ReadByteheurte à un TimeOutExceptionpour chaque imaginable que ReadTimeOutnous utilisons.

À première vue, tous les paramètres tels que le débit en bauds, la parité, etc. sont les mêmes. La chose étrange est que si nous lançons d'abord l'ancienne application VB6 et la fermons (qui se connecte à l'appareil), le code .Net commence à fonctionner également jusqu'à ce que nous débranchions et rebranchions l'appareil.

Ainsi, d'une certaine manière, le contrôle MSComm donne vie à l'appareil d'une manière que SerialPortne peut pas. Le code de l'application VB6 qui ouvre la connexion et démarre la communication est simple et a été converti en C #.

J'ai utilisé un moniteur de port pour voir quelles données ont été réellement envoyées et en effet le contrôle MSComm envoie beaucoup plus d'octets de contrôle à l'appareil avant de commencer le transfert de données réel. La seule différence significative que j'ai pu discerner est que le contrôle MSComm utilise d'autres caractères de contrôle pour Xon Xof, EvtChar, etc. Mais après les avoir ajustés pour le SerialPortaussi ( voir ce lien, rien n'a changé.

Que peut-il se passer d'autre? En fin de compte, une enquête sur les données envoyées sur le port devrait-elle donner une réponse encore plus précise, ou est-ce que quelque chose d'autre est en cours?

Réponses

KenLee Dec 08 2020 at 17:11

Assurez-vous que le port MSComm est ouvert (lorsque votre programme s'initialise et communique avec l'appareil)

En C # .NET, c'est quelque chose comme:

  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

}}