从Arduino上的void*强制转换字节截断
我希望有人能帮我诊断我正在经历的这种奇怪的行为。我正在为Arduino进行编程,并使用。该代码提交一个字节数组,通过调制解调器发送从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
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字节的缓冲区,其中一些缓冲区在尝试第二次打印之前被清空。