http://blog.naver.com/an4tan/120022599700
// 시리얼 통신 제어 프로그램 -- 프로그래밍 기법 //
여러분이 프리랜서 아니면 초보 개발자라 할지라도 가장 많이 코딩하게 되시는 것이
바로 산업용 시리얼 통신 기기의 제어입니다.
주로 컴퓨터와는 근거리 즉 2미터 이내의 케이블로 연결된 장치를 제어하게 됩니다.
보기를 들면 각종 POS 기기, 바코드 프린터, 터치모니터, 전광판, 카드 인식기기,
휴대폰, PDA 등 수 없이 많습니다.
우선 시리얼 통신 제어 프로 그램을 작성하기 위해선 시리얼 컴퍼넌트를 활성화
하는 부분을 try ~ except ~ end; 문으로 감싸야 합니다.
이렇게 하지 않으면 에러 발생시 컴퓨터가 먹통이 되는 경우도 생깁니다.
다른 어플에서 시리얼 포트를 사용 할 때 또 다른 어플이 같은 시리얼 포트를
사용하지 않도록 해야합니다.
우선 시리얼 제어용 유명한 상용 컴포넌트는 바로 터보 파워의 어씽크
프로페션널입니다. 가격은 아마도 일백만원대 일 것입니다.
이 컴포넌트는 우리에게 많이 알려져 있습니다.
어씽크 콤퍼넌트를 사용 할 때 주의 사항은 버전에 따라서 일회 전송 량이
8 바이트로써 ( 8 * 1024 ) 8바이트가 넘은 경우에는 8바이트 씩 나누어 가져옵니다.
그래서 stx := #02 + 전송 데이터 + etx := #03 형식으로 가져옵니다.
여기에서 전송 데이터가 20 바이트가 넘는 경우에는 어씽크에서는 두번 나누어서
가져오게 됩니다. 전송 이 벤트가 여러번 호출 된다는 의미입니다.
이것은 제어용 데이타가 산업용 제어기기에 전송 시점의 동기화가 필요 할 때는
무척 제어를 어렵게 만듭니다.
모든 시리얼 콤포넌트가 그렇듯이 char 타입으로 1문자씩 8비트로 가져옵니다.
보통 컴포넌트 이벤트에서 카운터 많큼 가져 옵니다.
var
i : integer;
read_data : string;
begin
for i := 1 to count do
read_data := read_data + getread();
end;
예를 들어 알파벳 A라는 문자가 전송 될 때,
STX - A - ETX 또는 [02] - A - [03] 이렇게 전송됩니다.
일단 컴포트로 전송된 데이터를 읽어 드려서 STX가 감지되면 지금 버퍼로 읽어 드리고
있는 중이고 ETX가 감지되면 전송이 끝났다는 것이 감지됩니다. 보통 이 때 데이터를
버퍼로 부터 읽어 들이고 난 다음에 다음 전송을 위해서 버퍼를 초기화 시킵니다.
로직을 자세히 설명드리면,
우선 컴포트 상태를 판별하기 위한 상수가 필요합니다.
stx := 02, etx:=03 으로 상수가 사전 정의 된다.
컴포트 작동을 콘트롤을 하는 판별자를 상태에 따라 변수에 배열 형태로 자료형을 정의하고
그 크기를 설정한다. 변수의 그 크기를 측정하고 그 크기만큼 0으로 채워서 배열 변수를
초기화 시킨다.
카운터가 0 이상이면 카운터 -1 만큼 변수에 읽어 드린 자료를 저장한다.
변수에 읽어드린 데이타를 검사하여 컴포트의 상태를 판별한다.
만약 STX가 인지되면 버퍼에 자료를 수신중임을 나타낸다.
읽어 드린 변수가 STX으로 인지되면 버퍼 변수를 초기화하고 컴포트 상태 판별자를
수신가능 상태로 설정한다.
읽어드린 변수 값에서 ETX가 판별되면 수신 데이타를 모니터 콘트롤에 표시하고
버퍼 변수는 초기화 시킨다.
///////
윈도우에서 클라이언트 프로그램을 설치하다 보면 설치 관리자 프로그램의 사소한
실수로 예론, path 설정 부분에 특수 제어문자 혼입으로, 환경 변수의 path가
먹혀들지 않아 곤란을 겪는 경우가 종종 있습니다.
window 95/98에서 autoexec.bat의 내용중에 path을 설정하는 방법입니다.
형식은 set path="절대경로"
다음줄에 set path="절대경로";"%path%";
형식은 set classpath="절대경로"
다음줄에 set classpath="절대경로";"%classpath%";
보통 autoexec.bat 파일을 편집기로 열어서 한줄에 이어서 적어주어야 하는 데
만약, 한 라인이 길경우에나 제어문자가 혼입되는 경우에 라인이 분리되어
path 설정이 안되는 경우가 많습니다.
이런 경우에는 한줄에 다 기록하지 말고 다음 라인에 기록을 해야합니다.
즉, 이미 설정된 환경변수 %path%를 이용하게 됩니다. 만약 편집이 잘 못되어
2라인으로 인식되면 환경변수를 저장할 공간이 부족합니다 라는 에러 메시지를
냅니다. 그래서 다음 보기와 같이 작성해야 합니다.
보기를 들면,
set path="c:\informix\bin"
set path="c:\other application\bin\;"%path%";
다음 보기를 들면
set path="c:\;c:\windows;c:\windows\command;";
set path="c:\first appl";"%path%";
set path="c:\second appl";"%path%";
위에서 보면 중요도가 높은 프로그램이 설정 부분의 제일 앞에 오도록합니다.
이방법 말고 레지스터리를 이용하면 더 손쉽게 경로 설정을 할 수 있습니다.
CPU가 특정 실행 프로그램을 찾으려 할 때 레지스터리를 이용하여 CPU에 알려주면
그만이다.
위와 같이 하더라도 " 환경변수 저장 공간이 부족합니다." 또는 "too many parameter"
메시지가 나오면 다음과 같이 처리하면 된다.
한글 MS- DOS 창을 연다.
최상단의 타이틀의 왼쪽의 DOS 아이콘에 마우스를 대고 오른 쪽 버튼을 누르게 되면
나오는 메뉴 중에서 등록 정보를 선택한다.
그 다음에 메모리 탭을 선택하면 상단의 기본 메모리에서 초기환경 부분을 자동에서
2816 바이트를 선택한다음 적용을 누르고 시스템을 재 시작하면 된다.
위의 경우엔 자동 실행 파일인 경우이고 만약, 현재 파일은 *.bat의 내용중에
환경 설정하는 부분이 있으면 환경변수가 부족하다는 에러 메시지를 만나게 된다.
이럴 경우에는 *.bat에 대한 *.pif 파일을 만들어 등록 정보에서 초기 메모리를
2816으로 잡아준다. 부연하면 *.bat의 등록 정보를 콘트롤 하면 자동적으로
*.pif가 생성된다.
환경 변수 설정의 확인은 MS-DOS 창에서
c:\echo %path%
로 확인한다.
리눅스에서는
# echo $path 으로 확인한다.
'WORK > Sotfware' 카테고리의 다른 글
입력된 2진수를 10진수로 계산하여 출력 (0) | 2008.06.08 |
---|---|
#pragma comment ..........? (0) | 2008.06.08 |
클래스/Class (0) | 2008.06.03 |
다중 쓰레드와 C++ (0) | 2008.06.02 |
Serial Port - RS232C (0) | 2008.06.02 |
댓글