导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    MCU通过以太网(UDP)发送图片到哪吒开发板进行处理

    MR Series
    tina udp 图传 stm32f103 ov2640
    4
    13
    2888
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • aldfaaa
      whycan矿工-小叶 LV 7 最后由 whycan 编辑

      前端时间带实习生的过程中顺带学习了一下F103调OV2640传感器获取图片,顺带把图像通过以太网抛出。MCU采用状态机写法(整理后开源),通过TCP/UDP传输在PC上解包不要太顺利了.(这里要感谢实习生wyr填好的路)
      _-2018208784_20210907_192052_1631013654000_wifi_0.jpg

      Cache_-61b3cb7962535efa..jpg

      接下来,主要想把上位机解包程序移植到哪吒开发板上,目标平台:Tina.

      开源项目

      哪吒开发板实现TCP/UDP图传:
      https://gitee.com/YJHmath/image-transmission-d1-tina

      图传协议:
      https://docs.qq.com/doc/DVkRZUXhSa3prbXZp

      预期需求:

      • JPEG图片输出到HDMI, 或者MIPI.
      • 整合NCNN, 直观看识别效果.
      • 或许会支持更通用(复杂)的PES协议.

      阶段性成果汇报

      2021年9月30日

      HDMI调通

      • 感谢 @anruliu 指出了sdk中显示编码图像文件的工具fbviewer.
      • 感谢 @anruliu 在D1设置hdmi分辨率中9楼指出Tina Linux启动时默认选择MIPI作为显示输出, 并给出了开机默认选择HDMI输出的方案.

      开发过程

      一开始着重快速地把协议移植, 所以我会使用cmake工具在win下qtcreator编写, 在Ubuntu20.10交叉编译.
      开发语言自然是C++和C混着搭. 因为C++有着丰富的轮子,
      程序采用了:

      • 陈硕大佬的muduo网络库(C++)的Buffer类作为接收缓冲区.
      • UNP例程库(C)来做一个简单的UDP Server, 就喜欢它足够简单纯粹.

      这两个库在哪吒上的编译过程可以参考:
      muduo网络库在哪吒上编译
      《Unix网络编程》例程库在哪吒上编译

      技术受限

      一开始我想把接收到的图片一气呵成地输出到HDMI时, 但发现若将fbviewer目录(tina-d1-open/out/d1-nezha/compile_dir/target/fbviewer)下除main.o外的.o文件链接成静态库(.a), 再编译出来的程序无法正常运行:

      root@TinaLinux:/mnt/nfs/tina# ./fbtest
      ./fbtest: line 1: ELF�8@@
                                      : not found
      ./fbtest: line 3: syntax error: EOF in backquote substitution
      

      这是一道坎, 望各位大佬指教.

      寻求解决

      既然验证了链接到静态库存在问题. 那能想到解决思路有3种:

      1. 把已经正常运行的图传程序从C++改成C语言, 直接链接到fbviewer相关的.o文件, 这样程序大概率能正常运行. 但相当于弃盔卸甲, 还要用C把缓存区再造一遍.
      2. 把整个fbviewer里jpeg输出到HDMI的代码搬到图传程序里, 然后笃定地相信它会编译成功.
      3. 不要忘了操作系统扮演协调资源的角色. 图传程序将接收到的图片储存到运行目录下, 然后再魔改一下fbviewer, 通过stat读取运行目录下对应图像文件的最后修改时间有无发生变化来决定是否要通过HDMI输出图像. 这样就不用再纠结高层代码和底层代码之间千丝万缕的关系.

      对于下班的闲暇抽空写码的我, 毫不犹豫地选择了第3种.

      #include <stdio.h>
      #include <stdint.h>
      #include <unistd.h>
      #include <sys/stat.h>
      
      int main()
      {
          printf("Hello world\n");
          char* path = "pic.jpg";
          uint32_t ts = 0;
          struct stat tmp;
          stat(path, &tmp);
         
          uint8_t* image = (uint8_t*)malloc(1600 * 1200 * 3);
          int is_need_output = 0;
          while(1)
          {
              stat(path, &tmp);
              //printf("st_ctime:%d\n", tmp.st_ctime);
              if(ts != tmp.st_ctime)
              {
                  
                  ts = tmp.st_ctime;
                  is_need_output = 1;
              }
              if(is_need_output)
              {
                  fh_jpeg_load(path, image, NULL, 1600, 1200);
                  fb_display(image, NULL, 1600, 1200, 0, 0, 160, 0);
                  is_need_output = 0;
              }
              usleep(25 * 1000);
          }
          free(image);
          return 0;
      }
      

      既然程序需要频繁地读写, 那就直接放到挂载到RAM的目录吧!
      于是乎:

      下一步把ncnn的demo整合应该也不是什么难事.


      效果如上.

      1 条回复 最后回复 回复 引用 分享 1
      • aldfaaa
        whycan矿工-小叶 LV 7 最后由 编辑

        请问大佬指点一下如何将图片通过HDMI输出到屏幕.
        像官方文档HDMI测试指令和视频播放那样.

        xiaowenge 1 条回复 最后回复 回复 引用 分享 0
        • xiaowenge
          DOT小文哥 LV 8 @aldfaaa 最后由 编辑

          @aldfaaa 在 通过TCP/UDP图传到哪吒开发板 中说:

          请问大佬指点一下如何将图片通过HDMI输出到屏幕.
          像官方文档HDMI测试指令和视频播放那样.

          说出来你可能不信,现在没有现成的可以图片的demo,但是播视频的有

          aldfaaa 1 条回复 最后回复 回复 引用 分享 0
          • aldfaaa
            whycan矿工-小叶 LV 7 @xiaowenge 最后由 编辑

            @xiaowenge jpeg转yuv的demo都有了, 输出你们熟悉的肝一下就出来....虽然开源木有钱...

            xiaowenge 1 条回复 最后回复 回复 引用 分享 0
            • xiaowenge
              DOT小文哥 LV 8 @aldfaaa 最后由 编辑

              @aldfaaa 在 通过TCP/UDP图传到哪吒开发板 中说:

              @xiaowenge jpeg转yuv的demo都有了, 输出你们熟悉的肝一下就出来....虽然开源木有钱...

              好 我们想想怎么搞,尽快给出来

              A 1 条回复 最后回复 回复 引用 分享 0
              • A
                anruliu LV 6 @xiaowenge 最后由 编辑

                @aldfaaa 显示的demo是有的

                显示一张bmp/jpg/png的demo在package/utils/fbviewer路径下,命令是

                fbviewer /mnt/UDISK/xx.bmp
                

                显示一张nv21数据的demo在package/utils/yuview,yuview中是的代码是最简单的调用显示接口显示一张裸数据的示例,命令如下

                yuview -format nv21 -size 640 480 -buffer_num 1 -file /mnt/UDISK/pic_nv21_640x480.dat
                
                aldfaaa 2 条回复 最后回复 回复 引用 分享 0
                • aldfaaa
                  whycan矿工-小叶 LV 7 @anruliu 最后由 编辑

                  @anruliu 谢谢!!!第一个指令好像好使!

                  1 条回复 最后回复 回复 引用 分享 0
                  • aldfaaa
                    whycan矿工-小叶 LV 7 @anruliu 最后由 编辑

                    @anruliu 后续: 能否解释一下官方文档给出的HDMI指令的含义?

                    cd /sys/kernel/debug/dispdbg
                    echo disp0 > name; echo switch1 > command; echo 4 10 0 0 0x4 0x101 0 0 0 8 > param; echo 1 > start;
                    

                    使用该命令切换到HDMI输出, 显示只占屏幕的左1/3左右. 只能显示图片的局部.

                    A 1 条回复 最后回复 回复 引用 分享 0
                    • A
                      anruliu LV 6 @aldfaaa 最后由 编辑

                      @aldfaaa 参考下面的链接
                      https://bbs.aw-ol.com/topic/77/d1设置hdmi分辨率

                      按照帖子最后修改uboot-board.dts中的参数即可

                      1 条回复 最后回复 回复 引用 分享 0
                      • aldfaaa
                        whycan矿工-小叶 LV 7 最后由 编辑

                        捞一下, 目前项目已经进展到在哪吒上接收协议帧

                        wqdwqd.jpg

                        166d757b-7df3-481a-9bd7-7689eb43d4b2-image.png

                        1 条回复 最后回复 回复 引用 分享 0
                        • aldfaaa
                          whycan矿工-小叶 LV 7 最后由 编辑

                          阶段性进展, 再捞一下

                          1 条回复 最后回复 回复 引用 分享 0
                          • aldfaaa
                            whycan矿工-小叶 LV 7 最后由 编辑

                            即将开源硬石F1 PRO开发板(F103)图传源码.

                            1 条回复 最后回复 回复 引用 分享 0
                            • SdtEE
                              SdtEE LV 4 最后由 编辑

                              还有一个tina自带的命令dfbshow也可以显示图片。dfbshow后跟图片路径即可

                              1 条回复 最后回复 回复 引用 分享 0
                              • 1 / 1
                              • First post
                                Last post

                              Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

                              行为准则 | 用户协议 | 隐私权政策