Network/Data communication

Serial 통신 한글깨짐 문제(Encoding 처리)

범데이 2022. 4. 17. 16:45

1. 개요

NodeJS의 Serialport라이브러리를 사용하여 Serial 통신을 통해 USB단자로 연결된 단말기 포트(COM)로 출력 데이터를 전송하였는데, 아래 사진과 같이 한글이 깨져서 출력되는 문제가 발생했었다.

이는 Javascript의 표준 내장 method charCodeAt 를 통해 Charactor의 UTF-16 code를 구해 배열에 담아서 넘겼었는데, 이러한 출력이 되었다. 그래서 UTF8 code로 인코딩하는 함수를 통해 배열에 담아 보냈는데도, 동일하게 깨져서 출력되었었다.

 

 

2. 해결 과정

 

 

.NET사이트를 탐색해보니 위의 사진과 같이 Windows desktop의 .NET Framework의 기본 속성은 시스템의 활성 코드 페이지를 가져오고, 이에 해당하는 Encoding 개체를 만든다고 한다.

 

 

그래서 명령 프롬프트를 켜서 "chcp" 명령어를 입력하여 시스템 활성 코드페이지를 확인해 보자.

출력 결과로 아래와같이 "949" 임을 확인할 수 있다.

 

 

이제 인코딩되는 코드페이지를 알게 되었으니

 

iconv라이브러리의 encode 메서드를 이용하여 아래와 같이 인코딩을 해주었다.

(문자를 인코딩하는 방법은 여러가지로, 어떤 방법을 선택하든 무방하다.)

iconv.encode(stringData, 'ms949')

 

이렇게해서 시스템 활성 코드 페이지인 "ms949" 방식으로 문자를 인코딩하여 Serial 포트로 출력 데이터를 쏘니 결제기기에서 디코딩 하여 출력한 문자들이 아래 사진과 같이 깨지지 않고 정상적으로 출력됨을 확인할 수 있었다..

 

 

3. 결론

결론은 당연하게도 Encoding 문제였지만 시리얼 통신을 처음 다뤄보면서 엉뚱한 곳에서 문제를 찾느라 다소 헤맸었다. 당연히 문자가 깨진다는것은 인코딩 방식과 디코딩 방식이 다른 것이다. 이렇게 해결하고나면 이미 원인을 알고 있거나 간단한 문제였더라도 막상 막히고나면 생각이 막힐 때가 있는것같다. 실이 꼬였다고 무작정 풀려고하지말고 왜 꼬였는지를 근본적인 분석을 하는 습관을 들여야겠다.

 

 

 

반응형