stm32部分
程式分享
在這篇文章中我會通過介紹esp8266和stm32兩部分的**來實現兩塊mcu串列埠資料的互動,互動的資料格式採用的是json格式,esp8266的開發環境使用的是arduino,stm32使用的是keil5。
esp8266我會從以下三部分介紹:①arduinojson解析庫的安裝②串列埠接收的實現③arduinojson庫實現資料解析④arduinojson庫實現資料的打包傳送
本篇部落格中使用的json庫為arduinojson
,版本是v5版本,目前最新的是v6版本,大家可以選擇v6版本安裝,只需看下示例,修改下我分享的工程即可。
在esp8266程式中需要將usartevent();
函式放到loop()
函式中。
/*串列埠資料接收*/
void
usartevent()
while
(serial.
read()
>=0)
//清除串列埠快取
}
/*資料解析*/
void
userdata
(string content)
status= doc[
"status"];
}
參照arduinojson庫的jsongeneratorexample
工程即可得到以下**,當然也可採用serial.println()
函式進行格式化輸出。
staticjsondocument<
200> doc;
doc[
"sensor"]=
"gps"
; doc[
"time"]=
1351824120
;serializejsonpretty
(doc, serial)
;
stm32同esp8266一樣,我會從以下四部分介紹:①json解析庫的安裝②串列埠接收的實現③json庫實現資料解析④json資料的打包傳送
stm32上我採用的json解析庫是jansson
,我會給大家提供這個庫的pack包,大家自動安裝即可。
stm32的串列埠中斷我才用的是串列埠空閒中斷,空閒中斷是接受資料後出現乙個byte的高電平(空閒)狀態,就會觸發空閒中斷。
**實現如下:
需要定義的全域性變數:u8 buf1_size = 0;//串列埠資料接收數量標記 bool data_change = 0;//串列埠接收完成/變化標誌位
void usart1_printf (
char
*fmt,..
.)va_end
(arg_ptr);}
void
usart1_init
(u32 bound)
void
usart1_irqhandler
(void
) usart1_rx_buf[buf1_size++
]=usart1->dr;
}elseif(
usart_getflagstatus
(usart1,usart_flag_idle)
!=bit_reset)
//空閒中斷發生
}
json庫解析需要呼叫標頭檔案#include
,bool型別變數使用需要#include "stdbool.h"
標頭檔案。
並且非常重要的是,在對大量資料進行解析的時候,需要將startup_stm32f10x_md.s
33的stack_size equ 0x00000200
修改為stack_size equ 0x00000c00
,這一步驟是將stm32的堆疊增加,防止在解析的時候出現堆疊不夠用的情況。
#include
bool led_status;
//開關燈json函式
//存在問題!!使用本函式解析後串列埠printf無法使用,建議使用usart1_printf函式實現傳送
/**
* @brief json解析函式
* @param none
* @return
* - 0 轉換成功
* - 1 轉換失敗
* @details
*/ uint8_t jansson_analysis
(char
*text)
else
json_decref
(root)
;//釋放json空間
return0;
}/*// string 型別的解析
name = (char *)json_string_value(json_object_get(root, "name"));
// int 型別的解析
age = json_integer_value(json_object_get(root, "age"));
// double 型別的解析
score = json_real_value(json_object_get(root, "score"));
// bool 型別的解析
status = json_object_get(root, "status");
if(json_is_true(status))
else if(json_is_false(status))
*/
jansson
包提供了乙個json資料打包的函式,但此函式在打包過程中會占用極大的片內空間,因此在這裡僅介紹給大家,不推薦大家使用,推薦大家使用的方法還是使用printf
函式進行格式化輸出。
/**
* @brief 將資料打包為json格式
* @param [in] status
* @return none
* @details
*/void
jansson_pack
(bool state)",
"status"
,status)
; out =
json_dumps
(root, json_encode_any)
;printf
("%s"
,out)
;json_decref
(root)
;//釋放json空間
free
(out)
;//釋放json空間}/*
s 代表string型別
b 代表bool型別
d 代表int型別
f 代表float、double型別
*/
使用printf
格式化輸出只需要:
printf(""
,status)
;
esp8266
stm32
ESP 8266 串列埠通訊 Serial
esp8266的串列埠通訊與傳統的arduino裝置完全一樣。除了硬體fifo 128位元組用於tx和rx 之外,硬體串列埠還有額外的 256位元組的tx和rx快取。傳送和接收全都由中斷驅動。當fifo 快取滿時,write函式會阻塞工程 的執行,等待空閒空間。當fifo 快取空時,read函式也會...
stm32串列埠通訊
通訊方式 1 同步通訊 帶時鐘同步訊號傳輸 spi,iic等 2 非同步通訊 不帶時鐘用途訊號 usrt,單匯流排 stm32串列埠引腳表 串口號 rxd txd 1 pa10 pa9 2 pa3pa2 3 pb11 pb10 4 pc11 pc10 5 pd2pc12 通訊過程 接收過程 由rx入...
STM32串列埠通訊
1.常用的串列埠相關暫存器 1 usart sr狀態暫存器,對應的庫函式 flagstatus usart getflagstatus usart typedef usartx,uint16 t usart flag 2 usart dr資料暫存器,對應的庫函式 void usart senddat...