如何将 0 值发送到 ESP8266/arduino
Posted
技术标签:
【中文标题】如何将 0 值发送到 ESP8266/arduino【英文标题】:How to send 0 value to ESP8266/arduino 【发布时间】:2021-11-26 13:32:11 【问题描述】:我必须通过串行方式将 jpeg 从 uart 发送到 esp8266,jpeg 在某些地方有 0 值,如果我按原样发送零,接收到的帧包含零之前的字符,所以我要做的是我发送一个“0”(0x30 ascii 代码)而不是一个零,
如你在merge的图片上看到的,右边是我收到的jpeg,左边是正常的jpeg,看看上面的第五个字节,你会看到区别!
我不能那样工作我真的很想发送 char[i]= 0 并接收它
我也给你我的发送代码:
for (i=0;i<244;i++)
if (Storage_ReadWrite_Buffer[i]!=0)
sprintf(Storage_ReadWrite_Buffer[i],"%c", Storage_ReadWrite_Buffer[i]);
else
Storage_ReadWrite_Buffer[i] = '0';
//sprintf(Storage_ReadWrite_Buffer[i],"%d", Storage_ReadWrite_Buffer[i]);
RS485_Send_CHAN_A("<",1);
RS485_Send_CHAN_A(Storage_ReadWrite_Buffer,244);
// RS485_Send_CHAN_A(">",1);
RS485_Send_CHAN_A("\0",1);
这是 esp 中获取数据的代码:
void loop()
recvWithStartEndMarkers();
showNewData();
void recvWithStartEndMarkers()
static boolean recvInProgress = false;
static int ndx = 0;
char startMarker = '<';
char endMarker = '>';
char rc;
while (Serial.available() > 0 && newData == false)
rc = Serial.read();
//delay(5);
if (recvInProgress == true)
if (rc != endMarker)
receivedChars[ndx] = rc;
compteur++;
ndx++;
if (ndx >= numChars-1)
ndx = 0;
else
receivedChars[ndx] = '\0'; // terminate the string
//Serial.println(ndx,DEC);
recvInProgress = false;
ndx = 0;
//publish_image();
newData = true;
else if (rc == startMarker)
recvInProgress = true;
for(int comp;comp<6000;comp++)
receivedChars[comp] = 0;
void showNewData()
if (newData == true)
Serial.print("This just in ... ");
Serial.println(receivedChars);
//Serial.println(receivedChars[4],HEX);
newData = false;
publish_image();
merge
【问题讨论】:
我无法跟随你。如果你发送一个 0,你会收到一个 0。你到底为什么要把它变成 0x30? “在零之前包含字符”是什么意思? 如果我发送 ttt0ppp 我不会收到 0,我把它放在 char tab[] ans 然后当我在 esp 中打印(tab)时我只看到“ttt” 我必须发送 ttt0x30ppp 才能接收 ttt0ppp 【参考方案1】:如果我发送 ttt0ppp 我不会收到 0,我把它放在 char tab[] ans 然后 当我在 esp 中打印(标签)时,我只看到“ttt”
您发送0
并收到0
。这不是问题。
问题是无法打印。
您发送'0'
的想法并不好,因为您如何知道您的数据实际上是否包含0x00
或0x30?
在这两种情况下您都会看到'0'
。
不是每个数字都代表一个可打印的字符。见https://www.asciitable.com/
C 字符串也是以零结尾的。这意味着如果您打印由 char 指针给出的字符串,它将打印每个字符,直到第一个 0x00
。这样您就不必提供长度。
这个问题的实际解决方案是打印一个人类可读的表格。有很多方法。只需谷歌char array to hex
How do you convert a byte array to a hexadecimal string in C?
并确保发送实际值。不是一些字符串表示。
【讨论】:
非常感谢你的回答,真的很有帮助,但是我真的不在乎打印我想要的是什么,通过mqtt发送框架,通过pyhton脚本接收它并写图片!跨度> 好的,我将 sprintf 更改为: sprintf(Storage_ReadWrite_Buffer[i],"%02X", Storage_ReadWrite_Buffer[i]);但它仍然不起作用,它打印字符直到第一个 0x00 这不是您使用 sprintf 的方式... sprintf(str, format, ...) 会将格式化的字符串放入缓冲区 str。您不能就地执行此操作。还有为什么你首先需要sprintft?如果你想通过串口发送图像,发送它的字节。不是一些字符串表示。 我不明白如何发送它“bytes” storage_read_Write_buffer”是 char 类型,所以它也是 byte 。 当我只发送 storage_buffer 它也不起作用,它会打印到 0x00以上是关于如何将 0 值发送到 ESP8266/arduino的主要内容,如果未能解决你的问题,请参考以下文章