如何将 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' 的想法并不好,因为您如何知道您的数据实际上是否包含0x000x30? 在这两种情况下您都会看到'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的主要内容,如果未能解决你的问题,请参考以下文章

利用ESP32构造一个ZIGBEE的网络发送转接

esp32和php XXTEA字符串加密

ESP8266无法接收来自单片机发送的AT指令,

ESP32 TCP客户端

Android + ESP32 通过蓝牙 (BLE) 发送数据

ESP8266图传功能:通过UDP给esp8266发送图片数据并显示