ESP8266與STM32串列埠資料互動

2021-10-14 07:54:22 字數 3738 閱讀 4643

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.s33的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...