Pernyataan masalah
Ketika mengembangkan perangkat lain pada mikrokontroler, saya mengalami situasi di mana perekaman terus-menerus dari sejumlah besar data diperlukan. Perangkat harus menyimpan kumpulan data yang terdiri dari cap waktu dan enam pengukuran ADC dari 100 kali per detik ke kartu SD (sebut saja data ini mengatur paket), lalu menganalisis data ini di komputer dalam bentuk grafik. Itu juga diperlukan secara paralel dengan menulis data ke kartu SD, mentransfernya melalui UART. Data ini seharusnya mengambil ruang sesedikit mungkin, karena ada banyak data. Pada saat yang sama, perlu untuk memisahkan paket-paket ini, karena data mengalir terus menerus. Setelah mencari-cari di internet tidak ada yang baik, saya tidak menemukan, jadi diputuskan untuk membuat protokol dan perpustakaan saya sendiri untuk itu.
Dan kemudian dia muncul - Protokol streaming paket (PSP1N)
Sebagai hasil dari beberapa pertimbangan, berikut ini diputuskan: dalam protokol, data akan dikirim dalam paket yang terdiri dari N byte, di mana bit pertama dari setiap byte dialokasikan ke tanda bit mulai untuk sinkronisasi paket (maka nama protokol), tujuh bit sisanya dialokasikan untuk data. Urutan dan ukuran data diketahui sebelumnya.
Contoh:
Kami mengalokasikan 32 bit untuk timestamp, 60 bit untuk pengukuran ADC (6 saluran 10 bit), berjumlah 92 bit. Karena Anda dapat mentransfer 7 bit data berguna dalam satu byte, paket akan terdiri dari 14 byte (92 bit / 7bit = 13,14 ... bulat hingga 14). Ada 112 bit informasi dalam 14 byte, dimana 14 bit ditempati oleh atribut bit awal dari 92 bit data yang berguna, ada 6 bit yang tidak digunakan (di mana kita dapat menulis beberapa informasi lebih lanjut, tetapi demi kesederhanaan kita tidak akan menggunakannya).

Dimana bit ke-7 adalah tanda bit awal (menunjukkan awal paket), 6,5,4,3,2,1,0 adalah bit data.
Sisi penerima juga tahu bahwa ia menerima paket 14 byte di mana bit pertama dari byte pertama adalah bit awal (1) (dalam byte yang tersisa, bit awal adalah 0), kemudian dalam bit data dalam urutan adalah 32 bit dari cap waktu, kemudian 10 bit dari pengukuran ADC No. 1, lalu 10 bit ADC # 2 dan seterusnya ...
Demikian pula, menulis ke kartu SD dan membaca dari itu sesuai dengan protokol berlangsung. Secara total, untuk satu hari perekaman pada kartu SD, kami mendapatkan informasi 115,4 MB (pengukuran 14 byte x 100 per detik x 3600 detik x 24 jam).
Struktur data ini masih nyaman karena di masa depan kita dapat memilih blok data dari mana saja dalam file dan menampilkannya dalam bentuk grafik, sehingga tidak memuat seluruh file ke dalam RAM (yang dapat mencapai beberapa puluh gigabyte). Dan juga kita dapat menerapkan pengguliran yang mudah dari grafik ini dengan memuat paket yang diperlukan.

Saatnya memulai implementasi perangkat lunak untuk mikrokontroler
Kami menulis perpustakaan untuk mikrokontroler di C ++.
Untuk kenyamanan, buat kelas:
class PSP { public: void init(byte startBit, byte* arrayByte, byte sizeArrayByte); void pushData(byte sizeBit, uint32_t value); byte* popData(); protected: byte startBit;
Dengan metode inisialisasi, saya pikir semuanya jelas:
void PSP::init(byte startBit, byte* arrayByte, byte sizeArrayByte) { this->startBit = startBit; this->arrayByte = arrayByte; this->sizeArrayByte = sizeArrayByte; }
Metode menambahkan data lebih rumit, di sini, dengan manipulasi bitwise licik, kami menempatkan data dalam array byte kami.
void PSP::pushData(byte sizeBit, uint32_t value) { byte free; byte y; int remBit = 0;
Metode untuk mendapatkan array byte dari suatu paket:
byte* PSP::popData() { position = 0;
Dan akhirnya, beberapa fungsi tambahan:
Untuk meringkas
Sebagai hasil dari pekerjaan yang dilakukan, protokol ringkas untuk streaming data PSP1N dan perpustakaan siap pakai yang dapat diunduh dari GitHub di sini βlahirβ. Dalam repositori ini Anda akan menemukan:
- Contoh penggunaan perpustakaan ExampleColsolePSP1N / C #
- PSP1N_CPP / berisi perpustakaan PSP untuk bekerja dengan protokol dan contoh penggunaannya di Arduino
- PSP1N_CSHARP / pustaka protokol untuk .NET
Untuk mendemonstrasikan operasi protokol, Anda dapat mem-flash sketsa ke Arduino dan dalam contoh ExampleSerialPortRead di komputer, menerima data dari mikrokontroler melalui port COM. Di sana, data ini didekripsi dan ditampilkan dalam aplikasi konsol. Saya akan berbicara tentang perpustakaan yang ditulis dalam C # untuk pihak penerima di lain waktu.
PengujianConsole:

UPDATE (03/31/19): Mengubah algoritma penyandian dan penguraian