[ad_1]
Halo semua,
mencari bantuan pada data port serial yang diterima.
Saya memiliki file yang menyimpan banyak perintah.
Saya perlu mengirim perintah satu per satu ke port serial dan menunggu balasan dan tampilan untuk melanjutkan pengiriman perintah lainnya.
Saya menggunakan thread.sleep di antara setiap pengiriman perintah tetapi tidak berhasil.
tolong bantu.
Terima kasih
Apa yang saya coba:
I'm using thread.sleep between each command send but it does not work.
Solusi 1
Berhenti bermain-main dengan Thread.Sleep: itu mungkin tidak akan membantu Anda.
Cara saya melakukannya adalah dengan mengatur Antrean perintah, dan menggunakan acara DataReceived untuk mendapatkan respons. Saat respons selesai, ambil perintah berikutnya dari antrean, lalu kirimkan perintah tersebut, dan biarkan peristiwa DataReceived memproses responsnya ketika respons tersebut tiba.
Ketika Antrian kosong, rangkaian perintah selesai.
Solusi 2
Secara umum, semua operasi IO asinkron harus dilakukan di thread sendiri untuk menghindari pemblokiran aplikasi. Jika tidak, Anda akan mengalami kelambatan di GUI atau GUI akan diblokir sepenuhnya dalam kasus terburuk.
Untuk kasus Anda, Anda memerlukan setidaknya satu utas untuk menerima balasan dan mengirimkan perintah antrian.
Thread penerima harus melakukan buffering data hingga respons penuh diterima. Cara melakukan ini tergantung pada datanya (misalnya baris feed dengan data teks atau setelah menerima jumlah byte yang telah diumumkan dalam header protokol).
Setelah tanggapan penuh diterima, hal ini ditandai ke thread lain. Dalam kasus Anda, ini akan menjadi thread utama (GUI) untuk menampilkan respons dan antrian pengiriman untuk mengaktifkan pengiriman perintah berikutnya. Perhatikan bahwa meneruskan data dari thread ke elemen GUI memerlukan perlakuan khusus.
Thread transmisi dapat dengan mudah mengirim menggunakan panggilan pemblokiran karena tetap harus menunggu. Setelah dikirim harus menunggu respon sinyal yang diterima.
Anda dapat memasukkan pengiriman dan penerimaan ke dalam satu atau dua thread.
Kode semu untuk menerima (dengan asumsi data teks):
// Check for kill (terminate thread) event (wait with no timeout) while (!KillEvent) { do { // Blocking call until a character is available // Should have a timeout and corresponding handling (break here) rxChar = ReceiveChar(); Buffer += rxChar; } while (rxChar != '\n'); // Signal other threads that a response has been received // Pass a copy of Buffer to the main thread for display }
Di thread transmisi, setelah mengirim perintah, panggil di atas atau tunggu acara ketika penerimaan dilakukan di thread sendiri.
Menggunakan thread dan acara yang Anda hindari untuk dihubungi sleep
yang secara umum harus dihindari dan memastikan tidak ada waktu sistem yang terbuang.
Solusi 3
-ku SerialDevice
kelas di sini:
Komunikasi multithread untuk antarmuka GPIB/Visa/Serial[^]
mengimplementasikan persis proses yang dijelaskan dalam Solusi2 di atas: dengan perintah asinkron, I/O dilakukan di thread terpisah yang menggunakan panggilan pemblokiran sederhana untuk menulis/membaca.
Satu komentar pada solusi 1: acara DataReceived dipanggil pada thread non-UI oleh karena itu Anda tetap perlu mempelajari sesuatu tentang threading jika Anda ingin menggunakannya (misalnya, pengendali DataReceived dapat memanggil panggilan balik yang disinkronkan untuk menghindari masalah dengan bidang bersama atau komponen UI).
Solusi 4
Antara saya menemukan solusi tanpa menggunakan pengendali DataReceived.
Cukup tulis perintah ke port serial dan kemudian baca balasan dari port serial setelah penulisan.
dan itu berfungsi sesuai apa yang saya cari.
Namun tidak yakin apakah ini cara yang tepat untuk dilakukan.
Contoh:
Menulis();
Membaca();
[ad_2]
コメント