Czy są jakieś różnice obwodowe między sposobem komunikacji starego kontrolera VB6 MSComm z portem szeregowym i jak to robi .Net SerialPort?

Dec 08 2020

Mamy urządzenie, które jest podłączone kablem USB i emuluje port COM. Korzystając z naszej starej aplikacji VB6 i kontrolki MSComm po otwarciu połączenia urządzenie wysyła bajt z powrotem za każdym razem, gdy aplikacja VB6 wysyła bajt do urządzenia.

Teraz przenosimy aplikację VB6 na .Net i używamy tej SerialPortklasy do komunikacji. port.Writepowiedzie, ale port.ReadBytenapotyka na TimeOutExceptionkażdej pomyślenia ReadTimeOutużywamy.

Na pierwszy rzut oka wszystkie ustawienia, takie jak prędkość transmisji, parzystość itp. Są takie same. Dziwne jest to, że jeśli najpierw uruchomimy starą aplikację VB6 i zamkniemy ją (która łączy się z urządzeniem), kod .Net również zacznie działać do momentu odłączenia i ponownego podłączenia urządzenia.

Więc w pewien sposób kontrolka MSComm ożywia urządzenie w sposób, którego SerialPortnie może. Kod w aplikacji VB6, który otwiera połączenie i rozpoczyna komunikację, jest prosty i został przekonwertowany na C #.

Użyłem monitora portu, aby zobaczyć, jakie dane zostały faktycznie wysłane i rzeczywiście, kontrolka MSComm wysyła dużo więcej bajtów kontrolnych do urządzenia przed rozpoczęciem rzeczywistego przesyłania danych. Jedyną znaczącą różnicą, jaką udało mi się dostrzec, jest to, że kontrolka MSComm używa innych znaków kontrolnych dla Xon Xof, EvtChar itp. Ale po dostosowaniu ich SerialPortrównież dla ( patrz ten link nic się nie zmieniło.

Co jeszcze może się dziać? Czy badanie danych przesyłanych przez port powinno dać w końcu jeszcze dokładniejszą odpowiedź, czy może chodzi o coś zupełnie innego?

Odpowiedzi

KenLee Dec 08 2020 at 17:11

Upewnij się, że port MSComm jest otwarty (podczas inicjalizacji programu i komunikacji z urządzeniem)

W C # .NET jest to coś takiego:

  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

}}