Delphi — это визуальный инструмент быстрой разработки приложений, обладающий преимуществами мощных функций, простоты использования и быстрого выполнения кода. Он играет все более важную роль в создании корпоративных информационных систем. Многие программисты готовы выбирать Delphi в качестве инструмента разработки различных приложений. . Однако ложкой дегтя является то, что Delphi не имеет собственного средства управления последовательной связью, а в ее справочной документации о последовательной связи нет упоминания, что доставляет массу неудобств разработчикам, компилирующим программы связи.
В настоящее время существует три широко используемых метода реализации последовательной связи с использованием Delphi: один — использование элементов управления, таких как управление MSCOMM и управление SPCOMM; другой — использование функций API; третий — вызов других программ последовательной связи; Среди них использование API для написания программ последовательной связи более сложно и требует больших знаний в области связи. Для сравнения, использовать элемент управления SPCOMM относительно просто, и этот элемент управления имеет богатые свойства и события, тесно связанные со связью через последовательный порт, обеспечивает различные операции с последовательным портом, а также поддерживает многопоточность. В следующей статье подробно описывается использование элемента управления SPCOMM с примерами.
Установка СПКОММ
1. В раскрывающемся меню «Компонент» выберите опцию «Установить компонент», в имени файла модуля укажите путь, где находится элемент управления SPCOMM, для других элементов можно использовать значения по умолчанию, и нажмите кнопку «ОК».
2. После установки на панели управления системой появится красный управляющий COM. Теперь вы можете использовать элементы управления COM так же, как собственные элементы управления Delphi.
Свойства, методы и события SPCOMM
1.Атрибуты
●CommName: указывает имена последовательных портов, например COM1 и COM2;
●BaudRate: скорость передачи данных, установленная в соответствии с фактическими потребностями. Это значение также можно изменить после открытия последовательного порта, и фактическая скорость передачи данных изменится соответствующим образом.
●ParityCheck: указывает, требуется ли проверка четности;
●ByteSize: длина в байтах, устанавливаемая в соответствии с реальной ситуацией;
●Четность: бит четности;
●StopBits: стоповые биты;
●SendDataEmpty: это логический атрибут. Когда он имеет значение true, это означает, что буфер отправки пуст или в очереди отправки нет информации. Если он имеет значение false, это означает, что буфер отправки не пуст или существует; — это информация в очереди отправки.
2. метод
●Метод Startcomm используется для открытия последовательного порта. При неудачном открытии обычно сообщается об ошибке. Существует семь основных типов ошибок: ⑴ Последовательный порт открыт; ⑵ Ошибка открытия последовательного порта; ⑶ Дескриптор файла не является дескриптором связи; ⑸ Невозможно создать событие; Невозможно сгенерировать процесс чтения. ⑺ Невозможно сгенерировать процесс записи;
●Метод StopComm используется для закрытия последовательного порта и не имеет возвращаемого значения;
●WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word) — это функция с логическим возвращаемым значением. Он используется для отправки строки в процесс записи. Он возвращает true, если отправка успешна, и false, если отправка не удалась. При выполнении этой функции возвращаемое значение будет получено немедленно, а операция отправки будет выполнена впоследствии. Эта функция имеет два параметра: pDataToWrite — это отправляемая строка, а dwSizeofDataToWrite — длина отправляемой строки.
3. событие
●OnReceiveData: PROcedure (Отправитель: TObject; Буфер: Указатель; BufferLength: Word) объекта.
Это событие будет вызвано при вводе данных в буфер, где могут быть обработаны данные, полученные от последовательного порта. Buffer содержит полученные данные, а BufferLength — это длина полученных данных.
●OnReceiveError: процедура (Отправитель: TObject; EventMask: DWORD)
Это событие срабатывает, когда возникает ошибка при получении данных.
Использование СПКОММ
Ниже приведен пример последовательной связи с использованием управления SPCOMM.
Взяв в качестве примера связь между ПК и микроконтроллером 8051, мы должны сначала настроить сигнал установления связи между ними. Предположим, что протокол связи между ними следующий: Один кадр данных от ПК к 8051 составляет 6 байт, и один кадр данных от 8051 к ПК также составляет 6 байт. Когда ПК отправляет (F0,01,FF,FF,01,F0), 8051 может получить кадр (F0,01,FF,FF,01,F0), указывающий, что рукопожатие передачи данных прошло успешно, и они могут следовать за ним. Протоколы передают данные друг другу.
Создайте новый проект COMM.DPR, задайте для свойства NAME формы значение FCOMM, определите заголовок формы как Test Communication и добавьте соответствующие элементы управления.
1. Установите атрибуты COMM1:
● Скорость передачи данных: 4800;
● Бит четности: нет;
● Длина байта: 8;
●Стоповый бит: 1;
●Последовательный порт: COM1.
Отправленные и полученные данные будут отображаться в Memo1. Сохраните новую форму как Comm.pas.
2.Напишите исходный код
//Описание переменной
вар
fcomm:TFCOMM;
строка просмотра: строка;
я: целое число;
rbuf,sbuf:массив[16] байтов;
//Открываем последовательный порт
процедура TFCOMM.FormShow(Отправитель: TObject);
начинать
comm1.StartComm;
конец;
//Закрываем последовательный порт
процедура TFCOMM.FormClose (Отправитель: TObject; вар Действие: TCloseAction);
начинать
com1.StopComm;
конец;
//Настраиваем процесс отправки данных
процедура отправки данных;
вар
я: целое число;
commflg: логическое значение;
начинать
строка просмотра:='';
commflg:=истина;
для i:= от 1 до 6 сделать
начинать
если не fcomm.comm1.writecommdata(@sbuf[i],1), то
начинать
commflg: = ложь;
перерыв;
конец;
//Задержка между байтами при отправке
спать(2);
viewstring:=viewstring+intttohex(sbuf[i],2)+'';
viewstring:='Отправить'+viewstring;
fcomm.memo1.lines.add(строка просмотра);
fcomm.memo1.lines.add('');
если не commflg, то messagedlg('Отправка не удалась!',mterror,[mbyes],0);
конец;
//Отправляем событие нажатия кнопки
процедура TFCOMM.Btn_sendClick(Отправитель: 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);
вар
я: целое число;
начинать
строка просмотра:='';
move(buffer^,pchar(@rbuf^),bufferlength);
для i:=1 для длины буфера сделать
viewstring:=viewstring+intttohex(rbuf[i],2)+'';
viewstring:='receive'+viewstring;
memo1.lines.add(строка просмотра);
memo1.lines.add('');
конец;
Если в memo1 отображается сообщение об отправке F0 01 FF FF 01 F0 и получении F0 01 FF FF 01 F0, это означает, что последовательный порт правильно отправил и правильно принял данные, и последовательная связь успешна.