从Arduino上的void *转换字节截断

时间:2015-09-22 22:10:56

标签: arduino arduino-due

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

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

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

但我正在经历一些棘手的事情。打印dataString message的结果如下所示。令我感到不安的是,message只包含data的最后119个字节。起初,这并不让我感到惊讶,因为data包含空字节,我认为那些是某种程度上的责任。但是,message实际上包含空字节!并且,我希望message代表data的前N个字节,直到第一个空字节。

最后:我最后将data投射到uint8_t*并传递给fonaSerial->write。最初我一直在传递一个String但是在我遇到麻烦后我决定尝试这种替代方法。然后我将此数据发送到我正在运行的服务器。服务器也只获得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

1 个答案:

答案 0 :(得分: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;
}

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

相关问题