如何讓 WiFiEsp 跟 STM32 Blue Pill 編譯時不會出錯?

WiFiEsp 是一個簡單好用的函式庫,讓你的 Arduino 板子,能夠透過 ESP-01物連網模組連上網路、傳送資料。它使用 AT指令跟 ESP-01 溝通,因此不需要更改 ESP-01 的韌體,就可以直接使用。另外它的函式,也跟 Arduino 原裝的 WiFi 與 Ethernet 函式庫差不多,很多函式都一樣。

對於要用現成的 MPU 連接 ESP-01 上網的程式來說,它可以省去許多直接用 AT 指令去控制 ESP-01的麻煩事。不過,這個函式庫,搭配 STM32 的板子,編譯時會出現錯誤訊息,需要在 WiFiEsp 函式庫中的 EspDrv.cpp 加上一些定義,才能順利編譯。

找出 EspDrv.cpp 的位置

在使用者目錄的 libraries 裡面,可以找到 WiFiEsp 目錄,並找出src/utility/EspDrv.cpp 這個檔案。改一下這個檔案,就能讓 STM32 編譯成功。

加上以下程式碼

#include <Arduino.h>
#include <avr/pgmspace.h>
#include "utility/EspDrv.h"
#include "utility/debug.h"
//加上以下這段
#if defined(ARDUINO_ARCH_STM32) || defined (STM32_MCU_SERIES)
//For va_start
#include <stdarg.h>
//vsnprintf_P is not defined in avr/pgmspace.h for ststm32-maple
#define vsnprintf_P vsnprintf
#endif
#define NUMESPTAGS 5
const char* ESPTAGS[] =

傳送位元組資料,必須要用 unsigned char

EspDrv.cpp 裡面的UDP資料傳送用的類別成員函數,EspDrv::sendDataUdp,是使用

espSerial->write(data, len);

在傳送 AT+CIPSEND=.......... 這個指令給 ESP-01後,ESP-01顯示 '>' 字元,然後EspDrv::sendDataUdp 再把你的資料內容,透過上述串列埠 write 指令送出去給 ESP-01。如果你在程式中的傳送buffer,是用 char 的話,接收端收到的資料,將會每一個字元單獨接收。你必須要把你的buffer 的資料格式,定義成無正負號的字元, unsigned char 或 byte 或 uint8_t 才行。

例如以下程式範例:

char ssid[] = "MY_ROUTER";            // your network SSID (name)

char pass[] = "1234567";        // your network password

unsigned int localPort = 10002;  // local port to listen on

unsigned int udpsvrport = 10002;  // remote port to listen on

IPAddress udpsvrip(192, 168, 11, 50);  //ip of remote UDP server

const int udppacketsize = 16;//每次傳送 16 byte 的資料

unsigned char sendbuffer[udppacketsize];


WiFiEspUDP Udp;

Serial2.begin(115200);

WiFi.init(&Serial2);

status = WiFi.begin(ssid, pass);

Udp.begin(localPort );

sprintf((char*)sendBuffer, "My Data String");

Udp.beginPacket(udpsvrip, udpsvrport);

Udp.write(sendBuffer, udppacketsize);

Udp.endPacket();


以上程式,會送出 My Data String,後面剩餘不夠 16byte的部份,會補 \0x00 送出。接收端就會收到正確的整段 bytes 資料,而不會收到 16次單一字元。

沒有留言:

張貼留言