WiFiEsp 是一個簡單好用的函式庫,讓你的 Arduino 板子,能夠透過 ESP-01物連網模組連上網路、傳送資料。它使用 AT指令跟 ESP-01 溝通,因此不需要更改 ESP-01 的韌體,就可以直接使用。另外它的函式,也跟 Arduino 原裝的 WiFi 與 Ethernet 函式庫差不多,很多函式都一樣。
對於要用現成的 MPU 連接 ESP-01 上網的程式來說,它可以省去許多直接用 AT 指令去控制 ESP-01的麻煩事。不過,這個函式庫,搭配 STM32 的板子,編譯時會出現錯誤訊息,需要在 WiFiEsp 函式庫中的 EspDrv.cpp 加上一些定義,才能順利編譯。
找出 EspDrv.cpp 的位置
加上以下程式碼
#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();
沒有留言:
張貼留言