2011-10-18 7 views
1

SerialPort를 사용하는 장치와 통신 중입니다. 장치에는 RS-485가 있고 반대쪽 (PC)에는 RS-232 (가상 포트)가 있습니다. 장치가 올바르게 작동하고 데이터를주고받습니다.때때로 DataReceived 이벤트가 실행되지 않습니다.

문제는 DataReceived 이벤트가 발생하지 않는 것입니다. System.Timer를 사용하여 10 초마다 한 번씩 장치에 데이터를 보냅니다. 대부분의 경우에는 정상적으로 작동하지만 1 ~ 10 분마다 응답을 얻지 못하고 2-4 번이 지나면 DataReceived 이벤트가 마비되고 데이터 클러스터가 생깁니다 (이전에 "요청한 모든 것" for가 버퍼에 있음).

내 질문 : 어떻게 가능합니까?

여기에 코드 예를 넣을 수 없지만 미안하지만 내 응용 프로그램에는 다중 스레드가 없습니다 (주 스레드와 Timer_Elapsed 및 DataReceived 이벤트가있는 스레드 만 별도 스레드에서 발생시킨 것 같습니다). 내 DataReceived 이벤트가 빠르게 처리되고 병렬로 발생해서는 안됩니다 (10 초가 길어서 장치 응답 시간이 1 초 미만 임). Thread.Sleep을 사용하면, 그 곳과 아무런 관계가 없을 것이라고 확신합니다.

COM 포트가 다른 응용 프로그램을 사용하여 테스트 할 때 COM 포트가 비슷한 방식으로 손상되기 때문에 하드웨어 문제 일 수 있습니다 (그 중 하나는 연결 테스트를 위해 제공된 장치 제조업체가 C#으로 작성된 것처럼 보이지 않음). 하지만 하드웨어가 그렇게 좋지는 않습니다. 어쩌면 PC 나 COM 포트에 문제가있을 수 있습니다 (외부에 내장되어 있지는 않습니다). 또는 운영 체제와 관련 될 수 있습니까 (내 응용 프로그램은 Windows Server 2003에서 실행되는 Windows 서비스 임).

답변

1

하드웨어 문제로 판명되었습니다.

디바이스 타협 접속은 다음과 같다 : 장치 <> RS-485 <> Converter1 <> LAN <> 아날로그 변환기 <> RS-232 <> 컴퓨터 <> 가상 COM

Converter1 고장 발생

, 그것은 장치가 클러스터에 전송하는 데이터를 클러스터링하고 보유합니다. 이제 나는 틀린 것이 무엇인지 알기 때문에 유능한 사람들이 그것을 돌볼 수있게 해달라.

감사합니다. @Matthew Rodatus에게 도움을 청합니다. 로터리 방식의 귀하의 답변은 정확히 정확히 언제 내 COM에 올지를 확인하도록 안내했습니다.

+0

그에게 upvote를주는 이유는 무엇입니까? – jgauffin

+0

문제 없습니다, @Arie. 다행스럽게 생각 했어. –

3

버퍼가 예상대로 플러시되지 않는 것처럼 들립니다.

수신 된 모든 바이트에 대해 DataReceived 이벤트가 발생한다고 보장 할 수 없습니다. BytesToRead 속성을 사용하여 버퍼에 남아있는 데이터의 양을 결정합니다.

당신이 ReadBufferSizeReceivedBytesThreshold 속성을 조정 해봤 (Btw는의 DataReceived 이벤트가 실제로 보조 스레드에서 발생합니다.)

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx를 참조하십시오? 그것이 내가 조사하기 시작할 곳입니다. 메시지의 대략적인 크기를 알고 있습니까? ReceivedBytesThreshold 등록 정보를 장치에서 수신 할 것으로 예상되는 최소 메시지 크기 바로 아래로 설정하려고합니다. 그런 다음 마지막 몇 바이트를 가져 와서 메시지를 완료하기 위해 짧은 대기 시간 동안 대기해야합니다.

+0

내 앱에서 ReceivedBytesThreshold = 1 (기본값). MSDN은 ReadBufferSize가 4096보다 작을 수 없다고 말합니다. 이상하게도 동일한 컴퓨터에서 실행되는 COM 포트 (약간 다른 종류의 장치, 일반 RS-232로 컴퓨터에 연결된)와 통신하는 두 개의 다른 Windows 서비스가 있는데, 다시 잘 작동합니다. 사건은 적절하게 제기되고 실행됩니다. 모든 코드 3의 코드베이스는 동일하며 3 차 수정 코드도 있습니다. 프로그램의 구조는 이전 DataReceived 이벤트가 완료 될 때까지 데이터가 도착하지 않도록 보장합니다. – Arie

관련 문제