4

我希望有人可以帮助我诊断出我正在经历的这种奇怪行为。我正在为 Arduino Due 编程并使用Adafruit FONA 调制解调器。有问题的代码提交要通过调制解调器发送的字节数组。sendData正在服用unsigned char[]我投到的void*data_len是写入缓冲区的字节数,而不是缓冲区本身的大小。

我正在使用的电路板不使用 printf/sprintf 打印到标准输出。相反,这是使用Serial.printand完成的Serial.printlnSerial这是一个 Arduino 类,而不是标准的 C++ 类。sprintf_ByteArray我写来检查字节缓冲区的内容,结果反映为十六进制字节。

正如我提到的,我的最终目标是将数据写入调制解调器。这是在fonaSerial->printlnandfonaSerial->write调用中完成的。第一个发出调制解调器命令,其中包含要写入的数据大小。第二个写入数据。

但我正在经历一些棘手的事情。打印结果data如下String message所示。对我来说莫名其妙,message只包含data. 起初,这并没有让我感到惊讶,因为data它包含空字节,我认为这些都是罪魁祸首。但是,message实际上包括空字节!而且,我本来希望message代表 的前 N ​​个字节data,直到第一个空字节。

最后:我以转换data为 auint8_t*并传递给fonaSerial->write. 最初我一直在传递一个字符串,但在我遇到问题后,我决定尝试这种替代方法。然后我将此数据发送到我正在运行的服务器。服务器也仅获得 119 字节的有效负载。

作为记录,早些时候我成功发送了一个较小的有效载荷。我不知道我现在在做什么导致问题。

bool sendData(void *data, size_t data_len) {    
  char tmp[1024] = {0};
  Serial.print("data_len=");Serial.println(data_len);
  sprintf_ByteArray(tmp, (unsigned char*) data, data_len);
  Serial.print("Payload (void*)=");Serial.println(tmp);
  String message = (const char*) data;
  Serial.print("Payload (String)=");Serial.println(message);

  fonaSerial->print(F("AT+CIPSEND="));
  fonaSerial->println(data_len);

  fona.readline(3000);
  fonaSerial->write((uint8_t*) data, data_len);
  fonaSerial->flush();

  fona.readline(3000); // wait up to 3 seconds to send the data
  Serial.print (F("\t<--- ")); Serial.println(fona.replybuffer);

  return (strcmp(fona.replybuffer, "SEND OK") == 0);
}

Payload (void*)= 8a a5 62 69 64 00 69 63 6f 6e 64 69 74 69 6f 6e 01 67 62 61 74 74 65 72 79 18 1d 65 73 74 61 74 65 02 69 74 69 6d 65 73 74 61 6d 70 19 0f 95 a5 62 69 64 01 69 63 6f 6e 64 69 74 69 6f 6e 01 67 62 61 74 74 65 72 79 18 42 65 73 74 61 74 65 62 69 74 69 6d 65 73 74 61 6d 70 19 0f 97 a5 62 69 64 02 69 63 6f 6e 64 69 74 69 6f 6e 00 67 62 61 74 74 65 72 79 18 29 65 73 74 61 74 65 06 69 74 69 6d 65 73 74 61 6d 70 19 0f 98 a5 62 69 64 03 69 63 6f 6e 64 69 74 69 6f 6e 01 67 62 61 74 74 65 72 79 18 26 65 73 74 61 74 65 01 69 74 69 6d 65 73 74 61 6d 70 19 0f 99 a5 62 69 64 04 69 63 6f 6e 64 69 74 69 6f 6e 01 67 62 61 74 74 65 72 79 18 2f 65 73 74 61 74 65 62 69 74 69 6d 65 73 74 61 6d 70 19 0f 9a a5 62 69 64 05 69 63 6f 6e 64 69 74 69 6f 6e 01 67 62 61 74 74 65 72 79 18 1d 65 73 74 61 74 65 06 69 74 69 6d 65 73 74 61 6d 70 19 0f 9c a5 62 69 64 18 42 69 63 6f 6e 64 69 74 69 6f 6e 18 75 67 62 61 74 74 65 72 79 18 69 65 73 74 61 74 65 18 6c 69 74 69 6d 65 73 74 61 6d 70 1a 67 6e 69 64 a5 62 69 64 18 20 69 63 6f 6e 64 69 74 69 6f 6e 18 6c 67 62 61 74 74 65 [72 79 18 6f 65 73 74 61 74 65 18 74 69 74 69 6d 65 73 74 61 6d 70 1a 00 6e 39 20 a5 62 69 64 62 69 63 6f 6e 64 69 74 69 6f 6e 00 67 62 61 74 74 65 72 79 18 40 65 73 74 61 74 65 74 69 74 69 6d 65 73 74 61 6d 70 19 0f a0 a5 62 69 64 74 69 63 6f 6e 64 69 74 69 6f 6e 00 67 62 61 74 74 65 72 79 18 43 65 73 74 61 74 65 74 69 74 69 6d 65 73 74 61 6d 70 19 0f a1]

长度 471

Payload (String)= 72 79 18 6f 65 73 74 61 74 65 18 74 69 74 69 6d 65 73 74 61 6d 70 1a 00 6e 39 20 a5 62 69 64 62 69 63 6f 6e 64 69 74 69 6f 6e 00 67 62 61 74 74 65 72 79 18 40 65 73 74 61 74 65 74 69 74 69 6d 65 73 74 61 6d 70 19 0f a0 a5 62 69 64 74 69 63 6f 6e 64 69 74 69 6f 6e 00 67 62 61 74 74 65 72 79 18 43 65 73 74 61 74 65 74 69 74 69 6d 65 73 74 61 6d 70 19 0f a1

长度 119

4

1 回答 1

0

试试这个'to_string'转换器:

String to_string(unsigned char *data,unsigned int len){
    String memtmp="";
    unsigned char tmpdata;
    for(unsigned int i=0;i<len;i++){
        tmpdata=*(data+i);
        memtmp+=String(tmpdata,HEX);
        memtmp+=" ";
    }
    return memtmp;
}

我希望这会有所帮助。祝你好运!

于 2020-04-16T11:40:36.433 回答