| |||||||||||||||||
| |||||||||||||||||
| teks: | ||
Implementasi komunikasi serial di Delphi Dengan berkembangnya teknologi informasi modern dan meluasnya penggunaan jaringan komputer, teknologi komunikasi komputer semakin matang. Namun komunikasi serial, sebagai metode komunikasi yang fleksibel, nyaman dan andal, masih merupakan metode komunikasi yang efektif dan banyak digunakan dalam industri kontrol. Dalam praktik produksi industri, penggunaan PC untuk memantau proyek secara real time biasanya memerlukan PC untuk memiliki fungsi seperti pengumpulan data, pemrosesan data, dan mengontrol pembangkitan dan transmisi sinyal pada antarmuka pengguna. Dalam lingkungan khusus ini, jika PC ingin dihubungkan dengan sinyal kontrol proses real-time, port serial PC harus dioperasikan secara langsung. Delphi yang diluncurkan oleh Borland adalah bahasa pemrograman tingkat tinggi yang kuat dengan fitur berorientasi objek visual dan sangat cocok untuk persiapan antarmuka grafis dan program pengguna di lingkungan Windows. Mekanisme komunikasi serial berdasarkan WIN95/NT Mekanisme sistem operasi Windows melarang aplikasi mengakses perangkat keras komputer secara langsung, tetapi menyediakan serangkaian fungsi API standar bagi pemrogram, membuat persiapan aplikasi lebih nyaman dan menghilangkan kesulitan dalam men-debug perangkat keras terkait. Di Windows 95/NT, pesan WM_COMMNOTIFY asli Windows 3. Operasikan saja pada buffer baca/tulis. Beberapa fungsi operasi komunikasi serial yang umum digunakan di WIN95/NT adalah sebagai berikut: CreatFile membuka port serial CloseHandle menutup port serial SetupComm mengatur ukuran buffer komunikasi ReadFile membaca operasi port serial WriteFile menulis operasi port serial SetCommState menetapkan parameter komunikasi GetCommState mendapatkan parameter komunikasi default ClearCommError menghapus kesalahan port serial dan mendapatkan status saat ini Selain fungsi di atas, catatan penting DCB (Blok Kontrol Perangkat) sering digunakan. Ada parameter port serial yang dapat ditentukan yang direkam dalam DCB. Saat mengatur parameter port serial, Anda harus terlebih dahulu menggunakan fungsi GetCommState untuk mengisi nilai default sistem ke dalam blok kontrol DCB, dan kemudian mengatur nilai khusus yang pengguna ingin berubah. Untuk melakukan komunikasi serial di WIN95/NT, selain memahami fungsi dasar pengoperasian komunikasi, Anda juga harus menguasai pemrograman multi-thread. Thread adalah jalur eksekusi dalam suatu proses dan merupakan entitas dasar yang digunakan oleh sistem operasi untuk mengalokasikan waktu CPU. Setiap proses dimulai dengan satu thread untuk menyelesaikan eksekusi aplikasi. Komunikasi serial perlu diimplementasikan menggunakan teknologi multi-thread. Logika pemrosesan utamanya dapat dinyatakan sebagai berikut: pada awal proses, thread utama melakukan beberapa pekerjaan inisialisasi yang diperlukan, dan kemudian thread utama membuat thread pemantauan komunikasi untuk dipantau. port komunikasi pada waktu yang tepat sesuai kebutuhan. Ketika peristiwa port serial yang ditentukan terjadi, pesan WM_COMMNOTIFY dikirim ke thread utama (karena WIN95 membatalkan pesan WM_COMMNOTIFY, Anda harus membuatnya sendiri), dan thread utama memprosesnya. Jika pesan WM_COMMNOTIFY tidak diperlukan, thread utama mengakhiri thread pemantauan komunikasi. Eksekusi beberapa thread secara bersamaan akan menyebabkan konflik pada sumber daya bersama. Untuk menghindari konflik, perlu menggunakan multi-thread yang disinkronkan untuk mengakses sumber daya bersama. WIN95 menyediakan banyak metode untuk menjaga sinkronisasi thread. Penulis menggunakan pembuatan objek acara untuk menjaga sinkronisasi thread. Buat objek acara melalui CraeteEvent() dan atur objek acara agar memberi sinyal sinkronisasi menggunakan fungsi etEvent() atau PulseEvent(). Dalam aplikasi, gunakan fungsi WaitSingleObject() untuk menunggu pemicu sinkronisasi, dan tunggu hingga peristiwa yang ditentukan diatur agar mendapat sinyal dari thread lain sebelum melanjutkan menjalankan program. Metode implementasi khusus di bawah Delphi Fungsi Delphi yang kuat dan teknologi pemrograman berorientasi objek yang mendukung multi-threading membuat komunikasi serial menjadi sangat sederhana dan nyaman. Ini diimplementasikan dengan memanggil fungsi API eksternal. Langkah-langkah utamanya adalah sebagai berikut: Pertama, gunakan fungsi CreateFile untuk membuka port serial guna menentukan kepemilikan port serial oleh aplikasi ini dan memblokir aplikasi lain agar tidak mengoperasikan port serial; , isi blok kontrol perangkat DCB melalui fungsi GetCommState, lalu konfigurasikan baud rate, bit data, bit paritas, dan bit stop port serial dengan memanggil fungsi SetCommState. Kemudian, buat thread pemantauan port serial untuk memantau kejadian port serial. Atas dasar ini, Anda dapat mengoperasikan transmisi data pada port serial yang sesuai; terakhir, gunakan fungsi CloseHandle untuk menutup port serial. Program spesifiknya adalah sebagai berikut. Program ini dikompilasi dengan Delphi3.0 dan di-debug di lingkungan Win95. Program ini telah dimasukkan ke dalam aplikasi praktis untuk referensi pembaca. program: unit comdemou; antarmuka kegunaan Windows, Pesan, SysUtils, Kelas, Grafik, Kontrol, Formulir, Dialog; konstanta Wm_commNotify=Wm_Pengguna+12; jenis TForm1 = kelas(TForm) Formulir ProsedurBuat(Pengirim: TObject); pribadi Prosedur diminimalkan; Prosedur MsgcommProcess(Var Pesan:Tmessage); {Deklarasi pribadi} publik {Pernyataan publik} akhir; //Deklarasi thread TComm=Kelas(Utas) terlindung prosedur Jalankan; timpa; akhir; var Formulir1: TForm1; hcom,Post_Event:Tangani; lpol: Tumpang tindih; pelaksanaan {$R *.DFM} Prosedur TComm.Execute; //Proses eksekusi thread var dwEvtMask:DWord; Tunggu:Boolean; Mulai fillchar(lpol,sizeof(tumpang tindih),0); Meskipun Benar, Mulailah dwEvtMask:=0; Tunggu:=WaitCommEvent(hcom,dwevtmask,lpol); //Tunggu event port serial; jika Tunggu Lalu Mulai waitforsingleobject(post_event,infinite); //Tunggu acara sinkronisasi disetel; resetevent(post_event); //Atur ulang acara sinkronisasi; PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);//Kirim pesan; akhir; akhir; akhir; procedure Tform1.comminitialize; //inisialisasi port serial var lpdcb:Tdcb; Mulai hcom:=createfile('com2',generic_read atau generic_write,0,nil,open_existence, file_attribute_normal atau file_flag_overlapped,0);//Buka port serial jika hcom=invalid_handle_value maka kalau tidak setupcomm(hcom,4096,4096); //Atur buffer input dan output ke 4096 byte getcommstate(hcom,lpdcb); //Dapatkan pengaturan default port serial saat ini lpdcb.baudrate:=2400; lpdcb.StopBits:=1; lpdcb.ByteSize:=8; lpdcb.Parity:=Paritas Genap; //Paritas genap Setcommstate(hcom,lpdcb); setcommMask(hcom,ev_rxchar); //Tentukan acara port serial sebagai karakter yang diterima; akhir; Prosedur TForm1.MsgcommProcess(Var Pesan:Tmessage); var Jelas: Boolean; Komunikasi:Tcomstat; cbNum,ReadNumber,lpErrors:Integer; Read_Buffer:array[1..100]dari char; Mulai Hapus:=Clearcommerror(hcom,lpErrors,@Coms); jika Jelas Maka Mulai cbNum:=Coms.cbInQue; ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol); //Memproses data yang diterima SetEvent(Post_Event); //Pengaturan acara sinkronisasi akhir; akhir; prosedur TForm1.FormCreate(Pengirim: TObject); mulai mengkominisialisasi; post_event:=CreateEvent(nil,true,true,nil); //Buat acara sinkronisasi; Tcomm.Create(False); //Buat thread pemantauan port serial; akhir; akhir. Nama anggota penulis: ruan_bangqiu | ||