OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1361|回复: 0

求助!基于F429+OV5640+esp8266的无线图传

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2023-11-12
在线时间
5 小时
发表于 2023-11-26 00:19:50 | 显示全部楼层 |阅读模式
5金钱
最近根据原子哥的例程弄了一个摄像头图像采集和图像无线传输

为了提高传输速度,已经将esp8266的波特率改成了2mhz,且图像采集使用jpeg压缩格式
并选择了支持的最小图像大小,单个图像5-10kb,但是使用原子哥的网络摄像头软件测试的时候,画面依旧卡顿

希望大伙可以帮忙看看
  1. #include "demo.h"
  2. #include "./BSP/ATK_MC5640/atk_mc5640.h"
  3. #include "./BSP/ATK_MC5640/atk_mc5640_dcmi.h"
  4. #include "./BSP/ATK_MW8266D/atk_mw8266d.h"
  5. #include "./SYSTEM/usart/usart.h"
  6. #include "./SYSTEM/delay/delay.h"
  7. #include "./BSP/LED/led.h"
  8. #include "./BSP/KEY/key.h"
  9. #include "./BSP/LCD/lcd.h"
  10. #include "string.h"


  11. #define JPEG_OUTPUT_WIDTH  160 //320
  12. #define JPEG_OUTPUT_HEIGHT 120 //240
  13. #define JPEG_BUF_SIZE  (20*1024)
  14. uint32_t g_jpeg_buf[JPEG_BUF_SIZE / sizeof(uint32_t)];


  15. #define DEMO_WIFI_SSID          "Xiaomi 12S Pro"
  16. #define DEMO_WIFI_PWD           "88888888"
  17. #define DEMO_TCP_SERVER_IP      "192.168.37.84"
  18. #define DEMO_TCP_SERVER_PORT    "8080"


  19. static void demo_show_ip(char *buf)
  20. {
  21.     printf("IP: %s\r\n", buf);
  22.     lcd_show_string(60, 151, 128, 16, 16, buf, BLUE);
  23. }


  24. static void Receivedata()
  25. {
  26.     uint8_t *buf;

  27.         buf = atk_mw8266d_uart_rx_get_frame();
  28.         if (buf != NULL)
  29.         {
  30.             printf("%s", buf);
  31.             atk_mw8266d_uart_rx_restart();
  32.         }
  33. }

  34. void ErrLight(){
  35.         while (1)
  36.         {
  37.             LED0_TOGGLE();
  38.             delay_ms(200);
  39.         }
  40. }

  41. void send_image_data_via_uart(const uint32_t *image_data, uint32_t length)
  42. {
  43.   atk_mw8266d_uart_send_data((const uint8_t *)image_data, length);
  44. }

  45. void demo_run(void)
  46. {
  47.           uint8_t *p_jpeg_buf;
  48.     uint32_t jpeg_len;
  49.     uint32_t jpeg_index;
  50.     uint32_t jpeg_start_index;
  51.     uint32_t jpeg_end_index;
  52.         
  53.     uint8_t ret;
  54.     char ip_buf[16];

  55.     ret = atk_mw8266d_init(2000000);//2000000 921600 115200
  56.     if (ret != 0)
  57.     {
  58.         printf("ATK-MW8266D init failed!\r\n");
  59.                         ErrLight();
  60.     }
  61.    
  62.     printf("Joining to AP...\r\n");
  63.     //ret  = atk_mw8266d_restore();
  64.     ret += atk_mw8266d_at_test();
  65.     ret += atk_mw8266d_set_mode(1);
  66.     ret += atk_mw8266d_sw_reset();
  67.     ret += atk_mw8266d_ate_config(0);
  68.     ret += atk_mw8266d_join_ap(DEMO_WIFI_SSID, DEMO_WIFI_PWD);
  69.                 //ret += atk_mw8266d_changebaudrate(2000000);
  70.     ret += atk_mw8266d_get_ip(ip_buf);
  71.     if (ret != 0)
  72.     {
  73.         printf("Error to join ap!\r\n");
  74.         ErrLight();
  75.     }
  76.     demo_show_ip(ip_buf);  
  77.    
  78.                 ret = atk_mw8266d_connect_tcp_server(DEMO_TCP_SERVER_IP, DEMO_TCP_SERVER_PORT);
  79.     if (ret != 0){
  80.       printf("Error to connect Service!\r\n");
  81.                   ErrLight();
  82.     }

  83.     atk_mw8266d_uart_rx_restart();
  84.                
  85.                 ret = atk_mw8266d_enter_unvarnished();
  86.                 if (ret != 0){
  87.       printf("Error to enter Unvarnished!\r\n");
  88.                   ErrLight();
  89.     }
  90.                
  91.                 ret  = atk_mc5640_init();
  92.     ret += atk_mc5640_set_output_format(ATK_MC5640_OUTPUT_FORMAT_JPEG);
  93.     ret += atk_mc5640_auto_focus_init();
  94.     ret += atk_mc5640_auto_focus_continuance();
  95.     ret += atk_mc5640_set_light_mode(ATK_MC5640_LIGHT_MODE_ADVANCED_AWB);
  96.     ret += atk_mc5640_set_color_saturation(ATK_MC5640_COLOR_SATURATION_4);
  97.     ret += atk_mc5640_set_brightness(ATK_MC5640_BRIGHTNESS_4);
  98.     ret += atk_mc5640_set_contrast(ATK_MC5640_CONTRAST_4);
  99.     ret += atk_mc5640_set_hue(ATK_MC5640_HUE_6);
  100.     ret += atk_mc5640_set_special_effect(ATK_MC5640_SPECIAL_EFFECT_NORMAL);
  101.     ret += atk_mc5640_set_exposure_level(ATK_MC5640_EXPOSURE_LEVEL_5);
  102.     ret += atk_mc5640_set_sharpness_level(ATK_MC5640_SHARPNESS_OFF);
  103.     ret += atk_mc5640_set_mirror_flip(ATK_MC5640_MIRROR_FLIP_1);
  104.     ret += atk_mc5640_set_test_pattern(ATK_MC5640_TEST_PATTERN_OFF);
  105.     ret += atk_mc5640_set_output_size(JPEG_OUTPUT_WIDTH, JPEG_OUTPUT_HEIGHT);
  106.     if (ret != 0)
  107.     {
  108.       printf("ATK-MC5640 init failed!\r\n");
  109.                         ErrLight();
  110.     }
  111.                
  112.                                 
  113.     while (1)
  114.     {
  115.                                   p_jpeg_buf = (uint8_t *)g_jpeg_buf;
  116.                 jpeg_len = JPEG_BUF_SIZE / (sizeof(uint32_t));
  117.         
  118.                 memset((void *)g_jpeg_buf, 0, JPEG_BUF_SIZE);
  119.                
  120.                 atk_mc5640_get_frame((uint32_t)g_jpeg_buf, ATK_MC5640_GET_TYPE_DTS_32B_INC, NULL);
  121.                
  122.                 /*
  123.                 for (jpeg_start_index = UINT32_MAX, jpeg_index = 0; jpeg_index < JPEG_BUF_SIZE - 1; jpeg_index++)
  124.                 {
  125.                     if ((p_jpeg_buf[jpeg_index] == 0xFF) && (p_jpeg_buf[jpeg_index + 1] == 0xD8))
  126.                     {
  127.                         jpeg_start_index = jpeg_index;
  128.                         break;
  129.                     }
  130.                 }
  131.                 if (jpeg_start_index == UINT32_MAX)
  132.                 {
  133.                     continue;
  134.                 }
  135.                                                                 */
  136.                                                                
  137.                 jpeg_start_index=0;
  138.                 for (jpeg_end_index = UINT32_MAX, jpeg_index = jpeg_start_index; jpeg_index < JPEG_BUF_SIZE - 1; jpeg_index++)
  139.                 {
  140.                     if ((p_jpeg_buf[jpeg_index] == 0xFF) && (p_jpeg_buf[jpeg_index + 1] == 0xD9))
  141.                     {
  142.                         jpeg_end_index = jpeg_index;
  143.                         break;
  144.                     }
  145.                 }
  146.                 if (jpeg_end_index == UINT32_MAX)
  147.                 {
  148.                     continue;
  149.                 }
  150.                                                                 if(jpeg_end_index<=jpeg_start_index+10){
  151.                                                                         continue;
  152.                                                                 }

  153.                 jpeg_len = jpeg_end_index - jpeg_start_index + (sizeof(uint32_t) >> 1);
  154.                                                                 send_image_data_via_uart(g_jpeg_buf, jpeg_len);
  155.         
  156.                                 Receivedata();
  157.                                 
  158.         //delay_ms(2);
  159.     }
  160. }
复制代码

其中,atk_mw8266d_uart_send_data 函数是我根据atk_mw8266d_uart_printf函数改的,代码:
  1. void atk_mw8266d_uart_send_data(const uint8_t *data, uint16_t len)
  2. {
  3.     HAL_UART_Transmit(&g_uart_handle, data, len, HAL_MAX_DELAY);
  4. }
复制代码

我还把发送缓冲区大小ATK_MW8266D_UART_TX_BUF_SIZE从默认的64改成了64000,但是不知道为什么摄像头软件调试卡顿明显

还有一个不明白的地方就是,esp8266可以正常连接到网络调试助手或者网络摄像头软件创建的tcp service,但是我自己用nodejs创建的tcp service,就无法连接上
已经确认node代码创建的tcp service没问题,这个service可以被网络调试助手作为client正常连接
这个是tcp service的代码:
  1. const net = require('net');

  2. let PORT = '8080';
  3. let HOST = '192.168.37.84';

  4. const server = net.createServer((socket) => {

  5.     socket.on('data', (data) => {
  6.         console.log('接收到的数据:', data.toString());
  7.     });

  8.     socket.on('end', () => {
  9.         console.log('STM32已断开连接');
  10.     });

  11.     socket.on('error', (err) => {
  12.         console.error('连接错误:', err);
  13.     });
  14. });

  15. server.listen(PORT, HOST, () => {
  16.     console.log(`服务器运行在 http://${HOST}:${PORT}`);
  17. });
复制代码



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 11:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表