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

从Arduino上的void*强制转换字节截断,arduino,arduino-due,Arduino,Arduino Due,我希望有人能帮我诊断我正在经历的这种奇怪的行为。我正在为Arduino进行编程,并使用。该代码提交一个字节数组,通过调制解调器发送sendData正在接受一个unsigned char[],我将其转换为void*data\u len是写入缓冲区的字节数,而不是缓冲区本身的大小 我正在使用的板不使用printf/sprintf打印到标准输出。而是使用Serial.print和Serial.println完成系列< /代码>这里是一个ARDUIO类,而不是标准C++类。代码>sprintf_Byte

我希望有人能帮我诊断我正在经历的这种奇怪的行为。我正在为Arduino进行编程,并使用。该代码提交一个字节数组,通过调制解调器发送
sendData
正在接受一个
unsigned char[]
,我将其转换为
void*
data\u len
是写入缓冲区的字节数,而不是缓冲区本身的大小

我正在使用的板不使用printf/sprintf打印到标准输出。而是使用
Serial.print
Serial.println
完成<代码>系列< /代码>这里是一个ARDUIO类,而不是标准C++类。代码>sprintf_ByteArray我写这篇文章是为了检查字节缓冲区的内容,结果反映为十六进制字节

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

但我正在经历一些疯狂的事情。下面显示打印
数据
字符串消息
的结果。令我费解的是,
消息
只包含最后119字节的
数据
。起初,这并不让我感到惊讶,因为
数据
包含空字节,我认为这些都是原因。但是,
消息
实际上包含空字节!而且,我希望
消息
表示
数据
的前N个字节,直到第一个空字节

最后:我将
数据
转换为
uint8\u t*
并传递到
fonaSerial->write
。起初,我一直在传递一根弦,但在我投法有困难后,我决定尝试这种替代大头钉。然后我将这些数据发送到正在运行的服务器。服务器也只能获得119字节的有效负载

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

boolsenddata(void*data,size\t data\u len){
char tmp[1024]={0};
Serial.print(“data_len=”);Serial.println(data_len);
sprintf_ByteArray(tmp,(无符号字符*)数据,数据长度);
Serial.print(“有效载荷(void*)=”;Serial.println(tmp);
字符串消息=(常量字符*)数据;
Serial.print(“有效负载(字符串)=”);Serial.println(消息);
基金会->打印(F(“AT+CIPSEND=”);
基金会->打印(数据);
fona.readline(3000);
基金会->写入((uint8_t*)数据,数据长度;
基金会->同花顺();
readline(3000);//最多等待3秒以发送数据

Serial.print(F(“\t尝试此“到字符串”转换器:

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;
}
字符串到_字符串(无符号字符*数据,无符号整数){
字符串memtmp=“”;
无符号字符tmpdata;

对于(无符号整数i=0;i@Olaf事实上,它是C++的。IDE在将它发送到AVR GCC之前,将代码封装在一些其他的标题和东西中。使用AVR GCC和你自己的程序员芯片完全可以使用ARDUIO代码。这有点麻烦,但我以前已经做过了。“克里斯,我不知道,但是它能在那里吗?”在打印过程中,缓冲区是否在读取数据之前就被填满了?在这种情况下,我希望通过长时间的写入将最新信息填充到较早的数据中。例如,如果您通过串行方式发送数据,但在数据到达时不立即读取数据,串行缓冲区可能会充当队列,并且在数据填满时丢弃旧的“是”。如果我T是C或C++标记的,所以它会增加可视性。在我看来,有3个方面要研究。首先,如果字符串对象正在正确构建。字符串类是否具有“长度”或“大小”?“属性/函数?结果是否符合预期?第二个方面是Serial.println是否将字符串的值正确发送到串行端口。手动构造一个类似长度的字符串,并使用相同的代码打印它(代替当前打印字符串以保持一致性的代码).最后,如上所述,串行输出的缓冲区可能已满并正在转储数据。请尝试删除发送void*数据的第一个……print,然后查看字符串是否按预期打印。缓冲区可能是问题所在。您说119字节是奇数,但您正在向Serial.print发送1800多字节的数据(如果您包含的输出几乎是逐字的)。可能有一个1024字节的缓冲区,其中一些缓冲区在尝试第二次打印之前被清空。