이전 VB6 MSComm 컨트롤이 직렬 포트와 통신하는 방법과 .Net SerialPort가이를 수행하는 방법 사이에 중요한 차이점이 있습니까?

Dec 08 2020

USB 케이블을 통해 연결되고 COM 포트를 에뮬레이트하는 장치가 있습니다. 이전 VB6 응용 프로그램과 MSComm 컨트롤을 사용하여 연결을 연 후 장치는 VB6 응용 프로그램이 장치에 바이트를 보낼 때마다 바이트를 다시 보냅니다.

이제 VB6 애플리케이션을 .Net으로 포팅하고 SerialPort통신을 위해 클래스를 사용합니다 . port.Write성공하지만 port.ReadByte으로 실행되는 TimeOutException모든 사유에 대한 ReadTimeOut우리의 사용.

표면적으로는 Baudrate, Parity 등과 같은 모든 설정이 동일합니다. 이상한 점은 이전 VB6 응용 프로그램을 처음 시작하고 닫으면 (장치에 연결됨) 장치를 분리했다가 다시 연결할 때까지 .Net 코드도 작동하기 시작한다는 것입니다.

따라서 MSComm 컨트롤은 어떤 방식 으로든 SerialPort할 수없는 방식으로 장치를 작동시킵니다 . 연결을 열고 통신을 시작하는 VB6 애플리케이션의 코드는 간단하며 C #으로 변환되었습니다.

포트 모니터를 사용하여 실제로 어떤 데이터가 전송되었는지 확인했으며 실제로 MSComm 컨트롤은 실제 데이터 전송을 시작하기 전에 훨씬 더 많은 제어 바이트를 장치에 보냅니다. 내가 분별할 수 있었던 유일한 의미있는 차이는 MSComm 컨트롤 등 XON XOF, EvtChar에 대한 다른 제어 문자를 사용하지만 이러한 조정 후 것입니다 SerialPort뿐만 아니라 ( 이 링크를 참조 아무것도 변경되지 않습니다.

또 무슨 일이 일어날 수 있습니까? 포트를 통해 전송 된 데이터를 더 자세히 조사하면 결국 답을 얻을 수 있습니까? 아니면 완전히 다른 일이 진행되고있는 것일 수 있습니까?

답변

KenLee Dec 08 2020 at 17:11

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

}}