微控制器JSON生成框架

2021-08-31 09:57:47 字數 3334 閱讀 2901

出處

背景最近買了51822的藍芽開發板,閒暇之餘進行了一些除錯,目前還沒有深究藍芽協議的原理。借助git上51822的現有安卓例程以及開發板自帶程式,基本可以實現android手機和開發板間的資料傳遞,那麼,問題來了。

資料用什麼樣的格式傳遞呢?如果資料量小的話可以自定義一些規則進行解析,記得做畢業設計的時候就是自定義了幾個tag,微控制器通過串列埠傳送帶tag的字串,上位機根據tag解析資料,顯然這種方法並不通用。json大概是安卓開發中傳遞資料使用的最廣泛的傳輸格式了,那麼,能不能自己寫個json工具框架呢?當然能了.....只是有點麻煩而已。目前已經完成了微控制器json的生成。

實現微控制器實現乙個json框架有什麼困難呢?我覺得最大的障礙就是記憶體管理了,要知道,這種沒有mmu和linux作業系統的微控制器,很多時候並不能直接進行malloc相關的堆操作。而json這種結構化資料的操作則需要大量輔助的資料結構,比如樹和鍊錶都需要我們對記憶體進行頻繁操作,如果不進行特殊處理是很難在微控制器上完成的。

在微控制器上使用記憶體,我們多用的是陣列,在**編譯的時候編譯器回自動給我們的陣列分配一段連續記憶體空間供我們操作。顯然,我們可以利用這段記憶體來當作我們存放結構化資料的記憶體空間,而我們要做的就是提供一套規則,對這段記憶體進行操作。

在實際操作中,由於微控制器的種類繁多,各種函式的實際使用效果也不相同,尤其是sizeof函式,很多時候不能正確測量型別長度,所以對於結構體資料最好是手動指定記憶體大小。

51822中的核心是使用cm0作為微控制器,我們在mdk下使用c語言進行開發。

基本結構

#define jsontype_kv 1

#define jsontype_arr 2

/***鍵值對

*/typedef struct _jsonnodejsonnode;

/*** jsonobject 主要用於json陣列

*/typedef struct _jsonobjectnodejsonobjectnode;

/*** json主幹列表

*/typedef struct _jsonlistjsonlist;

具體實現方法

記憶體管理

char typemem[my_type_malloc_size];

char *mptr = typemem;

char *mptrrecord = typemem;

//**********自定義的malloc***********

void *mymemmalloc(int size)

void mymemfree(void *ptr)

void mymemcpy(void *des,void *src,int n)

//**********獲取乙個jsonnode的記憶體空間******************

jsonnode *newjsonnode()

//***********獲取乙個jsonobject的記憶體空間******************

jsonobjectnode *newjsonobjectnode()

json生成

jsonlist *initlinklist()

void initjsonnode(jsonnode *node, char *key, char *value, int type)

/*** 新增乙個普通json鍵值對

*/void addnode(jsonlist *list, char *key, char *value)else

list->length++;

node->type = jsontype_kv;

node->keylength = strlen(key);

node->valuelength = strlen(value);

node->key = key;

node->value = value;

}/**

* 新增乙個json array鍵值對

*/void addjsonarray(jsonlist *list, char *key, jsonobjectnode **value, int length)

indexnode = indexnode->next;

}if(samekeyflag == 0)else

list->length++;

}node->type = jsontype_arr;

node->keylength = strlen(key);

//node->valuelength = strlen(value);

node->key = key;

//node->array[node->arrayindex] = value;

//node->arrayindex++;

node->value = null;

node->valuelength = 0;

node->objectnode = value;

node->arraylength = length;

}/**

* 將普通jsonnode轉換為字串的形式

*/char *getjsonobjstring(char *mem, int *index, jsonnode *nodeptr)

/*** 將json陣列轉換為字串,如果巢狀了陣列則會遞迴轉換

*/char *getjsonarraystring(char *mem, int *index, jsonnode *nodeptr)else

mem[(*index)++] = 'else if(type == jsontype_arr)

mem[(*index)++] = ',';

}mem[(*index)-1] = '}';

if(i < nodeptr->arraylength-1)

}mem[(*index)++] = ']';

}mem[(*index)] = '\0';

str = mem;

return str;

}/**

* 轉換主幹json列表為字串

*/char *getjsonstring(jsonnode **start, int length)else if(nodeptr->type == jsontype_arr)

jsonstr[index] = ',';

index++;

}nodeptr = nodeptr->next;

}jsonstr[index-1] = '}';

jsonstr[index] = '\0';

return jsonstr;

}使用例程

char* testjson()

由於開發板串列埠驅動不對,我們無法直接看到列印資料,我們直接將資料通過藍芽返回了手機

單片微控制器

微控制器又稱單片微控制器,它不是完成某乙個邏輯功能的晶元,而是把乙個計算機系統整合到乙個晶元上。相當於乙個微型的計算機,和計算機相比,微控制器只缺少了i o裝置。概括的講 一塊晶元就成了一台計算機。它的體積小 質量輕 便宜 為學習 應用和開發提供了便利條件。同時,學習使用微控制器是了解計算機原理與結...

單片微控制器

微控制器又稱單片微控制器,它不是完成某乙個邏輯功能的晶元,而是把乙個計算機系統整合到乙個晶元上。相當於乙個微型的計算機,和計算機相比,微控制器只缺少了i o裝置。概括的講 一塊晶元就成了一台計算機。它的體積小 質量輕 便宜 為學習 應用和開發提供了便利條件。同時,學習使用微控制器是了解計算機原理與結...

微控制器及微控制器系統

微控制器及微控制器系統 1 什麼是微控制器?微控制器是將 處理器 cpu 隨機儲存器 ram 唯讀儲存器 rom或eprom 定時器晶元和一些輸入 輸出介面電路整合在乙個晶元上的微控制器 microcontroller 處理器包括運算器 控制器和暫存器3個主要部分,是微控制器的核心。儲存器按工作方式...