串口通信ESP8266NodeMCU与STM32F106C8T6-Arduino平台
还是Arduino平台,stm32的代码上一篇记录是一样的,仅仅是把esp32换成了esp8266
总结
- ESP8266NodeMCU一共有两个USART,UART1仅支持发送数据,故串口通信需要用默认的USART。
- 因为占用了默认的USART(RX/TX)接口,故需要使用外置电源避免冲突。
- 无法通过
Serial打印日志,所以我将日志通过MQTT发送到本地服务器上查看。
物料
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.*.*"; // 修改为你的服务器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的设备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();
}
// 创建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() {
// 发送数据到STM32
String message = String(counter);
sendToSTM32(message);
delay(1000);
// 检查是否收到STM32的数据
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串口用于调试
Serial1.begin(115200);
Serial1.println("STM32 starting...");
pinMode(PA1, OUTPUT);
Serial1.println("STM32 ready to communicate with ESP32");
}
void loop() {
// 发送数据到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);
}

浙公网安备 33010602011771号