个人分享
登录

stm3.0 arduino

83
  • admin
    管理员
    // 使用 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;
        }
      }
    }
  • admin
    管理员
    #1
    // 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);
      }
    }
  • admin
    管理员
    #2

    STM32duino FreeRTOS 这个库

  • admin
    管理员
    #3
    #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);
    }

发表回复

登录后回复