2012-07-04 2 views
3

많은 페이지를 선택했지만 여전히 답을 찾지 못했습니다.직렬 포트에서 C# 주기적으로 새 줄을 읽는 중

내 문제는 다음과 같습니다. RS232를 통해 컴퓨터에 연결된 장치가 있습니다. 기기가 다음과 같이 두 번째 줄을 보내고 있습니다.

"*X;0;bbb;cc;d;eee;f\r\n" 

필드는 고정 폭 숫자 필드입니다. 매 분마다 0 플래그가 1로 올라가고 "cc"가 변경됩니다. 그 때 내가 필요로하는이 번호.

C# 응용 프로그램에서는 제대로 작동하지 않습니다. recieve 이벤트를 사용하여 데이터를 얻으려고했지만 새로 고친 결과에 10 초 이상 처리해야합니다. 이것은 플래그가 올라간 지 10 초 후에 결과를 얻는다는 것을 의미합니다. 때로는 더 오래 걸리는 경우도 있습니다.

먼저 RecieveEvent로 시도해 보았습니다. 심지어 라인을 채울 때까지 버퍼를 채우려고했지만, 다시 같은 결과가 나타납니다. 그런 다음 Timer를 사용하여 300ms마다 호출하고 행을 읽습니다. 여전히 같은 문제.

제 질문은 직렬 포트에서 최신 데이터를 읽고 최신 상태로 유지하는 방법입니다.

+0

당신은 매우 혼란스럽고, 저처럼 될 수도 있습니다. 결과를 계산하는 데 10 초가 걸리고 더 빨리 원하면 시간 기계가 필요합니다. 당신은 충분한 jiggawatts가 없습니다. –

+0

아니요, 여기서 문제는 지연이 있다는 것입니다. 내가 관심있는 문자열이 지금 (시간 = t) 보내졌고, 나는 보통 그것을 얻는다 (시간 = t + 10 초). 아마도 어딘가에 버퍼에 저장되어있을 것입니다. 그러나 ReadLine() 함수가 올 때까지 10 초 이상이 지나면 –

답변

2

읽을 때 직렬 포트는 데이터를 버퍼링합니다. 이것은 약간의 지연을 가져올 것입니다 (그러나 우리는 수십 초가 아니라 밀리 초를 말합니다). 대부분의 직렬 장치 드라이버는 버퍼링을 구성 할 수있게 해줍니다.

ReadLine을 호출하면 데이터를 반환하기 전에 줄 바꿈을받을 때까지 기다릴 것이므로 더 많은 지연을 도입 할 수 있습니다. 장치가 좋은 개행을 보내고 있습니까? 터미널 에뮬레이터 프로그램을 사용하여 장치 설명서가 종종 끔찍한 것처럼 정확하게 장치가 무엇을 보내고 있는지 확인하십시오!

포트에서 원시 데이터를 읽고 나서 직접 구문 분석합니다. 부분 패킷을 수신하는 데 더주의해야하지만 그림에서 모든 중산층을 제거하면 관용을 강화할 수 있습니다 (예 : 데이터에 줄 바꿈이 있는지 여부는 신경 쓰지 않음). 읽기를 시작한 다음 디버그 콘솔에받은 데이터를 기록하면 곧 프로그램에서 수신하는 정보와 빈도 등을 확인할 수 있습니다. 지연이 직렬 포트 또는 처리 중에있는 경우에도 표시됩니다. 메시지

+0

을 전달합니다. 퍼티와 같은 터미널 에뮬레이터를 사용하여 출력을 확실히 분석하십시오. 특히 줄 끝을 분석하십시오. 정말로'\ r'인가, 아니면'\ n'입니까? – dialer

+0

하지만 데이터 이벤트를 통해 또는 주기적으로 n 밀리 초마다 데이터를 읽으시겠습니까? –

+0

사실, 지금은 그 장치가 아직 없기 때문에 그 순간 에뮬레이터입니다. 다른 응용 프로그램에서 com0com을 통해 원본으로 보냅니다. 그리고 거기에 문서에 쓰여 있듯이 \ r \ n을 사용합니다. 환경을 사용해야할까요 .Newline? –

관련 문제