2009-02-27 3 views
2

직렬 포트를 열고 직렬 포트를 통해 저울의 데이터를 성공적으로 전송하려면 직렬 포트 개체의 설정이 저울의 실제 설정과 일치하는지 확인해야합니다.Compact Framework 직렬 포트 및 저울

지금 질문은 설정이 다르므로 연결이 설정되지 않았 음을 어떻게 감지합니까? serialPort.Open은 연결이 설정되었음을 나타 내기 위해 예외를 throw하지 않습니다. 예, 설정은 유효하지만 기기 (잔액) 설정과 일치하지 않는 경우 설정이 유효합니다. 나는 왜 저울에서 체중이 포착되지 않는지 어둠 속에있다.

여기에 입력 사항이 있습니까?

+0

기기에서 기대하는 데이터의 형식을 설명하여 확장 할 수 있으십니까? –

+0

모델 번호를 사용할 수 있다면 사용중인 실제 장치에 대한 자세한 내용이 무엇인지 잘못 판단 할 수 있습니다. –

답변

0

는 .NET 시리얼 포트 객체도 (치명적인 일이 발생할 때까지 즉,) 당신에게 오류를 제공하지 않을 수 있습니다.

가장 일반적인 직렬 포트 통신 오류는 전송 속도 불일치로 인해 발생합니다. '에코'를 얻을 수 있다는 메시지가 있으면 핸드 셰이크 작업의 일환으로 시도하십시오. 아마도 연결하려는 장치에 '상태'메시지가 표시되었을 것입니다. 그것을 요청할 때 아무런 해가 없으며 의사 소통이 제대로 이루어지고 있는지를 알 수 있습니다.

소프트웨어 핸드 셰이 킹 (xon xoff)의 경우 제대로 구성되었는지 여부를 감지 할 수있는 방법은 거의 없습니다. 직렬 포트 개체는 기본 직렬 포트 드라이버 구현에 따라 스레드 예외 예외가 발생하면이 매개 변수를 완전히 무시한 상태에서 모든 작업을 수행 할 수 있습니다. xon/xoff를 완전히 무시한 직렬 포트 드라이버를 사용하고 문자를 프로그램에 직접 전달합니다. 예.

하드웨어 핸드 셰이 킹의 경우 장치 작동 방식에 따라 전송 속도에 대한 기본 반향 전략이 작동 할 수 있습니다. 하드웨어 핸드 쉐이킹을 수행 할 것이라는 것을 알고 있으면이를 감지하여 켤 수 있습니다. 장치가 하드웨어 핸드 셰이 킹을 필요로하고 켜져 있지 않은 경우 아무 것도 얻을 수 없으며 반대의 경우도 마찬가지입니다.

거의 사용되지 않는 또 다른 설정은 DTR 핀 - 데이터 터미널 준비 상태입니다. 일부 시리얼 장치는 이것이 데이터 송신을 시작할 시간임을 나타 내기 위해 이것이 어설 션되어야합니다 (예 : true로 설정). 기본적으로 false로 설정됩니다. 소용돌이 치기.

직렬 포트 개체가 ... 까다 롭습니다. 꼭 필요한 것은 아니지만, 변경하기 전에 포트를 닫는 것을 고려할 것입니다.

편집 : this이 장치처럼 당신의 의견에

덕분에, 그것은 보인다.이 기본 설정이되어야합니다 말한다 :

  • 1200 보드
  • 홀수 패리티
  • 1 정지 비트
  • 하드웨어 핸드 쉐이킹

그것은 얼마나 많은 데이터 비트를 지정하지 않지만 장치는 7과 8을 지원한다고 말합니다. 또한 600, 1200, 2400, 4800, 9600 및 19200 보오를 지원합니다.

하드웨어 핸드 쉐이킹을 켜고 DTR을 활성화하고 (다른 기능) 모든 다른 전송 속도를 순환하면 사용자 설정이 아니라는 가능성이 있습니다. 사용중인 직렬 케이블이 장치에 잘못 연결되었을 수 있습니다. 일부 직렬 케이블은 '통과 (passthrough)'케이블입니다. 한 쪽의 1-9 핀은 다른 쪽의 1-9 핀과 정확히 일치합니다. 그런 다음 "TX"및 "RX"케이블이 전환되는 '크로스 오버'케이블이 있습니다 (한 쪽이 전송할 때 다른 쪽이 매우 편리한 케이블을 수신 할 수 있도록).

명령 표 거기에 매뉴얼의 뒷면에; 어떤 유형의 에코 백을 얻기 위해 발행 할 수있는 "인쇄 소프트웨어 버전"명령이 있습니다.

+0

핸드 셰이크 = 없음을 사용합니다. – sarsnake

+0

핸드 셰이 킹이 장치가 설정된 것과 일치하면 문제가되지 않습니다. 어설 션하는 것이 중요 할 수있는 또 다른 요소는 DTR - 데이터 터미널 준비 상태입니다. 내 대답을 업데이트 할게. –

+0

모든 잔액을 직렬 포트를 통해 통신 할 수 있습니까? NET 직렬 포트 제어와 함께 작동하도록하려면 어떻게해야합니까? – sarsnake

1

균형에서 예상되는 데이터 형식에 대한 더 이상의 정보를 알지 못하는 경우 일반 직렬 포트 설정 불일치 검색 기술 만 적용 할 수 있습니다.

UART 설정이 상당히 잘못된 경우 많은 프레임 오류가 표시됩니다. UART가 1 스톱 비트를 예상하면 사실 0이 표시됩니다. ErrorReceived 이벤트로이를 감지 할 수 있습니다 항구. 상황이 가까운,하지만 여전히 잘못된 경우

private void OnErrorReceived(object sender, SerialErrorReceivedEventArgs e) 
{ 
    if ((e.EventType & SerialError.Frame) == SerialError.Frame) 
    { 
     // your settings don't match, try something else 
    } 
} 
+0

이 오류는 감지되지 않습니다. – sarsnake

+0

불일치의 본질은 무엇입니까? 비트 전송률이 다릅니 까 아니면 패리티의 차이가 있습니까 (7E1 대 8N1)? –

+0

현재 설정 파일에서 기본 설정 (보오, 패리티, 정지 비트 등)을 유지합니다. 우리는 일반적으로 같은 방법으로 프로그래밍 된 모든 저울을 가지고 있지만, 일부 기묘한 저울은 다른 설정을 가질 수 있습니다. 이 경우 포트가 제대로 열리지 않았다는 것을 사용자에게 알리고 싶습니다. – sarsnake

0

직렬 포트는 RS-232이라는 매우 오래된 프로토콜을 사용하는 매우 오래된 통신 기술을 사용합니다. 이것은 꽤나 간단합니다 ... 두 엔드 포인트는 동기화 된 클록을 가지고 있으며 클럭주기마다 라인 전압을 테스트하여 높거나 낮음인지를 확인합니다 (높은 0과 낮은 meaing 1은 반대입니다. 대부분의 관례들 ... 다시 프로토콜의 나이의 인공물). 클록 동기화는 정지 비트를 사용하여 수행되며, 실제로는 바이트 사이의 휴식 시간입니다. 또한 패리티 비트, XON/XOFF 등과 같은 프로토콜의 고급 사용에 던져지는 몇 가지 사항이 있지만이 모든 것들은이 매우 기본적인 통신 계층 위에 있습니다. 직렬 회선의 각 끝에있는 시계의 불일치를 감지하는 것은 거의 불가능할 것입니다 - 수신하는쪽에 잘못된 데이터가 표시됩니다. 프로토콜 자체는 이러한 상황을 식별 할 수있는 방법이 없습니다. 나는 입력 데이터가 부적절한 주파수로 클럭되고 있음을 알 수있을 정도로 똑똑한 직렬 드라이버를 모르고있다. 패리티 비트와 같은 오류 검색 체계 중 하나를 사용하는 경우 모든 바이트가 오류로 확률 적으로 선언됩니다. 즉, 들어오는 데이터에 오류가 있는지 확인하는 것입니다 (패리티 오류는 드라이버/소프트웨어 계층에서 감지해야하지만 해당 계층의 응용 프로그램에서받은 데이터의 오류는 프로그램에서 확인해야합니다) 후자는 checksums을 사용하여 지원할 수 있습니다).

+0

"소프트웨어 계층에서 패리티 오류를 감지했습니다"라는 것은 초기화시를 의미합니까? – sarsnake

+0

아니요, 패리티 비트는 직렬 링크를 통해 전송되는 모든 바이트와 함께 전송됩니다. 데이터가 응용 프로그램으로 전달되기 전에 수신기는 이러한 패리티 비트를 디코딩하므로 데이터가 수신 될 때만 오류가보고됩니다. – rmeador

+0

오, 그건 그렇고, 내가 명확하지 않은 경우에 RS-232로 초기화 할 때 데이터가 전송되지 않습니다. 연결 설정시 수행되는 핸드 쉐이크 또는 다른 데이터 교환은 기본 직렬 링크가 아닌 응용 프로그램 수준 프로토콜의 일부입니다. – rmeador