| |||||||||||||||||
| |||||||||||||||||
| 텍스트: | ||
델파이에서 직렬 통신 구현 현대 정보기술의 발전과 컴퓨터 네트워크의 보급으로 인해 컴퓨터 통신 기술은 점점 성숙해졌지만, 유연하고 편리하며 안정적인 통신 방식인 직렬 통신은 여전히 효과적인 통신 방식으로 산업 현장에서 널리 사용되고 있습니다. 제어. 산업 생산 현장에서 PC를 사용하여 실시간으로 프로젝트를 모니터링하려면 일반적으로 PC에 사용자 인터페이스에서 데이터 수집, 데이터 처리, 제어 신호 생성 및 전송과 같은 기능이 있어야 합니다. 이러한 특정 환경에서 PC를 공정 제어의 실시간 신호와 연결하려면 PC의 직렬 포트를 직접 작동해야 합니다. 볼랜드가 출시한 델파이는 시각적 개체 지향 기능을 갖춘 강력한 고급 프로그래밍 언어로, 특히 Windows 환경에서 그래픽 인터페이스와 사용자 프로그램을 준비하는 데 적합합니다. WIN95/NT 기반 직렬 통신 메커니즘 Windows 운영 체제의 메커니즘은 응용 프로그램이 컴퓨터 하드웨어에 직접 액세스하는 것을 금지하지만 프로그래머에게 일련의 표준 API 기능을 제공하여 응용 프로그램 준비를 더욱 편리하게 만들고 관련 하드웨어 디버깅 문제를 제거합니다. Windows 95/NT에서는 Windows 3의 원래 WM_COMMNOTIFY 메시지입니다. 읽기/쓰기 버퍼에서만 작동합니다. WIN95/NT에서 일반적으로 사용되는 몇 가지 직렬 통신 작동 기능은 다음과 같습니다. CreatFile이 직렬 포트를 엽니다. CloseHandle은 직렬 포트를 닫습니다. SetupComm은 통신 버퍼의 크기를 설정합니다. ReadFile은 직렬 포트 작업을 읽습니다. WriteFile은 직렬 포트 작업을 씁니다. SetCommState는 통신 매개변수를 설정합니다. GetCommState는 기본 통신 매개변수를 가져옵니다. ClearCommError는 직렬 포트 오류를 지우고 현재 상태를 가져옵니다. 위의 기능 외에도 중요한 기록인 DCB(Device Control Block)가 자주 사용됩니다. DCB에는 정의 가능한 직렬 포트 매개 변수가 기록되어 있습니다. 직렬 포트 매개 변수를 설정할 때 먼저 GetCommState 함수를 사용하여 DCB 제어 블록에 시스템 기본값을 입력한 다음 사용자가 사용자 정의 값을 설정해야 합니다. 변화하고 싶어합니다. WIN95/NT에서 직렬 통신을 수행하려면 기본 통신 작동 기능을 이해하는 것 외에도 멀티 스레드 프로그래밍도 마스터해야 합니다. 스레드는 프로세스 내에서 실행되는 경로이며 운영 체제에서 CPU 시간을 할당하는 데 사용되는 기본 엔터티입니다. 각 프로세스는 단일 스레드로 시작하여 애플리케이션 실행을 완료합니다. 직렬 통신은 다중 스레드 기술을 사용하여 구현되어야 합니다. 주요 처리 논리는 다음과 같이 표현될 수 있습니다. 프로세스 시작 시 메인 스레드는 필요한 초기화 작업을 수행한 다음 메인 스레드는 모니터링할 통신 모니터링 스레드를 설정합니다. 필요에 따라 적절한 시간에 통신 포트를 지정합니다. 지정된 직렬 포트 이벤트가 발생하면 WM_COMMNOTIFY 메시지가 메인 스레드로 전송되고(WIN95에서는 WM_COMMNOTIFY 메시지를 취소하므로 직접 생성해야 함) 메인 스레드가 이를 처리합니다. WM_COMMNOTIFY 메시지가 필요하지 않으면 기본 스레드는 통신 모니터링 스레드를 종료합니다. 여러 스레드를 동시에 실행하면 공유 리소스에 충돌이 발생합니다. 충돌을 피하려면 동기화된 다중 스레드를 사용하여 공유 리소스에 액세스해야 합니다. WIN95는 스레드 동기화를 유지하기 위한 다양한 방법을 제공합니다. 작성자는 스레드 동기화를 유지하기 위해 이벤트 개체 생성을 사용합니다. CraeteEvent()를 통해 이벤트 객체를 생성하고, etEvent() 또는 PulseEvent() 함수를 사용하여 신호 동기화를 위한 이벤트 객체를 설정합니다. 응용 프로그램에서는 WaitSingleObject() 함수를 사용하여 동기화 트리거를 기다리고 프로그램 실행을 계속하기 전에 지정된 이벤트가 다른 스레드에 의해 신호를 받도록 설정될 때까지 기다립니다. Delphi에서의 구체적인 구현 방법 델파이의 강력한 기능과 멀티스레딩을 지원하는 객체지향 프로그래밍 기술은 시리얼 통신을 매우 간단하고 편리하게 만들어줍니다. 외부 API 함수를 호출하여 구현됩니다. 주요 단계는 다음과 같습니다. 먼저 CreateFile 함수를 사용하여 직렬 포트를 열어 이 응용 프로그램의 직렬 포트 소유권을 확인하고 두 번째로 다른 응용 프로그램이 직렬 포트를 작동하지 못하도록 차단합니다. , GetCommState 함수를 통해 장치 제어 블록 DCB를 채운 다음 SetCommState 함수를 호출하여 직렬 포트의 전송 속도, 데이터 비트, 패리티 비트 및 정지 비트를 구성합니다. 그런 다음 직렬 포트 모니터링 스레드를 생성하여 직렬 포트 이벤트를 모니터링합니다. 이를 바탕으로 해당 직렬 포트에서 데이터 전송을 수행할 수 있으며 마지막으로 CloseHandle 함수를 사용하여 직렬 포트를 닫습니다. 구체적인 프로그램은 다음과 같습니다. 본 프로그램은 Delphi3.0으로 컴파일되었으며, 독자들의 참고를 위해 Win95 환경에서 디버깅되었습니다. 프로그램: 단위 comdeou; 인터페이스 용도 Windows, 메시지, SysUtils, 클래스, 그래픽, 컨트롤, 양식, 대화 상자; const Wm_commNotify=Wm_User+12; 유형 TForm1 = 클래스(TForm) PROcedure FormCreate(Sender: TObject); 사적인 절차를 상업화하다; 절차 MsgcommProcess(Var 메시지:Tmessage) 메시지 Wm_commnotify; {비공개 선언} 공공의 {공개 선언} 끝; //스레드 선언 TComm=클래스(TThread) 보호됨 프로시저 실행;재정의; 끝; var Form1: TForm1; hcom,Post_Event:Handle; lpol:겹쳐짐; 구현 {$R *.DFM} Procedure TComm.Execute; //스레드 실행 프로세스; var dwEvtMask:DWord; 잠깐: 부울; 시작하다 fillchar(lpol,sizeof(toverlapped),0); True일 때 시작하세요 dwEvtMask:=0; Wait:=WaitCommEvent(hcom,dwevtmask,lpol); //직렬 포트 이벤트를 기다립니다. 기다렸다가 시작하면 waitforsingleobject(post_event,infinite); //동기화 이벤트가 설정될 때까지 기다립니다. Resetevent(post_event); //동기화 이벤트 재설정; PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);//메시지 보내기; 끝; 끝; 끝; 절차 Tform1.comminitialize //직렬 포트 초기화; var lpdcb:Tdcb; 시작하다 hcom:=createfile('com2',generic_read 또는 generic_write,0,nil,open_existing, file_attribute_normal 또는 file_flag_overlapped,0);//직렬 포트를 엽니다. hcom=invalid_handle_value인 경우 또 다른 setupcomm(hcom,4096,4096); //입력 및 출력 버퍼를 4096바이트로 설정합니다. getcommstate(hcom,lpdcb); //직렬 포트의 현재 기본 설정을 가져옵니다. lpdcb.baudrate:=2400; lpdcb.StopBits:=1; lpdcb.ByteSize:=8; lpdcb.Parity:=EvenParity; //짝수 패리티 Setcommstate(hcom,lpdcb); setcommMask(hcom,ev_rxchar); //직렬 포트 이벤트를 수신된 문자로 지정합니다. 끝; 프로시저 TForm1.MsgcommProcess(Var 메시지:Tmessage); var 지우기: 부울; 컴스:Tcomstat; cbNum,ReadNumber,lpErrors:Integer; Read_Buffer:문자 배열[1..100]; 시작하다 Clear:=Clearcommerror(hcom,lpErrors,@Coms); 지우고 시작하면 cbNum:=Coms.cbInQue; ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol); //수신된 데이터 처리 SetEvent(Post_Event); //동기화 이벤트 설정 끝; 끝; 절차 TForm1.FormCreate(Sender: TObject); 시작하다 상업화하다; post_event:=CreateEvent(nil,true,true,nil); //동기화 이벤트 생성; Tcomm.Create(False); //직렬 포트 모니터링 스레드를 생성합니다. 끝; 끝. 작성자 회원명 : ruan_bangqiu | ||