Delphi é uma ferramenta visual de desenvolvimento rápido de aplicativos com as vantagens de funções poderosas, facilidade de uso e execução rápida de código. Ela desempenha um papel cada vez mais importante na construção de sistemas de informação corporativos. Muitos programadores estão dispostos a escolher o Delphi como uma ferramenta de desenvolvimento de vários aplicativos. . Porém, o problema é que o Delphi não possui seu próprio controle de comunicação serial, e não há menção à comunicação serial em sua documentação de ajuda, o que traz muitos transtornos aos desenvolvedores que compilam programas de comunicação.
Atualmente, existem três métodos comumente usados para implementar a comunicação serial usando Delphi: um é usar controles, como controle MSCOMM e controle SPCOMM, o outro é usar funções API; Entre eles, usar API para escrever programas de comunicação serial é mais complicado e requer muito conhecimento de comunicação. Em comparação, é relativamente simples usar o controle SPCOMM, e o controle possui propriedades e eventos ricos intimamente relacionados à comunicação da porta serial, fornece várias operações na porta serial e também oferece suporte a multithreading. O artigo a seguir apresenta detalhadamente o uso do controle SPCOMM com exemplos.
Instalação SPCOMM
1. Selecione a opção Instalar Componente no menu suspenso Componente, preencha o caminho onde o controle SPCOMM está localizado no nome do arquivo da Unidade, valores padrão podem ser usados para outros itens e clique no botão OK.
2. Após a instalação, um COM de controle vermelho aparecerá no painel de controle do sistema. Agora você pode usar controles COM exatamente como os controles do Delphi.
Propriedades, métodos e eventos SPCOMM
1. Atributos
●CommName: Indica os nomes das portas seriais como COM1 e COM2;
●BaudRate: A taxa de transmissão definida de acordo com as necessidades reais. Este valor também pode ser alterado após a porta serial ser aberta e a taxa de transmissão real será alterada de acordo;
●ParityCheck: Indica se a verificação de paridade é necessária;
●ByteSize: O comprimento em bytes definido de acordo com a situação real;
●Paridade: bit de paridade;
●StopBits: bits de parada;
●SendDataEmpty: Este é um atributo booleano. Quando for verdadeiro, significa que o buffer de envio está vazio ou não há informações na fila de envio; quando for falso, significa que o buffer de envio não está vazio; são informações na fila de envio.
2. método
●O método Startcomm é usado para abrir a porta serial. Quando a abertura falha, geralmente é relatado um erro. Existem sete tipos principais de erros: ⑴ A porta serial foi aberta; ⑵ Erro ao abrir a porta serial; ⑶ O identificador do arquivo não é um identificador de comunicação; O processo de leitura não pode ser gerado; ⑺ O processo de escrita não pode ser gerado;
●O método StopComm é usado para fechar a porta serial e não tem valor de retorno;
●O método WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word) é uma função com valor de retorno booleano. Ele é usado para enviar uma string para o processo de escrita. Ele retorna verdadeiro se o envio for bem-sucedido e falso se o envio falhar. A execução desta função obterá o valor de retorno imediatamente e a operação de envio será executada posteriormente. Esta função possui dois parâmetros, onde pDataToWrite é a string a ser enviada e dwSizeofDataToWrite é o comprimento da string a ser enviada.
3. evento
●OnReceiveData :PRocedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) do objeto
Este evento será acionado quando os dados forem inseridos no buffer, onde os dados recebidos da porta serial podem ser processados. Buffer contém os dados recebidos e BufferLength é o comprimento dos dados recebidos.
●OnReceiveError: procedimento(Remetente: TObject; EventMask: DWORD)
Este evento é acionado quando há um erro no recebimento de dados.
Uso do SPCOMM
A seguir está um exemplo de comunicação serial usando controle SPCOMM.
Tomando como exemplo a comunicação entre o PC e o microcontrolador 8051, devemos primeiro ajustar o sinal de handshake entre eles. Suponha que o protocolo de comunicação entre eles seja: Um quadro de dados do PC para o 8051 tem 6 bytes, e um quadro de dados do 8051 para o PC também tem 6 bytes. Quando o PC envia (F0,01,FF,FF,01,F0), 8051 pode receber um quadro (F0,01,FF,FF,01,F0), indicando que o handshake de comunicação de dados foi bem-sucedido e os dois podem seguir os protocolos transferem dados entre si.
Crie um novo projeto COMM.DPR, defina a propriedade NAME do formulário como FCOMM, defina o título do formulário como Test Communication e adicione os controles correspondentes.
1. Defina atributos COMM1:
●Taxa de transmissão: 4800;
●Bit de paridade: Nenhum;
●Comprimento em bytes: 8;
●Bit de parada: 1;
●Porta serial: COM1.
Os dados enviados e recebidos serão exibidos no Memo1. Armazene o novo formulário como Comm.pas.
2.Escreva o código-fonte
//Descrição da variável
var
fcomm:TFCOMM;
string de visualização:string;
eu: inteiro;
rbuf,sbuf:array[16] de bytes;
//Abre porta serial
procedimento TFCOMM.FormShow(Remetente: TObject);
começar
comm1.StartComm;
fim;
//Fecha a porta serial
procedimento TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);
começar
comm1.StopComm;
fim;
//Personalizar o processo de envio de dados
procedimento enviar dados;
var
eu: inteiro;
commflg:booleano;
começar
cadeia de visualização:='';
commflg:=verdadeiro;
para i:=1 a 6 faça
começar
se não fcomm.comm1.writecommdata(@sbuf[i],1) então
começar
commflg:=falso;
quebrar;
fim;
//Atraso entre bytes ao enviar
dormir(2);
viewstring:=viewstring+intttohex(sbuf[i],2)+'';
viewstring:='Enviar'+viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add('' );
se não for commflg então messagedlg('Falha no envio!',mterror,[mbyes],0);
fim;
//Envia evento de clique no botão
procedimento TFCOMM.Btn_sendClick(Remetente: TObject);
começar
sbuf[1]:=byte($ f0); //Cabeçalho do quadro
sbuf[2]:=byte($ 01); //Número do comando
sbuf[3]:=byte($ff);
sbuf[4]:=byte($ff);
sbuf[5]:=byte($ 01);
sbuf[6]:=byte($ f0); //Fim do quadro
senddata; //Chama a função de envio
fim;
//processo de recebimento
procedimento TFCOMM.Comm1ReceiveData(Remetente: TObject; Buffer: Ponteiro;BufferLength: Word);
var
eu: inteiro;
começar
cadeia de visualização:='';
move(buffer^,pchar(@rbuf^),bufferlength);
para i:=1 para bufferlength faça
viewstring:=viewstring+intttohex(rbuf[i],2)+'';
viewstring:='receber'+viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('');
fim;
Se memo1 exibir enviando F0 01 FF FF 01 F0 e recebendo F0 01 FF FF 01 F0, isso significa que a porta serial enviou e recebeu dados corretamente e que a comunicação serial foi bem-sucedida.