HEX 값 보내기
PROBLEM DESCRIPTION or QUESTION
Serial 통신에 사용하고 있습니다.
통신 패킷 전송을 16진수로 하는데, Xshell에서는 문자열 전송이 ASCII로만 보낼 수 있는건지, 16진수로 전송이 가능한지 궁금합니다.
STX와 ETX, CRC를 포함하여
“F2 24 1E 00 00 00 00 AE FD 03” 이런 형태의 패킷을 전송합니다.
제가 쓰는 패킷은 보통 50바이트, 최대 160바이트정도 사용합니다.
RESOLUTION
시리얼통신을 포함하여 터미널 통신은 문자열의 주고 받음입니다.
다만 해당 문자열이 키보드로 입력할 수 있는 값이냐 아니냐의 문제입니다.
키보드에서 발생할 수 있는 문자열을 제외한 값은 해당 문자의 ASCII 코드 번호를 사용하여 전송하면 됩니다.
코드 번호를 통하여 전송하는 방법은 작성창, 작성 바 그리고 빠른 명령을 통해서 가능합니다.
ASCII 코드번호 65번인 'A'문자를 다음과 같이 전송할 수 있습니다.
8진수 값 전송: \0101
16진수 값 전송: \x41
다음은 작성바를 통해서 보내 주신 예를 ASCII 코드 번호를 통해 문자를 전송하는 방법입니다.
메뉴에서 '보기 -> 작성 -> 작성 바'를 선택합니다.
예시의 값을 보내기 위해 작성 바에서 다음과 같이 입력합니다.
\xF2\x24\x1E\x00\x00\x00\x00\xAE\xFD\x03
터미널에 직접 값을 입력하기 위해서는 빠른 명령 버튼을 통하거나 스크립트를 작성하여야 합니다.
스크립트가 16진수 문자열을 받아 터미널에 전달하는 방법을 사용할 수 있을 것 같습니다.
다음은 어떤 빠른 명령 버튼을 눌렀을 때 16진수 문자열을 받아 터미널에 값을 전송하는 JS 스크립트 사용 예입니다.
메뉴의 ‘보기 → 빠른 명령 → 빠른 명령 바(혹은 빠른 명령 창)’ 선택
텍스트 편집기를 열어 다음 내용을 작성 후 확장자가 .js인 파일로 저장합니다.
function Main() { var string = xsh.Dialog.Prompt ("Insert Hex string. Including white spaces will be OK.", "HEX sender", "", 0); if(!verify(string)){ xsh.Dialog.msgbox("Error in HEX string"); return; } chars = string.split(/[\s]{1,}/); hexStr = ""; for(var idx in chars){ thisChar = chars[idx]; for(var i=0; i<thisChar.length; i+=2){ hexStr += String.fromCharCode(Number("0x"+thisChar.substr(i, 2))); } } xsh.screen.send(hexStr); } verify = function(string){ return !(string.replace(/[^0-9A-Fa-f]/g, "").length%2) && string.search(/[^0-9A-Fa-f\s]/) == -1; }
빠른 명령 바에서 단추 추가를 실행합니다.
편집 대화 상자에서 스크립트를 선택하고 위 2.의 스크립트 파일을 선택합니다.
빠른 명령 바에서 해당 명령 단추를 실행합니다.
터미널에 해당 문자가 출력되는 것을 확인합니다.
참고로 빠른 명령 버튼은 ‘사용자 지정 키 매핑’을 통해서 단축 키로 정할 수 있습니다.