在串列埠傳輸中用盡可能少的字元表示資訊

2021-08-14 19:24:33 字數 1148 閱讀 1057

最近在編寫茶葉色選軟體的時候,輸出訊號涉及到96個0/1字元。由於設計到串列埠傳輸後微控制器的操作,對傳輸速度的要求較高,需要盡量用較少的字元去表示所有的資訊。

首先的思路是對96個字元每6個編1次組,轉換為16進製制的字元輸出,精簡後的長度為1(校驗位)+24個字元,對方表示不夠短。

考慮到對原始資料的輸出可控,首先將每2個字元轉為0/1/2/3,之後48個字元每3個編1次組,每個位元組的前2位用於校驗,後6位用於儲存資訊。第1個位元組的前2位為01,其他15個位元組的前2位為00。

以原始資料的字元『1』為例,其對應的ascii碼為49,以2進製顯示為00110001。其有效位為第0、1位,故首先使用與運算將4、5兩位的11置0。得到00000001。使用迴圈,對48個字元中序號逢1的字元左移4位,逢2的字元左移2位,當逢3時,使用與運算將3個字元進行整合。最後使用01000000與輸出的第1字元進行或運算,新增校驗位。

最終得到的輸出訊號的範圍為00000000~00111111、01000000~01111111。該範圍對應到ascii碼表時,會遇到很多特殊字元,在傳輸後無法在螢幕上顯示,但並不影響資料的傳輸,在串列埠除錯助手中勾選以16進製制顯示即可。

using namespace::std;

#include int main();

char *output = new char[16];

char cov2zero = 15; // 00001111 用於第4、5位置零

char chckhead = 64; // 01000000 用於新增校驗位

for (int i = 0; i < 48; i++)

else if ((i + 3) % 3 == 1)

if ((i + 1) % 3 == 0)

} output[0] = output[0] | chckhead;

std::cout << output << endl;

return 0;

}

此種方案的後15個字元沒有充分利用,其第6、7位始終為0,及後15個字元總是00******的格式。從更精簡的方向考慮,可以進一步充分利用,第乙個字元的仍然為01******,後15個字元中8位全部利用起來,可以顯示4份資訊,1+(48-3)/4 =12······1,故可用13個字元完全表示96個0/1字元。

關於c 串列埠傳輸

串列埠傳輸都是經過serialport類來實現 在serialport中有三個事件,主要用到的是datareceived接受資訊事件與errorreceived接受錯誤資訊事件。在datareceived接收串列埠發來資訊 private void serialport1 datareceived ...

串列埠傳輸速率計算

起始位1bit,資料位8bit,停止位1bit,無校驗,無流控 波特率115200 bps 115200 位 秒 沒有校驗位時,起始位1bit 資料位8bit 停止位1bit 10bit 波特率115200 bps 115200 位 秒 11.25 kb 秒 11520 位元組 秒 串列埠通道可參考...

C 串列埠傳輸中文字元

傳送 encoding gb system.text.encoding.getencoding gb2312 byte bytes gb.getbytes 中文 serialport1.write bytes,0,bytes.length 接收 int ilen serialport1.bytest...