Image 通过UART&;从ESP32-CAM向Arduino发送图片;劳拉

Image 通过UART&;从ESP32-CAM向Arduino发送图片;劳拉,image,arduino,uart,esp32,arduino-esp32,Image,Arduino,Uart,Esp32,Arduino Esp32,我想通过UART从ESP32-CAM向Arduino Uno发送一张照片,然后将我收到的照片从Uno发送到另一个带有LoRa的Uno。我计划使用的方法是从串行监视器中获取加密的图片代码。如果有更好的方法,我愿意接受新的 首先,问题是有效载荷的格式,它是如何加密的。在我的代码中,我从图片中得到了两种不同的输出,JPEG(我不确定)和十六进制(你会看到,这一种也很奇怪)。当我试图读取这些加密代码时,无法解码和打开图片 所以我想找到一个更好的方式发送。实际上我还没有决定我会用哪种方式。它也可以是Bas

我想通过UART从ESP32-CAM向Arduino Uno发送一张照片,然后将我收到的照片从Uno发送到另一个带有LoRa的Uno。我计划使用的方法是从串行监视器中获取加密的图片代码。如果有更好的方法,我愿意接受新的

首先,问题是有效载荷的格式,它是如何加密的。在我的代码中,我从图片中得到了两种不同的输出,JPEG(我不确定)和十六进制(你会看到,这一种也很奇怪)。当我试图读取这些加密代码时,无法解码和打开图片

所以我想找到一个更好的方式发送。实际上我还没有决定我会用哪种方式。它也可以是Base64或十六进制

因此,我的问题是:

1-)从串行监视器拍摄照片是一种好方法吗?在我提到的事情之间,你更喜欢用哪种方式发送图片

2-)哪种编码方式最容易传输图片

3-)在我下面添加的代码中,我可以得到JPEG和HEX。当我用CoolTerm软件录制最后一部分时,我很高兴能看到图片。但如果我用UART发送给Uno,我就无法解码。这可能是因为通信问题。最安全、最简单的发送方式是什么

4-)在代码中,我不能使用十六进制输出。它有点不同于其他十六进制加密的图片。为什么以及如何使用它

这是我的密码:

#include "esp_camera.h"
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
#include "driver/rtc_io.h"
#include "img_converters.h" // https://github.com/espressif/esp32camera/blob/master/conversions/include/img_converters.h

#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27

#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22


size_t jpgCallBack(void * arg, size_t index, const void* data, size_t len)
{
  uint8_t* basePtr = (uint8_t*) data;
  for (size_t i = 0; i < len; i++) {
  Serial.write(basePtr[i]);
 }
return 0;
}

void setup() {

WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);

Serial.begin(115200);

camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_GRAYSCALE;

if (psramFound()) {
  config.frame_size = FRAMESIZE_QQVGA; // QQVGA|QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
  config.fb_count = 2;
 } 
else {
  Serial.println(F("PSRAM NOT FOUND"));
  return;
}

esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
  Serial.printf("CAMERA ERROR 0x%x", err);
  return;
}

camera_fb_t * fb = NULL;

Serial.print("5 SEC TO PHOTO");
delay(5000);

fb = esp_camera_fb_get();

if (!fb) {
Serial.print("ERROR WHILE TAKING PHOTO");
return;
}

Serial.printf("\nWidht = %u, Height=%u\n", fb->width, fb->height);

for (size_t i = 0; i < fb->len; i++)
{
if (i % 16 == 0) Serial.printf("\n%06u\t", i);
if (fb->buf[i] < 0x10) Serial.write('0');
Serial.print(fb->buf[i], HEX);
}

Serial.print("\n\nSTART RECORDING\n\n");
delay(5000);

frame2jpg_cb(fb, 10, jpgCallBack, NULL); // https://github.com/espressif/esp32-camera/blob/b02992a5b88571bdad0660ee652a620aaabc994a/conversions/include/img_converters.h#L54

esp_camera_fb_return(fb);
}

void loop() {}
#包括“esp_camera.h”
#包括“soc/soc.h”
#包括“soc/rtc\u cntl\u reg.h”
#包括“驱动程序/rtc_io.h”
#包括“img\U转换器.h”//https://github.com/espressif/esp32camera/blob/master/conversions/include/img_converters.h
#定义PWDN\u GPIO\u NUM 32
#定义RESET\u GPIO\u NUM-1
#定义XCLK\u GPIO\u NUM 0
#定义SIOD_GPIO_NUM 26
#定义SIOC_GPIO_数量27
#定义Y9_GPIO_数量35
#定义Y8_GPIO_数量34
#定义Y7_GPIO_数量39
#定义Y6_GPIO_数量36
#定义Y5_GPIO_NUM 21
#定义Y4_GPIO_数量19
#定义Y3_GPIO_数量18
#定义Y2\u GPIO\u数量5
#定义VSYNC\u GPIO\u NUM 25
#定义HREF\u GPIO\u NUM 23
#定义PCLK\U GPIO\U编号22
大小jpgCallBack(无效*参数、大小索引、常量无效*数据、大小长度)
{
uint8_t*basePtr=(uint8_t*)数据;
对于(大小i=0;iwidth,fb->Height);
对于(大小i=0;ilen;i++)
{
如果(i%16==0)Serial.printf(“\n%06u\t”,i);
如果(fb->buf[i]<0x10)串行写入('0');
串行打印(fb->buf[i],十六进制);
}
Serial.print(“\n\n开始录制\n\n”);
延迟(5000);
frame2jpg_cb(fb,10,jpgCallBack,NULL);//https://github.com/espressif/esp32-camera/blob/b02992a5b88571bdad0660ee652a620aaabc994a/conversions/include/img_converters.h#L54
esp_摄像头_fb_返回(fb);
}
void loop(){}
这是我的串行监视器输出,两个都来自Arduino Uno。数据通过UART从ESP32-CAM获取


LoRa设计用于发送非常短的数据,以换取远距离和电池寿命的好处。它不是用于发送图像的应用程序。