串口通信ESP8266NodeMCU与STM32F106C8T6-Arduino平台

还是Arduino平台,stm32的代码上一篇记录是一样的,仅仅是把esp32换成了esp8266

总结

  1. ESP8266NodeMCU一共有两个USART,UART1仅支持发送数据,故串口通信需要用默认的USART。
  2. 因为占用了默认的USART(RX/TX)接口,故需要使用外置电源避免冲突。
  3. 无法通过Serial打印日志,所以我将日志通过MQTT发送到本地服务器上查看。

物料

ESP8266NodeMCU

接线

电脑-esp32-stm32-led

ESP8266NodeMCU STM32F106C8T6 LED
3V3 3V3
GND GND
RX A10 (Serial1 RX)
TX A09 (Serial1 TX)
A01 +
GND -

image

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);
}

posted @ 2025-08-16 21:10  AlpacaGo  阅读(58)  评论(0)    收藏  举报