c++ - 返回类型为 struct 的函数在每次调用时不返回任何内容

标签 c++ c arduino embedded esp32

我正在编写一个程序,通过 ESP32(Arduino 框架)中的蓝牙接收 SSID 和密码。函数 BTSerialRcvBuffer() 等待蓝牙,当它接收到一个字符串时,它通过一个类型为 struct Buffer_return 的变量返回字符串的基址和大小。该函数返回 SSID 但不返回密码。我不知道为什么?我是否必须为 Var.rtn_addr 分配内存或为变量 buff1 和 buff2 分配足够的内存?

#include <Arduino.h>
#include <stdlib.h>
#include <BluetoothSerial.h>
#include <WiFi.h>

#define btrcv_buffer_size 256

BluetoothSerial SerialBT;

typedef struct
{
  char *rtn_addr;
  int buff_len;
} Buffer_return;


Buffer_return* BTSerialRcvBuffer() {

  static int i = 0;
  static char rcv_buffer[ btrcv_buffer_size ];
  static Buffer_return Var;

  memset(rcv_buffer,0, btrcv_buffer_size);

  while (!SerialBT.available());
  delayMicroseconds(500);

  while(SerialBT.available()) {
    rcv_buffer[i] = SerialBT.read();
    i++;
  }
  rcv_buffer[i-1] = '\0';
  rcv_buffer[i-2] = '\0';
  SerialBT.flush();

  Var.rtn_addr = rcv_buffer;  //<------------Do I have to allocate memory for Var.rtn_addr?
  Var.buff_len = i-1;

  return &Var;
} 

void WiFiConfig() {

  //WiFi.printDiag(Serial);

  Serial.println("Enter SSID");
  Buffer_return *buff1 = BTSerialRcvBuffer();
  char *ssid = (char*) malloc((buff1->buff_len) * sizeof(char));  
  strcpy(ssid,buff1->rtn_addr);
  Serial.println(ssid);  

  Serial.println("Enter Password");
  Buffer_return *buff2 = BTSerialRcvBuffer();
  char *pass = (char*) malloc((buff2->buff_len) * sizeof(char));  
  strcpy(pass,buff2->rtn_addr);
  Serial.println(pass); 
  //Serial.println(buff2->buff_len);  


  free(ssid)
  free(pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Establishing connection to WiFi..");
    Serial.printf("Connection status: %d\n", WiFi.status());
  }  
}

void setup() {

  Serial.begin(115200);
  //WiFi.disconnect(true);
  SerialBT.begin("ESP32_INO"); //Bluetooth device name
  WiFi.mode(WIFI_STA);
  Serial.println("The device started, now you can pair it with bluetooth!");

  WiFiConfig();

  Serial.println("Connected to network");
  Serial.println(WiFi.macAddress());
  Serial.println(WiFi.localIP());
}

void loop() {

  }

输出:

Enter SSID
Airtel_5G             <----- prints fine!
Enter Password
                      <----- Problem!
Establishing connection to WiFi..
Connection status: 6
Establishing connection to WiFi..
Connection status: 6
Establishing connection to WiFi..
Connection status: 6

最佳答案

代码使用以下序列将输入数据复制到缓冲区。

  Buffer_return *buff1 = BTSerialRcvBuffer();
  char *ssid = (char*) malloc((buff1->buff_len) * sizeof(char));  
  strcpy(ssid,buff1->rtn_addr);

回想一下,字符串以 NUL 结尾,因此分配必须包括额外的字节!。对 malloc 调用的简单更新:

char *ssid = (char*) malloc((buff1->buff_len+1) * sizeof(char));

根据@lundin 的输入,不建议 Arduino 使用 malloc。最好使用自动分配。

另请参阅:https://arduino.stackexchange.com/questions/682/is-using-malloc-and-free-a-really-bad-idea-on-arduino

  char ssid[buff2->buff_len+1] ;
  strcpy(ssid, buff2->rtn_addr) ;

更新 1:BTSerialRcvBuffer 错误

BTSerialRcvBuffer 对许多变量使用静态,包括 i。回想一下,静态变量只初始化一次(在程序启动时)。建议从 i 中删除“static” - 以修复初始化,因为没有必要将其设为静态。

此外,还不清楚为什么 rcv_buffer 的最后 2 个位置重置为零?

关于c++ - 返回类型为 struct 的函数在每次调用时不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58796142/

相关文章:

c++ - ESP32-AsyncUDP 自带的 udp.onPacket 处理函数

c++ - Linux 上写入共享内存时出现周期性延迟峰值

c++ - 如何将模板从 C++ 转换为 C

c - C 中两个长整型相加

int 的 C 命令行参数

arduino - Arduino 的 WinUSB 驱动程序

c++ - 如何在 C 中模拟构造函数和析构函数行为(针对特定数据类型)

c++ - React Native 0.59 应用程序因 libc 错误而崩溃

c - GTK 默认文件->退出行为

c++ - 将数据从 GPS 传输到 SIGFOX