串口通信ESP8266NodeMCU與STM32F106C8T6-Arduino平臺
還是Arduino平臺,stm32的代碼上一篇記錄是一樣的,僅僅是把esp32換成了esp8266
總結(jié)
- ESP8266NodeMCU一共有兩個USART,UART1僅支持發(fā)送數(shù)據(jù),故串口通信需要用默認的USART。
- 因為占用了默認的USART(RX/TX)接口,故需要使用外置電源避免沖突。
- 無法通過
Serial打印日志,所以我將日志通過MQTT發(fā)送到本地服務(wù)器上查看。
物料
ESP8266NodeMCU
接線
電腦-esp32-stm32-led
| ESP8266NodeMCU | STM32F106C8T6 | LED |
|---|---|---|
| 3V3 | 3V3 | |
| GND | GND | |
| RX | A10 (Serial1 RX) | |
| TX | A09 (Serial1 TX) | |
| A01 | + | |
| GND | - |

esp8266代碼
#include <Arduino.h>
#include <ArduinoJson.h>
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
// WiFi配置
const char *ssid = "****";
const char *password = "****";
// MQTT配置
const char *mqtt_server = "192.168.*.*"; // 修改為你的服務(wù)器IP地址
const int mqtt_port = 1883;
const char *mqtt_client_id = "****";
const char *mqtt_topic = "****/****";
const char *mqtt_command_topic = "****/****"; // 訂閱指令主題
const char *stm32_device_id = "****"; // STM32F103的設(shè)備ID
// WiFi客戶端
WiFiClient espClient;
// MQTT客戶端
PubSubClient client(espClient);
int counter = 0;
void print(String message) {
Serial.print(message);
}
void println(String message) {
Serial.println(message);
}
void sendToSTM32(String message) {
Serial.println(message);
}
void setupWiFi() {
println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
println(".");
}
println("WiFi connected");
println("IP address: ");
}
void setupMQTT() {
client.setServer(mqtt_server, mqtt_port);
}
void reconnectMQTT() {
while (!client.connected()) {
println("Attempting MQTT connection...");
if (client.connect(mqtt_client_id)) {
println("connected");
// 訂閱指令主題
if (client.subscribe(mqtt_command_topic)) {
print("Subscribed to: ");
println(mqtt_command_topic);
} else {
println("Failed to subscribe to command topic");
}
} else {
print("failed, rc=");
println(" retrying in 2 seconds");
delay(2000);
}
}
}
void sendLog(String message) {
if (!client.connected()) {
reconnectMQTT();
}
// 創(chuàng)建JSON格式的日志消息
StaticJsonDocument<1024> doc;
doc["device_id"] = mqtt_client_id;
doc["type"] = "log";
doc["message"] = message;
doc["source"] = "esp8266";
String jsonString;
serializeJson(doc, jsonString);
client.publish(mqtt_topic, jsonString.c_str());
}
void setup() {
Serial.begin(115200, SERIAL_8N1);
println("ESP8266 init start");
// 連接WiFi
setupWiFi();
println("WiFi connected");
// 配置MQTT
setupMQTT();
println("MQTT connected");
delay(1000);
sendLog("ESP8266 init success");
}
void loop() {
// 發(fā)送數(shù)據(jù)到STM32
String message = String(counter);
sendToSTM32(message);
delay(1000);
// 檢查是否收到STM32的數(shù)據(jù)
if (Serial.available()) {
String message = "Received from STM32 (" + String(Serial.available()) + " bytes): " + Serial.readStringUntil('\n');
sendLog(message);
} else {
sendLog("No data received from STM32");
}
counter++;
}
STM32代碼,
/*
* Test program for the STM32F103C8T6
* 通過USART1 (PA9/PA10) 與ESP32通信
*/
#include "Arduino.h"
void setup() {
// 初始化USB串口用于調(diào)試
Serial1.begin(115200);
Serial1.println("STM32 starting...");
pinMode(PA1, OUTPUT);
Serial1.println("STM32 ready to communicate with ESP32");
}
void loop() {
// 發(fā)送數(shù)據(jù)到ESP32
if (Serial1.available()) {
String message = "STM32 " + Serial1.readStringUntil('\n');
Serial1.println(message);
}else{
Serial1.println("stm32 nothing");
}
// LED指示
digitalWrite(PA1, HIGH);
delay(500);
digitalWrite(PA1, LOW);
delay(500);
}

浙公網(wǎng)安備 33010602011771號