문제

COM1을 통해 컨트롤러 카드와 통신하기 위해 .Net Framework 2.0 Serialport 클래스를 사용하여 C# 2.0에서 간단한 앱을 작성했습니다.

최근에 Read 메서드에서 반환된 바이트가 올바르지 않은 문제가 발생했습니다.올바른 양의 바이트를 반환했지만 값만 올바르지 않았습니다.하지만 Delphi로 작성된 유사한 앱은 여전히 ​​올바른 값을 반환했습니다.

나는 사용했다 포트몬 두 앱의 직렬 포트에 대한 활동을 기록하기 위해 두 로그를 비교하고 (분명히) 사소한 다른 설정이 있는 곳에서 가능한 한 가깝게 Delphi 앱을 모방하려고 시도했지만 소용이 없었습니다.

그렇다면 Read 메서드가 반환하는 바이트 값에는 무엇이 영향을 미칠 수 있습니까?

두 앱 간의 대부분의 설정은 동일합니다.

다음은 Portmon 로그에서 다른 행 목록입니다.

델파이 앱:

IOCTL_SERIAL_SET_CHAR 직렬0 성공 EOF:DC오류:0 BRK:0 EVT:0 XON:11 XOFF:13
IOCTL_SERIAL_SET_HANDFLOW SERIAL0 성공 흔들림 : 0 교체 : 0 Xon 한도:256 Xoff제한:256 IOCTL_SERIAL_SET_TIMEOUTS Serial0 성공 RI:-1 RM:100 RC:1000 WM:100 WC:1000 IOCTL_SERIAL_SET_WAIT_MASK Serial0 성공 마스크:RXCHAR RXFLAG TXEMPTY CTS DSR RLSD BRK ERR RING RX80FULL

C# 앱:

IOCTL_SERIAL_SET_CHAR 직렬0 성공 EOF:1a오류:0 BRK:0 EVT:1a XON : 11 XOFF : 13 IOCTL_SERIAL_SET_HANDFLOW SERIAL0 SHAKE : 0 교체 : 0 Xon제한:1024 Xoff제한:1024 IOCTL_SERIAL_SET_TIMEOUTS Serial0 성공 RI:-1 RM:-1 RC:1000 WM:0 WC:1000 IOCTL_SERIAL_SET_WAIT_MASK Serial0 성공 마스크:rxchar rxflag cts dsr rlsd brk err ring

업데이트:

올바른 반환 바이트는 다음과 같습니다.91, 1, 1, 3, 48, 48, 50, 69, 66, 51, 70, 55, 52, 93(14바이트).마지막 값은 간단한 체크섬입니다.

반환된 잘못된 값은 다음과 같습니다.91, 241, 254, 252, 242, 146, 42, 201, 51, 70, 55, 52, 93(13바이트).

보시다시피 반환된 첫 번째와 마지막 5바이트가 일치합니다.

ErrorReceived 이벤트는 잘못된 값을 설명할 수 있는 프레이밍 오류가 발생했음을 나타냅니다.그러나 문제는 Delphi 앱에서는 프레이밍 오류가 발생하지 않는데 왜 SerialPort에서는 프레이밍 오류가 발생하는가입니다.

도움이 되었습니까?

해결책

글쎄, (적어도 당분간은) 문제가 해결된 것 같습니다.

프레임 오류로 인해 잘못된 값이 반환된 것 같습니다.나는 MSComm 컨트롤을 사용하여 VB6 앱을 작성했는데 잘 작동했고 Portmon에서 생성된 로그 파일을 비교했습니다.

나는 다음과 같은 차이점을 발견했습니다.

VB6 앱:

IOCTL_SERIAL_SET_HANDFLOW SERIAL0 성공 쉐이크:1 교체 : 0 Xonlimit : 256 XOFFLIMIT : 256

C# 앱:

IOCTL_SERIAL_SET_HANDFLOW SERIAL0 성공 쉐이크:0 교체 : 0 Xonlimit : 1024 XOFFLIMIT : 1024

설정을 가지고 놀면서 설정하면_serialPort.DtrEnable = trueC# 앱은 다음 로그 항목을 생성합니다.

IOCTL_SERIAL_SET_HANDFLOW SERIAL0 성공 쉐이크:1 교체 : 0 Xonlimit : 1024 XOFFLIMIT : 1024

이는 프레이밍 오류를 방지하는 것 같았고 응용 프로그램이 제대로 작동하는 것 같습니다.

다른 팁

데이터 비트 수, 정지 비트, 패리티 설정을 확인하셨나요?

패리티 비트는 일종의 오류 감지 메커니즘입니다.예를 들어:7개의 데이터 비트와 1개의 패리티 비트를 사용하여 전송하는 경우 8번째 비트는 비트 반전 오류를 감지하는 데 사용됩니다.수신기가 8개의 데이터 비트를 예상하고 패리티 비트가 없을 것으로 예상하면 결과가 왜곡됩니다.

불행히도 당신은 어떤 유형의 차이점이 있는지 정확히 언급하지 않았습니다.가끔씩 나타나는 문자가 다르나요? 아니면 들어오는 모든 데이터가 깨졌나요?SerialPort.Read 함수를 통해 읽은 문자는 설정으로 인해 시스템에 의해 변경될 수 있습니다. SerialPort.인코딩 재산.이 설정은 ASCII, 유니코드, UTF8 또는 Windows가 '원시 바이트'를 '읽을 수 있는 텍스트'로 변환하는 데 사용하는 기타 코딩 체계의 텍스트인 것처럼 들어오는 텍스트의 해석에 영향을 줍니다.

바이트 배열로 읽는 경우(예:SerialPort.Read) PortMon에 표시된 바이트를 정확하게 가져와야 합니다.

문자(SerialPort.ReadLine 또는 SerialPort.ReadChar)로 변환하는 경우 데이터는 현재 인코딩(SerialPort.Encoding 속성)을 사용하여 인코딩되며, 이는 표시되는 차이점을 설명합니다.

전송 중인 바이트와 동일한 이진 값을 가진 문자를 보려면 사용하기에 좋은 인코딩은 다음에 설명된 대로 Latin-1입니다. 이 게시물.

예:

SerialPort.Encoding = Encoding.GetEncoding("Latin1")
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top