| |||||||||||||||||
| |||||||||||||||||
| texto: | ||
Implementação de comunicação serial em Delphi Com o desenvolvimento da moderna tecnologia da informação e o uso generalizado de redes de computadores, a tecnologia de comunicação por computador tornou-se cada vez mais madura. No entanto, a comunicação serial, como método de comunicação flexível, conveniente e confiável, ainda é um método de comunicação eficaz e é amplamente utilizado na indústria. controlar. Na prática de produção industrial, o uso de um PC para monitorar projetos em tempo real geralmente requer que o PC tenha funções como coleta de dados, processamento de dados e controle de geração e transmissão de sinais na interface do usuário. Neste ambiente específico, se o PC for conectado com sinais de controle de processo em tempo real, é necessário operar diretamente a porta serial do PC. Delphi lançada pela Borland é uma poderosa linguagem de programação de alto nível com recursos visuais orientados a objetos e é particularmente adequada para a preparação de interfaces gráficas e programas de usuário no ambiente Windows. Mecanismo de comunicação serial baseado em WIN95/NT O mecanismo do sistema operacional Windows proíbe os aplicativos de acessar diretamente o hardware do computador, mas fornece aos programadores uma série de funções API padrão, tornando a preparação do aplicativo mais conveniente e eliminando o problema de depuração de hardware relacionado. No Windows 95/NT, a mensagem WM_COMMNOTIFY original do Windows 3. Basta operar no buffer de leitura/gravação. Várias funções de operação de comunicação serial comumente usadas no WIN95/NT são as seguintes: CreatFile abre porta serial CloseHandle fecha a porta serial SetupComm define o tamanho do buffer de comunicação ReadFile lê a operação da porta serial WriteFile grava operação de porta serial SetCommState define parâmetros de comunicação GetCommState obtém parâmetros de comunicação padrão ClearCommError limpa o erro da porta serial e obtém o status atual Além das funções acima, um importante registro DCB (Device Control Block) é frequentemente usado. Existem parâmetros de porta serial definíveis registrados no DCB. Ao definir os parâmetros da porta serial, você deve primeiro usar a função GetCommState para preencher os valores padrão do sistema no bloco de controle DCB e, em seguida, definir os valores personalizados que o usuário. quer mudar. Para realizar a comunicação serial no WIN95/NT, além de compreender as funções básicas de operação da comunicação, você também deve dominar a programação multithread. Um thread é o caminho de execução dentro de um processo e é a entidade básica usada pelo sistema operacional para alocar tempo de CPU. Cada processo começa com um único thread para completar a execução do aplicativo. A comunicação serial precisa ser implementada usando tecnologia multithread. Sua lógica de processamento principal pode ser expressa da seguinte forma: no início do processo, o thread principal realiza algum trabalho de inicialização necessário e, em seguida, o thread principal estabelece um thread de monitoramento de comunicação para monitorar. a porta de comunicação no momento apropriado, conforme necessário. Quando o evento de porta serial especificado ocorre, uma mensagem WM_COMMNOTIFY é enviada para o thread principal (já que o WIN95 cancela a mensagem WM_COMMNOTIFY, você mesmo deve criá-la) e o thread principal a processa. Se a mensagem WM_COMMNOTIFY não for necessária, o thread principal encerra o thread de monitoramento de comunicação. A execução simultânea de vários threads causará conflitos em recursos compartilhados. Para evitar conflitos, é necessário utilizar multi-threads sincronizados para acessar recursos compartilhados. WIN95 fornece muitos métodos para manter a sincronização de threads. O autor usa a criação de objetos de evento para manter a sincronização de threads. Crie um objeto de evento por meio de CraeteEvent() e defina o objeto de evento para sinalizar a sincronização usando a função etEvent() ou PulseEvent(). No aplicativo, use a função WaitSingleObject() para aguardar o gatilho de sincronização e aguarde até que o evento especificado seja definido para receber um sinal de outros threads antes de continuar a executar o programa. Método de implementação específico em Delphi As funções poderosas do Delphi e a tecnologia de programação orientada a objetos que suporta multithreading tornam a comunicação serial muito simples e conveniente. Ele é implementado chamando funções API externas. As etapas principais são as seguintes: Primeiro, use a função CreateFile para abrir a porta serial para determinar a propriedade da porta serial por este aplicativo e, em segundo lugar, impedir que outros aplicativos operem a porta serial; , preencha o bloco de controle do dispositivo DCB por meio da função GetCommState e, em seguida, configure a taxa de transmissão, bits de dados, bits de paridade e bits de parada da porta serial chamando a função SetCommState. Em seguida, crie um thread de monitoramento de porta serial para monitorar eventos de porta serial. Com base nisso, você pode operar a transmissão de dados na porta serial correspondente; finalmente, usar a função CloseHandle para fechar a porta serial; O programa específico é o seguinte. Este programa foi compilado com Delphi3.0 e depurado no ambiente Win95. Ele foi colocado em aplicação prática para referência dos leitores. programa: unidade comdemou; interface usa Windows, Mensagens, SysUtils, Classes, Gráficos, Controles, Formulários, Diálogos; const Wm_commNotify=Wm_User+12; tipo TForm1 = classe(TForm) PRocedure FormCreate(Remetente: TObject); privado Procedimento comminicializar; Procedimento MsgcommProcess(Var Mensagem:Tmessage); {Declarações privadas} público {Declarações públicas} fim; //Declaração de thread TComm=Classe(TThread) protegido procedimento Executar; substituir; fim; var Formulário1: TForm1; hcom,Post_Event:Thandle; lpol:Pobreposto; implementação {$R *.DFM} Procedimento TComm.Execute; //Processo de execução do thread var dwEvtMask:DWord; Espere:Booleano; Começar fillchar(lpol,sizeof(toverlapped),0); Enquanto True começa dwEvtMask:=0; Wait:=WaitCommEvent(hcom,dwevtmask,lpol); //Aguarda eventos da porta serial; se esperar, então comece waitforsingleobject(post_event,infinite); //Aguarda a configuração do evento de sincronização; resetevent(post_event); //Reinicialização do evento de sincronização; PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);//Enviar mensagem; fim; fim; fim; procedimento Tform1.comminitialize; //Inicialização da porta serial var lpdcb:Tdcb; Começar hcom:=createfile('com2',generic_read ou generic_write,0,nil,open_existente, file_attribute_normal ou file_flag_overlapped,0);//Abre a porta serial se hcom=invalid_handle_value então outro setupcomm(hcom,4096,4096); //Define os buffers de entrada e saída para 4096 bytes getcommstate(hcom,lpdcb); //Obtém as configurações padrão atuais da porta serial taxa de transmissão:=2400; lpdcb.StopBits:=1; lpdcb.ByteSize:=8; lpdcb.Parity:=EvenParity; //Paridade par Setcommstate(hcom,lpdcb); setcommMask(hcom,ev_rxchar); //Especifica o evento da porta serial como caracteres recebidos; fim; Procedimento TForm1.MsgcommProcess(Var Mensagem:Tmessage); var Claro:Booleano; Coms:Tcomstat; cbNum,ReadNumber,lpErrors:Integer; Read_Buffer:array[1..100]de char; Começar Clear:=Clearcommerror(hcom,lpErrors,@Coms); se estiver claro, então comece cbNum:=Coms.cbInQue; ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol); //Processa os dados recebidos SetEvent(Post_Event); //Configuração do evento de sincronização fim; fim; procedimento TForm1.FormCreate(Remetente: TObject); começar cominicializar; post_event:=CreateEvent(nil,true,true,nil); //Cria um evento de sincronização; Tcomm.Create(False); //Cria um thread de monitoramento de porta serial; fim; fim. Nome do membro autor: ruan_bangqiu | ||