Menerapkan Perintah Kontrol untuk MCU melalui Serial

8

Saya ingin mengintegrasikan antarmuka perintah dalam sebuah proyek yang membuat saya yang akan menerima perintah lebih dari serial dari PC.

Idenya adalah bahwa perangkat akan melakukan hal tersebut tetapi akan dikirim perintah, ia akan melakukannya. Ini berbeda dengan kebanyakan contoh yang berhasil saya temukan yang hanya merupakan perangkat idle yang menunggu data serial.

Jadi misalnya, perangkat yang mengontrol LED dan memainkan animasi. Katakanlah ada 3 animasi prasetel, dan ketika dinyalakan selalu memainkan nomor 1. Di sisi PC saya akan mengirim perintah 'mainkan 2, atau' ubah warna menjadi hijau 'atau mengirim animasi waktu nyata langsung ke perangkat. untuk bermain di LED.

Jadi pertanyaan saya adalah bahwa saya tidak dapat menemukan banyak informasi tentang "pola desain" ini? Saya tidak tahu harus mulai dari mana. Yang paling dekat saya datang adalah perpustakaan parsing serial arduino pra-dibuat. Namun saya mencari lebih banyak C / non arduino / pendekatan teoritis.

Saya telah melihat ke dalam protokol serial tapi itu hanya hal-hal seperti SPI dan I2C dll, tidak benar-benar bagaimana mengimplementasikan antarmuka kontrol / perintah dalam perangkat lunak.

Saya juga mengetahui tentang HDLC, sekali lagi meskipun tampaknya lebih dari standar / protokol. Utas serupa adalah /programming/1445387/how-do-you-design-a-serial-command-protocol-for-an-embedded-system Yang memiliki beberapa informasi yang sangat bagus tetapi sekali lagi harus dilakukan dengan protokol / komunikasi itu sendiri.

Saya mencoba menemukan cara kode / mengimplementasikan ini untuk membuat perintah atau kemampuan kontrol.

Apakah saya menggunakan infinite loop untuk memantau dan menangkap serial untuk perintah yang masuk, dan menggunakan daftar pernyataan IF untuk memilih perintah apa yang harus dilakukan, tetapi kemudian apa yang terjadi ketika tidak ada perintah dan sistem harus seperti biasa, atau jika itu meleset dari suatu perintah?

Didorong interrupt, mesin negara?

Apakah ada nama resmi untuk ini yang dapat digunakan untuk meneliti dan menemukan contoh?

EDIT:

Bagi siapa pun yang memiliki pertanyaan yang sama, saya menemukan contoh yang sangat bagus saat meneliti, http://www.adnbr.co.uk/articles/parsing-simple-usart-commands

binarysmacker
sumber
Mengapa tidak menggunakan kerangka kerja seperti FreeMODBUS atau Firmata?
Ignacio Vazquez-Abrams

Jawaban:

5

Ada banyak cara untuk mengimplementasikan protokol komunikasi. Misalnya, Anda dapat memilih untuk menggunakan:

  • format yang dapat dibaca manusia atau biner
  • pengecekan kesalahan seperti checksum atau CRC
  • mulai dan / atau akhiri karakter pesan
  • panjang pesan, nomor informasi payload dll
  • mengakui / mengakui negatif / mencoba lagi mekanisme

Contoh perintah Anda dapat dibaca oleh manusia dan harus menggunakan '\ n' (masukkan) sebagai akhir dari karakter pesan. Mulai / akhir karakter pesan memudahkan untuk mengurai aliran input.

Alur program tipikal adalah menunggu karakter awal diterima, kemudian menyimpan byte berikutnya ke dalam buffer pesan sampai karakter akhir diterima. Setelah itu, sampaikan buffer ke fungsi lain untuk mem-parsing pesan. Jika tidak ada karakter awal, mulailah menyimpan byte segera sampai karakter akhir diterima.

Sebagian besar * embedded system berjalan dalam satu infinite loop. Penanganan pengiriman dan penerimaan serial dilakukan melalui interupsi pada Arduino (lihat HardwareSerial.cpp). Karakter yang diterima ditempatkan ke dalam buffer. Pada setiap iterasi dari loop Anda memeriksa untuk melihat apakah ada karakter dalam buffer (Serial.available ()) dan memprosesnya. Dengan menerima karakter menggunakan interupsi, tidak ada karakter yang boleh dilewatkan. Anda tidak melakukan semua pemrosesan dalam rutinitas interupsi ini, kalau tidak mereka menjadi terlalu lama dan karena itu kehilangan interupsi berikutnya.

Jika Anda tidak ingin perangkat Anda duduk dalam perulangan menganggur, masukkan ke dalam mode tidur untuk 'menjeda' perulangan sampai terjadi gangguan atau peristiwa lainnya.

Saya sangat suka perpustakaan ini untuk olahpesan yang dapat dibaca manusia: http://playground.arduino.cc/Code/Messenger

* Saya tidak bisa memikirkan sistem yang tidak tetapi mungkin ada satu di luar sana.

geometrikal
sumber
3

Yang harus dilakukan oleh program Anda adalah:
1. sering memeriksa port serial untuk karakter baru
2. melompat ke rutinitas / set status yang sesuai / apa pun, tergantung pada karakter
3. pergi ke 1

Program ini dapat bertindak berdasarkan karakter tunggal, atau Anda dapat membuat format pesan Anda sendiri - Saya sering memulai sebuah cammand dengan "$" dan diakhiri dengan baris baru, dan menggunakan karakter ASCII yang dapat dibaca untuk perintah (mempermudah debugging!).

Pastikan bahwa program tidak akan terputus jika menerima perintah yang tidak valid!

Peter Bennett
sumber
Beberapa Alat Uji Otomatis (ATE) menggunakan tautan serial yang sangat mirip untuk melakukan ini.
Sendok