stm3.0 arduino
174
- admin管理员9小时前
// 使用 Uart 类创建串口对象(避开 Serial1/Serial2 的命名冲突) Uart UART1(PA_9, PA_10); // USART1: PA9(TX), PA10(RX) Uart UART2(PA_2, PA_3); // USART2: PA2(TX), PA3(RX) // 缓冲区 char buffer1[64]; char buffer2[64]; int index1 = 0, index2 = 0; void setup() { // 初始化两个串口 UART1.begin(115200); UART2.begin(115200); // 发送启动消息 UART1.println("UART1 已启动!"); UART2.println("UART2 已启动!"); } void loop() { // -------- 处理 UART1 的接收 -------- while (UART1.available() > 0) { char c = UART1.read(); if (c == '\n' || c == '\r') { buffer1[index1] = '\0'; // 将 UART1 收到的数据转发到 UART2 UART2.print("UART1收到: "); UART2.println(buffer1); index1 = 0; } else if (index1 < 63) { buffer1[index1++] = c; } } // -------- 处理 UART2 的接收 -------- while (UART2.available() > 0) { char c = UART2.read(); if (c == '\n' || c == '\r') { buffer2[index2] = '\0'; // 将 UART2 收到的数据转发到 UART1 UART1.print("UART2收到: "); UART1.println(buffer2); index2 = 0; } else if (index2 < 63) { buffer2[index2++] = c; } } } // USART1: PA9/PA10 Uart UART1(PA_9, PA_10); // USART2: PA2/PA3 Uart UART2(PA_2, PA_3); // USART3: PB6/PB7 (RS485) Uart RS485(PB_6, PB_7); #define RS485_EN PB_5 void setup() { UART1.begin(115200); UART2.begin(115200); RS485.begin(115200); pinMode(RS485_EN, OUTPUT); digitalWrite(RS485_EN, LOW); UART1.println("系统启动"); } void loop() { // 三个串口之间可以互相转发数据 // 例如:RS485 收到的数据转发到 UART1 if (RS485.available()) { char c = RS485.read(); UART1.write(c); } // UART1 收到的数据通过 RS485 发送 if (UART1.available()) { char c = UART1.read(); // 通过 RS485 发送需要切换模式 digitalWrite(RS485_EN, HIGH); RS485.write(c); RS485.flush(); digitalWrite(RS485_EN, LOW); } }STM32duino FreeRTOS 这个库
#include <STM32FreeRTOS.h> // -------- 硬件串口定义 -------- // USART1: PA9(TX), PA10(RX) - 通用串口1 Uart UART1(PA_9, PA_10); // USART2: PA2(TX), PA3(RX) - 通用串口2 Uart UART2(PA_2, PA_3); // USART3: PB6(TX), PB7(RX) - RS485 通信 Uart RS485(PB_6, PB_7); // RS485 使能控制引脚 #define RS485_EN PB_5 // -------- 任务句柄 -------- TaskHandle_t TaskUART1_Handle = NULL; TaskHandle_t TaskUART2_Handle = NULL; TaskHandle_t TaskRS485_Handle = NULL; // -------- 任务函数声明 -------- void TaskUART1(void *pvParameters); void TaskUART2(void *pvParameters); void TaskRS485(void *pvParameters); // -------- RS485 发送函数 -------- void sendRS485Data(const char* data) { // 切换到发送模式 digitalWrite(RS485_EN, HIGH); delayMicroseconds(10); // 发送数据 RS485.print(data); RS485.print("\r\n"); RS485.flush(); // 切换回收模式 delayMicroseconds(10); digitalWrite(RS485_EN, LOW); } // -------- setup 函数 -------- void setup() { // -------- 初始化 RS485 控制引脚 -------- pinMode(RS485_EN, OUTPUT); digitalWrite(RS485_EN, LOW); // 默认接收模式 // -------- 初始化所有串口 -------- UART1.begin(115200); UART2.begin(115200); RS485.begin(115200); // 发送启动消息 delay(100); // 等待串口稳定 UART1.println("UART1 已启动!"); UART2.println("UART2 已启动!"); sendRS485Data("RS485 已启动!"); // -------- 创建任务 -------- // 任务1: 处理 UART1 xTaskCreate( TaskUART1, "UART1_Task", 256, // 栈大小(字节) NULL, 1, // 优先级(1-3,数值越大优先级越高) &TaskUART1_Handle ); // 任务2: 处理 UART2 xTaskCreate( TaskUART2, "UART2_Task", 256, NULL, 1, &TaskUART2_Handle ); // 任务3: 处理 RS485(优先级稍高,因为需要及时响应) xTaskCreate( TaskRS485, "RS485_Task", 256, NULL, 2, // 优先级2,比 UART 任务高 &TaskRS485_Handle ); // -------- 启动 FreeRTOS 调度器 -------- vTaskStartScheduler(); // 如果调度器启动失败,会执行到这里 while(1) { // 永远不会执行到这里 } } // -------- 任务1: 处理 UART1 数据 -------- void TaskUART1(void *pvParameters) { (void) pvParameters; char buffer[64]; int index = 0; for (;;) { while (UART1.available() > 0) { char c = UART1.read(); if (c == '\n' || c == '\r') { buffer[index] = '\0'; // 将 UART1 收到的数据转发到 UART2 和 RS485 UART2.print("UART1收到: "); UART2.println(buffer); // 通过 RS485 发送 sendRS485Data(buffer); index = 0; } else if (index < 63) { buffer[index++] = c; } } // 让出 CPU,等待 10ms 后再次检查 vTaskDelay(pdMS_TO_TICKS(10)); } } // -------- 任务2: 处理 UART2 数据 -------- void TaskUART2(void *pvParameters) { (void) pvParameters; char buffer[64]; int index = 0; for (;;) { while (UART2.available() > 0) { char c = UART2.read(); if (c == '\n' || c == '\r') { buffer[index] = '\0'; // 将 UART2 收到的数据转发到 UART1 和 RS485 UART1.print("UART2收到: "); UART1.println(buffer); // 通过 RS485 发送 sendRS485Data(buffer); index = 0; } else if (index < 63) { buffer[index++] = c; } } vTaskDelay(pdMS_TO_TICKS(10)); } } // -------- 任务3: 处理 RS485 数据 -------- void TaskRS485(void *pvParameters) { (void) pvParameters; char buffer[64]; int index = 0; for (;;) { // 只有在接收模式下才读取数据 if (digitalRead(RS485_EN) == LOW) { while (RS485.available() > 0) { char c = RS485.read(); if (c == '\n' || c == '\r') { buffer[index] = '\0'; // 将 RS485 收到的数据转发到 UART1 和 UART2 UART1.print("RS485收到: "); UART1.println(buffer); UART2.print("RS485收到: "); UART2.println(buffer); index = 0; } else if (index < 63) { buffer[index++] = c; } } } vTaskDelay(pdMS_TO_TICKS(10)); } } // -------- loop 函数(FreeRTOS 下为空) -------- void loop() { // 空循环,所有任务由 FreeRTOS 调度 vTaskDelete(NULL); }// USART1: PA9/PA10 Uart UART1(PA_9, PA_10); // USART2: PA2/PA3 Uart UART2(PA_2, PA_3); // USART3: PB6/PB7 (RS485) Uart RS485(PB_6, PB_7); #define RS485_EN PB_5 unsigned long previousMillis = 0; const long interval = 1000; // 1秒间隔 void setup() { UART1.begin(115200); UART2.begin(115200); RS485.begin(115200); pinMode(RS485_EN, OUTPUT); digitalWrite(RS485_EN, LOW); UART1.println("系统启动"); } void loop() { unsigned long currentMillis = millis(); // 每秒执行一次 if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // 通过UART1打印 "st" UART1.println("st"); // 通过RS485打印 "st" digitalWrite(RS485_EN, HIGH); // 切换为发送模式 RS485.println("st"); RS485.flush(); // 等待数据发送完成 digitalWrite(RS485_EN, LOW); // 切换回接收模式 } // 可选:保持原有的数据转发功能(如果需要可以保留) // RS485 收到的数据转发到 UART1 if (RS485.available()) { char c = RS485.read(); UART1.write(c); } // UART1 收到的数据通过 RS485 发送 if (UART1.available()) { char c = UART1.read(); digitalWrite(RS485_EN, HIGH); RS485.write(c); RS485.flush(); digitalWrite(RS485_EN, LOW); } }