STM32
直播中

张娜

7年用户 927经验值
私信 关注
[问答]

ESP8266与STM32通讯,串口通讯出现数据丢失的原因?

小弟初学STM32不久,做的是wifi模块与STM32的通讯与数据处理,现在我有组数据,数据的HEX码如下:01 03 05 00 00 00 00 7F 7A 00 00 2C E5由于STM32函数的原因,串口只能打印:01 03 05 但我想调用数据7F 7A 应该如何修改这些函数或者有什么其他方法呢?谢谢大神指点
STM32接收数据代码:

  • char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx )
  • {
  •         char * pRecStr = 0
  •         strEsp8266_Fram_Record .InfBit .FramLength = 0;
  •         strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;
  •         while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag );
  •         strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '�';
  •         if ( enumEnUnvarnishTx )
  •         {
  •                 if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, ">" ) )
  •                         pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;

  •         }
  •         else
  •         {
  •                 if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )
  •                         pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
  •         }
  •         return pRecStr;
  • }

STM32串口打印代码:

  • void USART2_printf( USART_TypeDef* USARTx, char *Data, ... )
  • {
  •         int n;
  •         const char *s;
  •   int d;
  •   char buf;
  •         int i;

  •   va_list ap;
  •   va_start(ap, Data);

  •         n=sizeof(Data);

  •         for (i=0;i

回帖(1)

王浩

2024-5-14 18:14:34
在您的情况下,数据丢失可能是由于STM32串口接收缓冲区溢出或接收数据的处理方式不当导致的。为了解决这个问题,您可以尝试以下方法:

1. 确保STM32的串口接收缓冲区足够大,以容纳ESP8266发送的所有数据。

2. 修改STM32接收数据的函数,以便能够正确处理和存储接收到的数据。以下是修改后的函数示例:

```c
char *ESP8266_ReceiveString(FunctionalState enumEnUnvarnishTx) {
    char *pRecStr = 0;
    strEsp8266_Fram_Record.InfBit.FramLength = 0;

    // 确保接收缓冲区足够大
    static char recBuffer[100]; // 根据需要调整缓冲区大小

    // 循环接收数据
    while (1) {
        if (HAL_UART_Receive(&huart1, (uint8_t *)&recBuffer[strEsp8266_Fram_Record.InfBit.FramLength], 1, 100) == HAL_OK) {
            strEsp8266_Fram_Record.InfBit.FramLength++;

            // 检查是否接收到完整的数据包
            if (strEsp8266_Fram_Record.InfBit.FramLength == 12) { // 根据实际数据长度调整
                pRecStr = recBuffer;
                break;
            }
        } else {
            // 处理接收错误,例如重试或忽略错误
        }
    }

    return pRecStr;
}
```

3. 在STM32中调用此函数,并检查接收到的数据是否包含所需的7F 7A值。以下是如何调用函数并检查特定数据的示例:

```c
char *receivedData;
receivedData = ESP8266_ReceiveString(DISABLE);

if (receivedData != NULL) {
    // 检查特定数据
    if (receivedData[6] == 0x7F && receivedData[7] == 0x7A) {
        // 处理7F 7A数据
    }
}
```

请注意,您可能需要根据您的具体需求和硬件配置调整上述代码。希望这些建议能帮助您解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分