| |||||||||||||||||
| |||||||||||||||||
| текст: | ||
Реализация последовательной связи в Delphi С развитием современных информационных технологий и широким распространением компьютерных сетей технология компьютерной связи становится все более зрелой. Однако последовательная связь как гибкий, удобный и надежный метод связи по-прежнему остается эффективным методом связи и широко используется в промышленности. контроль. В практике промышленного производства использование ПК для мониторинга проектов в режиме реального времени обычно требует, чтобы ПК имел такие функции, как сбор данных, обработка данных, а также генерация и передача управляющих сигналов в пользовательском интерфейсе. В этой конкретной среде, если ПК должен быть подключен к сигналам управления процессом в реальном времени, необходимо напрямую управлять последовательным портом ПК. Delphi, выпущенный Borland, представляет собой мощный язык программирования высокого уровня с визуальными объектно-ориентированными функциями, который особенно подходит для подготовки графических интерфейсов и пользовательских программ в среде Windows. Механизм последовательной связи на базе WIN95/NT Механизм операционной системы Windows запрещает приложениям прямой доступ к компьютерному оборудованию, но предоставляет программистам ряд стандартных функций API, что делает подготовку приложений более удобной и устраняет проблемы с отладкой соответствующего оборудования. В Windows 95/NT — исходное сообщение WM_COMMNOTIFY из Windows 3. Просто работайте с буфером чтения/записи. Ниже приведены некоторые часто используемые функции последовательной связи в WIN95/NT: CreatFile открывает последовательный порт CloseHandle закрывает последовательный порт. SetupComm устанавливает размер коммуникационного буфера. ReadFile считывает операцию последовательного порта WriteFile записывает операцию последовательного порта SetCommState устанавливает параметры связи GetCommState получает параметры связи по умолчанию. ClearCommError очищает ошибку последовательного порта и получает текущий статус. Помимо вышеперечисленных функций часто используется важная запись DCB (Device Control Block). Существуют определяемые параметры последовательного порта, записанные в DCB. При настройке параметров последовательного порта необходимо сначала использовать функцию GetCommState для заполнения системных значений по умолчанию в блоке управления DCB, а затем установить пользовательские значения, которые устанавливает пользователь. хочет измениться. Чтобы осуществлять последовательную связь в WIN95/NT, помимо понимания основных функций работы связи, вы также должны освоить многопоточное программирование. Поток — это путь выполнения внутри процесса и основной объект, используемый операционной системой для распределения процессорного времени. Каждый процесс начинается с одного потока для завершения выполнения приложения. Последовательную связь необходимо реализовать с использованием многопоточной технологии. Ее основную логику обработки можно выразить следующим образом: в начале процесса основной поток выполняет необходимую работу по инициализации, а затем основной поток устанавливает поток мониторинга связи для мониторинга. коммуникационный порт в подходящее время по мере необходимости. Когда происходит указанное событие последовательного порта, сообщение WM_COMMNOTIFY отправляется в основной поток (поскольку WIN95 отменяет сообщение WM_COMMNOTIFY, вы должны создать его самостоятельно), и основной поток его обрабатывает. Если сообщение WM_COMMNOTIFY не требуется, основной поток завершает поток мониторинга связи. Одновременное выполнение нескольких потоков приведет к конфликтам на общих ресурсах. Чтобы избежать конфликтов, необходимо использовать синхронизированную многопоточность для доступа к общим ресурсам. WIN95 предоставляет множество методов для поддержки синхронизации потоков. Автор использует создание объектов событий для поддержки синхронизации потоков. Создайте объект события с помощью CraeteEvent() и настройте объект события на синхронизацию сигналов с помощью функции etEvent() или PulseEvent(). В приложении используйте функцию WaitSingleObject(), чтобы дождаться триггера синхронизации, и подождите, пока указанное событие не будет установлено для получения сигнала от других потоков, прежде чем продолжить выполнение программы. Конкретный метод реализации под Delphi Мощные функции Delphi и технология объектно-ориентированного программирования, поддерживающая многопоточность, делают последовательную связь очень простой и удобной. Это реализуется путем вызова внешних функций API. Основные шаги заключаются в следующем: во-первых, используйте функцию CreateFile, чтобы открыть последовательный порт, чтобы определить принадлежность последовательного порта этому приложению и заблокировать работу последовательного порта другими приложениями; , заполните блок управления устройством DCB через функцию GetCommState, а затем настройте скорость передачи данных, биты данных, биты четности и стоповые биты последовательного порта, вызвав функцию SetCommState. Затем создайте поток мониторинга последовательного порта для отслеживания событий последовательного порта. На этом основании вы можете управлять передачей данных через соответствующий последовательный порт; наконец, используйте функцию CloseHandle, чтобы закрыть последовательный порт; Конкретная программа выглядит следующим образом: Эта программа была скомпилирована с помощью Delphi3.0 и отлажена в среде Win95. Она была введена в практическое применение для справки читателей. программа: блок комдемоу; интерфейс использует Windows, сообщения, SysUtils, классы, графика, элементы управления, формы, диалоги; константа Wm_commNotify=Wm_User+12; тип ТФорм1 = класс (ТФорма) PROcedure FormCreate (Отправитель: TObject); частный Процедура коммерциализации; Процедура MsgcommProcess (Var Сообщение: Tmessage Wm_commnotify); {Частные заявления} общественный {Публичные заявления} конец; //Объявление потока TComm=Класс(TThread) защищенный процедура Выполнить;переопределить; конец; вар Форма1: ТФорм1; hcom, Post_Event: Thandle; lpol:Перекрыто; выполнение {$R *.DFM} Процедура TComm.Execute; //Процесс выполнения потока; вар dwEvtMask:DWord; Подождите: Логическое значение; Начинать fillchar(lpol,sizeof(toverlapped),0); Пока правда начинается dwEvtMask:=0; Wait:=WaitCommEvent(hcom,dwevtmask,lpol); //Ожидание событий последовательного порта; если подождать, то начать waitforsingleobject(post_event,infinite); //Ожидание установки события синхронизации; resetevent(post_event); //Сброс события синхронизации; PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);//Отправить сообщение; конец; конец; конец; процедура Tform1.comminitialize //Инициализация последовательного порта; вар lpdcb:Тдкб; Начинать 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 Message:Tmessage); вар Очистить: логическое значение; Комс: Tcomstat; cbNum, ReadNumber, lpErrors: Integer; Read_Buffer: массив [1..100] символов; Начинать Очистить:=Clearcommerror(hcom,lpErrors,@Coms); если ясно, то начать cbNum:=Coms.cbInQue; ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol); //Обрабатываем полученные данные SetEvent(Post_Event); //Настройка события синхронизации конец; конец; процедура TForm1.FormCreate(Отправитель: TObject); начинать коммерциализировать; post_event:=CreateEvent(nil,true,true,nil); //Создаем событие синхронизации; Tcomm.Create(False); //Создаем поток мониторинга последовательного порта; конец; конец. Имя автора: ruan_bangqiu | ||