Delphi는 강력한 기능, 사용 용이성 및 빠른 코드 실행이라는 장점을 갖춘 시각적으로 빠른 애플리케이션 개발 도구입니다. 많은 프로그래머가 다양한 애플리케이션을 프로그래밍하는 데 있어 점점 더 중요한 역할을 하고 있습니다. . 하지만 아쉬운 점은 델파이에는 자체 직렬 통신 제어 기능이 없고, 도움말 문서에도 직렬 통신에 대한 언급이 없어 통신 프로그램을 컴파일하는 개발자에게 많은 불편을 안겨준다는 점이다.
현재 Delphi를 사용하여 직렬 통신을 구현하는 데 일반적으로 사용되는 세 가지 방법이 있습니다. 하나는 MSCOMM 제어 및 SPCOMM 제어와 같은 컨트롤을 사용하는 것이고, 다른 하나는 API 기능을 사용하는 것입니다. 그 중에서도 API를 사용하여 직렬 통신 프로그램을 작성하는 것은 더 복잡하고 많은 통신 지식이 필요합니다. 이에 비해 SPCOMM 컨트롤은 비교적 사용이 간편하고, 시리얼 포트 통신과 밀접하게 관련된 풍부한 속성과 이벤트를 갖고 있으며, 시리얼 포트에 대한 다양한 동작을 제공하고, 멀티스레딩도 지원한다. 다음 문서에서는 예제와 함께 SPCOMM 컨트롤의 사용을 자세히 소개합니다.
SPCOMM 설치
1. 드롭다운 메뉴 Component에서 Install Component 옵션을 선택하고, Unit 파일명에 SPCOMM 컨트롤이 있는 경로를 입력하고, 다른 항목은 기본값을 사용할 수 있도록 한 후 OK 버튼을 클릭합니다.
2. 설치 후 시스템 제어판에 빨간색 제어 COM이 나타납니다. 이제 Delphi의 자체 컨트롤처럼 COM 컨트롤을 사용할 수 있습니다.
SPCOMM 속성, 메서드 및 이벤트
1.속성
●CommName: COM1, COM2 등 직렬 포트의 이름을 나타냅니다.
●BaudRate: 실제 필요에 따라 설정된 전송 속도입니다. 이 값은 직렬 포트가 열린 후에도 변경될 수 있으며 실제 전송 속도는 이에 따라 변경됩니다.
●ParityCheck: 패리티 검사가 필요한지 여부를 나타냅니다.
●ByteSize: 실제 상황에 따라 설정된 바이트 길이입니다.
● 패리티: 패리티 비트;
●StopBits: 정지 비트;
●SendDataEmpty: 부울 속성으로, true인 경우 송신 버퍼가 비어 있거나, false인 경우 송신 버퍼가 비어 있지 않음을 의미합니다. 전송 대기열의 정보입니다.
2. 방법
●Startcomm 방법을 사용하여 직렬 포트를 열 수 없으면 일반적으로 오류가 보고됩니다. 7가지 주요 오류 유형이 있습니다. ⑵ 직렬 포트를 여는 중 오류가 발생했습니다. ⑶ 통신 핸들이 아닙니다. ⑸ 이벤트를 생성할 수 없습니다. 읽기 프로세스를 생성할 수 없습니다. ⑺ 쓰기 프로세스를 생성할 수 없습니다.
●StopComm 메소드는 직렬 포트를 닫는 데 사용되며 반환 값이 없습니다.
●WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word) 메서드는 Boolean 반환 값을 갖는 함수로 쓰기 프로세스에 문자열을 보내는 데 사용됩니다. 전송에 성공하면 true를 반환하고 실패하면 false를 반환합니다. 이 함수를 실행하면 즉시 반환 값을 얻고 전송 작업은 이후에 실행됩니다. 이 함수에는 두 개의 매개변수가 있습니다. 여기서 pDataToWrite는 전송할 문자열이고 dwSizeofDataToWrite는 전송할 문자열의 길이입니다.
3. 이벤트
●객체의 OnReceiveData :PROcedure(Sender: TObject;Buffer: Pointer;BufferLength: Word)
이 이벤트는 직렬 포트에서 수신된 데이터가 처리될 수 있는 버퍼에 데이터가 입력될 때 트리거됩니다. Buffer에는 수신된 데이터가 포함되며 BufferLength는 수신된 데이터의 길이입니다.
●OnReceiveError: 프로시저(발신자: TObject; EventMask: DWORD)
데이터 수신에 오류가 있을 때 발생하는 이벤트입니다.
SPCOMM 사용
다음은 SPCOMM 제어를 이용한 시리얼 통신의 예입니다.
PC와 마이크로컨트롤러 8051 사이의 통신을 예로 들면, 먼저 둘 사이의 핸드셰이크 신호를 조정해야 합니다. 이들 사이의 통신 프로토콜은 다음과 같다고 가정합니다. PC에서 8051로의 데이터 한 프레임은 6바이트이고, 8051에서 PC로의 데이터 한 프레임도 6바이트입니다. PC가 (F0,01,FF,FF,01,F0)을 보내면 8051은 데이터 통신 핸드셰이크가 성공했음을 나타내는 프레임(F0,01,FF,FF,01,F0)을 수신할 수 있으며 두 사람은 이를 따를 수 있습니다. 프로토콜은 서로 데이터를 전송합니다.
새 프로젝트 COMM.DPR을 만들고, 양식의 NAME 속성을 FCOMM으로 설정하고, 양식 제목을 테스트 통신으로 정의하고, 해당 컨트롤을 추가합니다.
1. COMM1 속성을 설정합니다.
● 전송 속도: 4800;
● 패리티 비트: 없음;
●바이트 길이: 8;
●정지 비트: 1;
●직렬 포트: COM1.
보내고 받은 데이터는 메모1에 표시됩니다. 새 양식을 Comm.pas로 저장합니다.
2.소스코드 작성
//변수 설명
var
fcomm:TFCOMM;
뷰스트링:문자열;
i:정수;
rbuf,sbuf:바이트 배열[16];
//직렬 포트 열기
절차 TFCOMM.FormShow(발신자: TObject);
시작하다
comm1.StartComm;
끝;
//직렬 포트를 닫습니다.
절차 TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);
시작하다
comm1.StopComm;
끝;
//데이터 전송 프로세스를 사용자 정의합니다.
절차 senddata;
var
i:정수;
commflg:부울;
시작하다
뷰스트링:='';
commflg:=true;
for i:=1 ~ 6 do
시작하다
fcomm.comm1.writecommdata(@sbuf[i],1)가 아니면
시작하다
commflg:=false;
부서지다;
끝;
//전송 시 바이트 간 지연
수면(2);
viewstring:=viewstring+intttohex(sbuf[i],2)+'' end;
viewstring:='보내기'+viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add('' );
commflg가 아닌 경우 messagedlg('전송 실패!',mterror,[mbyes],0);
끝;
//버튼 클릭 이벤트 보내기
프로시저 TFCOMM.Btn_sendClick(Sender: TObject);
시작하다
sbuf[1]:=byte($ f0); //프레임 헤더
sbuf[2]:=byte($ 01); //명령번호
sbuf[3]:=byte($ ff);
sbuf[4]:=byte($ ff);
sbuf[5]:=byte($ 01);
sbuf[6]:=byte($ f0); //프레임 끝
senddata;//전송 함수 호출
끝;
//수신과정
절차 TFCOMM.Comm1ReceiveData(송신자: TObject; 버퍼: 포인터; BufferLength: Word);
var
i:정수;
시작하다
뷰스트링:='';
move(buffer^,pchar(@rbuf^),bufferlength);
i:=1 ~ 버퍼 길이 do
viewstring:=viewstring+intttohex(rbuf[i],2)+'';
viewstring:='수신'+viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('' );
끝;
memo1에 F0 01 FF FF 01 F0 전송 및 F0 01 FF FF 01 F0 수신이 표시되면 직렬 포트가 데이터를 올바르게 보내고 데이터를 올바르게 수신했으며 직렬 통신이 성공했음을 의미합니다.