Serial2和seria1的区别

使用的板子是AMB23,如果一帧数据大于66字节的话,同样的程序使用serial1就可以接收到完整的串口数据,但是替换成serial2就只能接收到一部分数据。
arduino是3.1.6
serial2使用的是PB1和PB2。
以下是接收串口的数据的代码。

void threadB(void* pvParameters) {
  int recv_length;
  uint8_t recv_buff[1024];
  for (;;) {
     recv_length = Serial2.available();
     if(recv_length>0)
     {
       Serial2.readBytes(recv_buff,recv_length);
       if(loss_link_count < 200)
       {
          client.write(recv_buff,recv_length);
       }
       Serial.print("uart: ");
       Serial.print(recv_length);
       Serial.print("   ");
       Serial.println(recv_buff[0],HEX);
     }
     else
     {
      delay(5);
     }
  }
}

void setup() {
    //Initialize serial and wait for port to open:
    Serial.begin(115200);
    Serial2.begin(2000000);
    while (!Serial) {
        ;
    }
    // check for the presence of the shield:
    if (WiFi.status() == WL_NO_SHIELD) {
        Serial.println("WiFi shield not present");
        // don't continue:
        while (true);
    }

    // attempt to connect to Wifi network:
    while (status != WL_CONNECTED) {
        Serial.print("Attempting to connect to SSID: ");
        Serial.println(ssid);
        // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
        status = WiFi.begin(ssid, pass);
        retry_time++;
        Serial.print("\r\nRetry ");
        Serial.print(retry_time);
        Serial.println(" times");
        // wait 10 seconds for connection:
        delay(10000);
        if(retry_time>=3) break;
    }
    if(3 <= retry_time)
    {
      Serial.println("First Connected Failed");
    }
    else
    {
      Serial.println("Connected to wifi");
      printWifiStatus();
      Serial.println("\nStarting connection to server...");
      // if you get a connection, report back via serial:
      if (client.connect(server, 8888)) {
          Serial.println("connected to server");
      }
    }
    delay(100);
    xTaskCreate(threadA, "Task A", 1024, NULL, tskIDLE_PRIORITY + 2, &Handle_aTask);
    xTaskCreate(threadB, "Task B", 1024, NULL, tskIDLE_PRIORITY + 3, &Handle_bTask);
}

尝试对底层进行修改,但是还是不行。是因为serial2 是LP_UART的原因吗?

1M波特率是Serial1和Serial2都可以正确接收,但是当波特率大于2M的时候Serial2就不行了,Serial1在波特率大于3M的时候也是不行的。希望能够帮助解决这个问题。

根据这两天的测试可以提供更多的信息,AMB23 Serial2仍然使用默认的串口配置(8N1),但是STM32F405那边把串口的配置配置成8N2的时候接收到的数据就不会丢失了。所以是LP_UART存在着停止位识别的BUG???

有没有技术人员提供一下思路,现在能排除的是STM32这边的问题,因为使用ESP32和ESP8266 2M波特率下接收串口数据是没有问题的,应该还是AMB23这个模块哪里出问题了。

参考一下,设定不同的serial
Serial.begin(speed)
Serial.begin(speed, config)

SERIAL_8N1 这些参数在发文章之前都已经测试过了,没有用。
还有一个反证就是,AMB23的Serial2在1M波特率下没有任何问题,无论是和STM32F405通信还是和FT232串口转USB模块通信都没有问题,一旦超过了2M就会出现帖子中描述的问题,而Serial1在2M波特率下没有出现任何问题。

波特率(baud rate) 的問題會進行測試更新,謝謝您反饋。下個版本會修復
也可以去GirHub來提出issue, 修復會在測試版本釋出
GitHub

所以这个现象你们也复现了吗?大概会在什么时候推送这个修复后的测试版本?

詳細回復請參考,