본문 바로가기

IT 관련/개발 자료

parity?? lrc?? crc?? checksum??? 이게 뭐야?? 데이터 오류 검출 방식 중 LRC(Longitudinal Redundancy Check)에 대하여

반응형

#parity , #lrc , #crc , #checksum , ... 등등... 얘들은 통신 시 데이터 오류 검출 방식에 대한 종류입니다.

주로 #시리얼통신 에서 발생하는 데이터 손실을 감지하여 정확한 데이터 전달을 보장하기 위한 하나의 수단이라 보시면 될거 같습니다.

2020/02/27 - [IT 관련/개발 자료] - socat - MacOS / Linux 에서 serial port test (시리얼포트 테스트)가 필요해요!!

 

socat - MacOS / Linux 에서 serial port test (시리얼포트 테스트)가 필요해요!!

수행하는 프로젝트 중 #PLC (Power Line Communication) 와 #RS485 방식으로 #serial 통신을 하는 부분이 있었습니다. 다른 팀원들이 Linux PC 에 #USB to Serial (RS485) converter 로 PLC에 연결하여 테스트를..

hsnation.tistory.com

 

 

 

 

 

 

 

 

데이터 송수신 예시

 

아주 간단하게 시리얼 통신을 통해 데이터를 주고 받는 플로우를 한번 그려봤습니다.

먼저, 송신하는 측에서 "안녕하세요?" 를 보냅니다. 수신하는 측에서 정상적으로 "안녕하세요?" 를 받았다면

정상적으로 데이터를 받은 것이겠죠?? 정상적으로 데이터를 받으면 송신측에 잘받았다고 회신해줍니다.

 

근데 아래처럼 "안녕하세요?" 라고 보냈는데 수신측에서는 "안녕세요?" 를 받았는데 이건 데이터가 중간에 유실된 것이죠.

이럴때에는 수신측이 니가 보낸 데이터 이상해!!! 다시 줘!!! 라고 회신을 하고, 송신측에선 원래 보냈던

데이터를 재송신하는 행위를 진행하게 됩니다.

 

 

 

 

 

 

 

그러면 무슨 근거로 송신자가 보낸 데이터와 수신자가 받은 데이터가 일치하는지를 판단할까요??

사전에 데이터 통신을 하기 위해서는 #프로토콜 이라고 불리우는 #통신규약 을 정해놓습니다.

#stx, #etx , #parity 등 다양한 어려운 얘기들은 #패스 하고!! 그냥 위에 그림처럼 쉽게 설명해보겠습니다.

오류 검증 코드를 추가한 데이터 송수신 예제

 

짜잔~~ 앞의 그림과 차이점이 보이시나요?

"안녕하세요?" 문구 뒤에 "code" 라는걸 붙여서 보내죠? 이런 코드는 기본적으로

보낼 문자열들을 순차적으로 OR 연산이나 XOR 연산 등을 하여 2바이트로 code를 결정하게 되는데요.

역시 복잡한 얘기는 패쓰하고, 쉽게 말해서 규칙을 정해서 보낼 문자열들을 2바이트의 #체크비트 로 변환하여

원 데이터와 체크비트를 함께 보낸다! 라고 생각하시면 이해가 쉬우실거 같아요.

 

수신자는 미리 정해놓은 것처럼 젤 뒤의 2글자는 오류를 검출하는 코드야~ 라고 생각하고 수신을 하죠

그리고 수신받은 데이터의 뒤에 2자리 빼고 정해둔 규칙으로 #체크비트 를 만듭니다.

수신받은 뒤의 2자리와 규칙에 따라 만든 체크비트를 서로 비교하여 같으면 정상수신, 틀리면 데이터 손실로

판단하게 되는거죠! 참 쉽죠??

 

 

 

 

 

 

 

체크비트를 만드는 다양한 종류 중 하나인 LRC (Longitudinal Redundancy Check)대해 보려고 합니다.

( #Modbus #ascii #프로토콜 을 사용하면 얘를 써야한대요...)

Wikipedia 의 LRC 정의 바로가기

 

Longitudinal redundancy check - Wikipedia

In telecommunication, a longitudinal redundancy check (LRC), or horizontal redundancy check, is a form of redundancy check that is applied independently to each of a parallel group of bit streams. The data must be divided into transmission blocks, to which

en.wikipedia.org

 

 

 

 

 

 

사이트 보자마자 또 영어고...또 막 전문 용어 같고....또 막 소스코드 나오고....저도 이런거 못보겠어요ㅠㅠ

lrc := 0
for each byte b in the buffer do
    lrc := (lrc + b) and 0xFF
lrc := (((lrc XOR 0xFF) + 1) and 0xFF)

 

소스코드의 개념도? 라고 볼 수 있는 #슈도코드 를 위와 같이 정의해줬네요.

사실...저도 봐도 몰라요ㅎㅎㅎ 이럴 땐 또 구글링을 해야겠죠!!

저의 느낌적인 느낌으로 찾아낸 소스 코드입니다. ( #Java 기반으로 프로젝트가 되어 있어 #자바 코드입니다.)

public static String lrc2hex (String str) {
    byte[] bytes = str.getBytes ();
    int lrc = 0;
    for (int i = 0; i < str.length (); i++) {
        lrc ^= (bytes[i] & 0xFF);
    }
    return String.format ("%02X ", lrc);
}
...

String data = "0200|666|0|0" + "\u0003";       // Includes a non-visible character
System.out.println ("DATA: " + data);          // DATA: 0200|666|0|0
System.out.println ("LRC: " + lrc2hex (data)); // LRC: 4B 

출처 (Stackoverflow) 바로가기

 

Calculating LRC in java

I want to calculate LRC for the following message: T = 0101 0100 P = 0101 0000 1 = 0011 0001 2 = 0011 0010 Starting with 0x00 as the initial byte. 0 XOR ‘T’: 0000 0000 0101 0100 Result, ...

stackoverflow.com

물론 저거 넣는다고 제대로는 아마 안될꺼에요!! 넣어보고 통신 테스트해보며 잘 되나 디버깅을 해나가야죠!!

 

 

 

 

 

 

 

저도 #복붙개발자 로써 모든걸 다 이해하기 보단...눈치껏 여기저기서 복사 - 붙여넣기 를 선호합니다....

최대한 필요한 부분을 쉽고 전문적이지 않게 작성하고 있으니...전문가분들은 적절한 태클과 못본척 부탁드립니다.^^

 

남은 하루도 즐겁게~

반응형