18禁免费观看完整版高清-毛片重口味女人的逼-99精品毛片免费播放高潮-2020年国产新视频

當前位置: 首頁 >應(yīng)用方案 >技術(shù)應(yīng)用 >

嵌入式開發(fā)遇到數(shù)據(jù)轉(zhuǎn)換解決數(shù)據(jù)流過大的解決辦法

痛苦!數(shù)據(jù)流過大?數(shù)據(jù)轉(zhuǎn)換各種組包拆包?指針數(shù)組你試過沒!

今天的是干貨,是真的干。作為一個從業(yè)4年,工齡6年的嵌入式開發(fā)程序員,在做通訊設(shè)備領(lǐng)域時最痛苦的事莫過于數(shù)據(jù)流過大問題,以及數(shù)據(jù)轉(zhuǎn)換時各種組包拆包等問題,特別是在控制器內(nèi)存資源有限時。這種問題更加突出。

拿以太網(wǎng)+串口傳輸modbus指令舉例:

以太網(wǎng)數(shù)據(jù)收發(fā)時以太網(wǎng)的協(xié)議棧占用內(nèi)存約20Kbyte,單個SOCKET傳輸數(shù)據(jù)時最少預(yù)留了532byte字節(jié)的緩存空間,當取出網(wǎng)絡(luò)下傳的數(shù)據(jù)時,需要拆掉網(wǎng)絡(luò)傳輸頭并在末尾增加CRC,串口上行數(shù)據(jù)時,需要增加網(wǎng)絡(luò)傳輸數(shù)據(jù)頭以及去掉末尾CRC值,如果此時碰到慣用for循環(huán)copy數(shù)據(jù)或者使用memcpy函數(shù)進行數(shù)據(jù)組包的大佬,內(nèi)存空間基本就是捉襟見肘。

解決以上問題的辦法之一就是使用指針配合數(shù)組進行組包與拆包,如下圖;

預(yù)留包頭46字節(jié)

數(shù)據(jù)部分536字節(jié)

末尾預(yù)留10字節(jié)

網(wǎng)絡(luò)端向串口發(fā)送:聲明數(shù)組時申明比實際數(shù)據(jù)所需空間更大的數(shù)組unsigned char Buff[592],以及一個指針unsigned char *datapoint;將datapoint指向Buff[46]的位置,讀入數(shù)據(jù),將數(shù)據(jù)從指針datapoint指向的位置開始存入數(shù)組,同時使用另外的變量unsigned int length存儲當次讀入的數(shù)據(jù)的長度,進行數(shù)據(jù)拆包操作時(去包頭6字節(jié)),直接將指針datapoint指向Buff[52]的位置,隨后將計算所得CRC2byte)值從Buff[46 + length]位置存入數(shù)組,并得出最終需要傳輸?shù)拈L度length+2,串口發(fā)送數(shù)據(jù)只需要輸入起始地址datapoint,長度length,將數(shù)據(jù)存入串口發(fā)送環(huán)形隊列即可完成發(fā)送。

代碼如下

unsigned char Buff[592];

unsigned char *datapoint;

unsigned int length;

datapoint = & Buff[46];//指針指向數(shù)組中間

net_dataread(datapoint,& length);//讀取數(shù)據(jù),獲得數(shù)據(jù)長度

CRC(&Buff[46+length],datapoint,& length);//獲取校驗值并存入數(shù)組

Uart_send(datapoint,length+2);

串口向網(wǎng)絡(luò)發(fā)送時,數(shù)據(jù)從環(huán)形隊列讀出,需要加上TCP modbus協(xié)議的包頭部分(6byte),去掉CRC校驗,同樣聲明數(shù)組以及指針、長度變量,將datapoint指向Buff[46]的位置,讀入數(shù)據(jù),將數(shù)據(jù)從指針datapoint指向的位置開始存入數(shù)組;將指針指向當前指向地址的前6個地址位置存入6字節(jié),然后按照新的datapoint位置,長度length+4將數(shù)據(jù)從網(wǎng)絡(luò)發(fā)出;

代碼如下

unsigned char Buff[592];

unsigned char *datapoint;

unsigned int length;

datapoint = & Buff[46];//指針指向數(shù)組中間

uart_read(datapoint,& length);//讀取數(shù)據(jù),獲得數(shù)據(jù)長度

datapoint = datapoint-6;

memcpy(datapoint,包頭暫存數(shù)組首地址,6);

Uart_send(datapoint,length+4);

以上實例簡單說明了利用指針組包的簡單應(yīng)用,但是在實際應(yīng)用中可能由于設(shè)備需要使用多種協(xié)議,組包方式不同,例如包頭之前加入注冊包等,數(shù)據(jù)實際讀取完成之后不是直接操作而是直接傳入子函數(shù),進行組包與拆包,此時僅需要傳入datapoint與長度,進子函數(shù),由于datapoint指向的數(shù)組前后均有預(yù)留空間,子函數(shù)內(nèi)依然可以使用指針,且在Buff[]數(shù)組的范圍內(nèi),指針可以前后自由移動,在不需要進行大量數(shù)據(jù)拷貝的前提下完成數(shù)組的拆組包過程,同時也避免了反復(fù)拷貝數(shù)據(jù)對空間的浪費。

      以上就是指針的簡單應(yīng)用之一,指針除了對數(shù)組,還可以對函數(shù)操作,結(jié)合結(jié)構(gòu)體,基本上可以在C語言中實現(xiàn)類似C++中類功能。


今天的分享就到這里啦,EBYTE每一天都致力于更好的助力物聯(lián)化、智能化、自動化的發(fā)展,提升資源利用率,更多嵌入式工業(yè)計算產(chǎn)品更多資料,感興趣的小伙伴可以登錄我們的億佰特官網(wǎng)和企業(yè)公眾號(微信號:cdebyte)進行了解,也可以直接撥打400電話咨詢技術(shù)專員!


相關(guān)閱讀:

1、嵌入式核心板在工業(yè)機器人領(lǐng)域的應(yīng)用

2、什么是嵌入式與物聯(lián)網(wǎng)

3、FreeRtos于嵌入式環(huán)境的應(yīng)用

4、日常生活中常見的嵌入式系統(tǒng)物聯(lián)網(wǎng)應(yīng)用



點擊撥打: 億佰特官網(wǎng) 4000-330-990