2016-12-21 22 views
0

현재 SAS602을 사용하여 슬롯 머신과 인터페이스하기 위해 슬롯 어카운팅 시스템을 구현 중입니다. 이 프로토콜은 직렬 통신을 위해 비표준 9 비트 프로토콜을 사용합니다. 그래서 데이터는 시작 비트 + 8 데이터 비트 +1 스톱 비트 +1 웨이크 업 비트 (나의 경우 패리티 비트)Java를 사용하여 원시 직렬 데이터를 읽는 방법?

슬롯 머신은 웨이크 업 비트를 기반으로 주소 바이트와 데이터 바이트를 식별합니다. 설정되어 있으면 바이트는 주소이며 지워지고 데이터 바이트입니다.

9 비트 지원을 사용할 수없는 프로토콜에서도 언급되는데 이는 표식/공간 패리티를 사용하는 것이 좋습니다. 나는 jserialcom와 자바에 있고 슬롯 머신과 연결을 확립하고 데이터를 읽을 수 있었다. 그러나 jserialcomm 라이브러리 readbytes 원시 데이터를 스트립 및 나만 데이터 바이트 제공하기 때문에 데이터와 주소 바이트를 구별 할 수 없습니다. 패리티 비트 상태에 액세스 할 수 없습니다.

Java로 원시 11 비트 데이터를 가져올 수 있습니까? 심지어 가능할까요? 그렇다면 어떻게해야합니까?

라이브러리 또는 Linux 플랫폼을 엽니 다.

+0

글쎄, 그 하나의 라이브러리가 당신에게 필요한 것을주지 않는다면; 나는 대안을 찾기 시작할 것입니다. 최악의 경우, 소스 코드를 조사해야합니다. 그 일의 자신의 버전을 생각해 내고 ... 당신에게 그것을 적응 시켜라. – GhostCat

+0

나는 당신이 원시 소켓에 의지해야하고 당신 자신의 모든 지저분한 것들을 다루어야 할 것입니다. Slot 공급 업체가 그러한 라이브러리를 제공하지 않는다면, 다른 누구도 그렇게 생각하지 않을 것입니다. 투표가 종료 됨 - 적합하지 않음. – duffymo

+0

* "데이터가 1 ​​시작 비트 + 8 데이터 비트 + 1 정지 비트 + 1 깨우기 비트"* - 프레임 외부에 정보 비트가있는 것은 비현실적입니다 (즉, 정지 비트 이후). * UART/USART/SSC는 시작 및 정지 프레이밍 비트를 보존하지 않습니다. 고정 값이므로 정보가 없습니다. – sawdust

답변

0

데이터를 수신 할 때 패리티 검사를 무시하고 데이터를 전송할 때 패리티 비트를 설정하도록 Jserialcomm 라이브러리를 수정하여 종료되었습니다. 수신 된 데이터에 대한 오류 검사는 전적으로 CRC를 기반으로합니다. 지금까지 잘 작동합니다.

수신 된 데이터에 NO_PARITY를 설정하여 위와 같은 결과를 얻을 수는 있지만. MARK 및 SPACE 패리티는 바이트를 보낼 때 사용됩니다. 패리티 설정시 200ms의 지연이 있기 때문에 Jserialcomm 라이브러리로 패리티를 전환 할 때. 이것은 다시 데이터 손실을 초래합니다. 나는 왜 그런 지연이 있어야하는지 완전히 확신하지 못한다.

패리티 검사 후에 오류가 발생할 때마다 수신되는 모든 단일 바이트에 255 0을 추가하는 옵션도 있습니다. 이는 패리티 검사 메커니즘을 반대로 적용 할 수 있습니다. 그러나이 메서드는 또한 여분의 바이트를 추가하는 데 시간이 걸리고 많은 양의 데이터가 손실 될 수 있으므로 오류가 발생하기 쉽습니다. 또한 Jserialcomm 라이브러리를 수정해야합니다.

1

9 번째 비트는 데이터가 아니지만 제어 정보를 전달하므로 직렬 포트를 구성 할 때 패리티 검사를 활성화 할 수 있습니다. 이제 데이터가 수신 바이트의 1의 카운트 수를 수신하고 패리티 에러가 발생했는지 여부를 확인하십시오. 그것이 발생하지 않고 1의 수를 알면 패리티 비트가 1 또는 0이고 따라서 데이터 또는 제어임을 쉽게 추론 할 수 있습니다.

또한 this article에서 약 9 번째 비트를 직렬 포트에서 살펴보십시오.