使用树莓派3B通过HDMI播放视频。并且使用串口去控制播放哪个视频。

1. 问题解耦

单片机串口控制树莓派3B播放视频? = 树莓派播放视频 + 单片机串口传参控制树莓派

  • 树莓派播放视频:树莓派播放视频,并且能用串口这种简单的通信方式去控制。应该是需要安装一个,只要命令行就可以控制的视频播放器。这里我们选用omxplayer。
  • 单片机串口传参控制树莓派:树莓派使用串口通信,解析串口消息帧,解析出视频编号,传入 omxplayer的命令行。这里我们使用 wiringPi库的串口函数,去进行串口消息的解析。解析出视频编号后,调用命令行,控制树莓派播放视频。

2. 串口通信帧协议,视频文件编号

单片机和树莓派的串口通信帧协议,我是这样定义的:

  • 每帧5个字节。其中2个字节为帧头,2个字节为帧尾,用来标记消息帧。第3个字节为要播放的视频编号,可以从 0 ~ 255。

(只定义了播放功能,并没有对暂停、结束、快进快退进行定义)

单片机和树莓派的串口通信消息帧协议
帧头1 帧头2 视频编号 帧尾1 帧尾2
0x3A 0x3B 0 ~ 255 0x7E 0x7F
  • 视频事先使用FTP传输,存储于树莓派的内存卡中,视频文件存放目录为 /home/pi/ ,也就是用户目录 ~
  • 统一视频文件的命名规则,进行编号:总计四位字符,0000 ~ 0255。例:0001.mp4,0058.mp4,0233.mp4。

例如:如果我们需要控制树莓派播放 0001.mp4 这个视频,只需要串口发送 3A 3B 01 7E 7F(十六进制数据)。

3. 安装播放器omxplayer

  • omxplayer安装:https://blog.csdn.net/Mark_md/article/details/107748035
  • 串口数据解析代码详解:https://blog.csdn.net/Mark_md/article/details/107745599

4. C代码

我们通过对 串口数据解析代码 的修改,增加 omxplayer的控制代码,实现播放对应编号的 .mp4视频。

  • Git仓库:https://github.com/ZhiliangMa/raspberry/tree/master/demo/serial_hdmi_video_complete/c_demo

serial.c

#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdlib.h>// 最大帧长度
#define MaxFrameLength  10          // 对最大帧长度加以限定,防止接收到过长的帧数据
// 完整的帧头,2个字节
#define Frame_Header1   0x3A                    // 串口接收消息包的帧头的第1个字节
#define Frame_Header2   0x3B                    // 串口接收消息包的帧头的第2个字节
// 完整的帧尾,2个字节
#define Frame_Tail1     0x7E                    // 串口接收消息包的帧尾的第1个字节
#define Frame_Tail2     0x7F                    // 串口接收消息包的帧尾的第2个字节int main(void)
{int hs1;int snum = 0;                               // 系统串口接收缓存区的可用字节数int tnum = 0;                               // 用户串口接收区的数目unsigned char chrtmp[100];                  // 用户串口接收区,将缓存的数据放入这里处理int f_h1_flag = 0;                          // 接收到帧头的第一个字节标志位int f_h_flag = 0;                           // 接收到帧头标志位int f_t1_flag = 0;                          // 接收到帧尾的第一个字节标志位wiringPiSetup();                            // 使用wiring编码去初始化GPIO序号//hs1 = serialOpen("/dev/ttyS0", 115200);     // 打开 /dev/ttyS0 串口设备,波特率115200hs1 = serialOpen("/dev/ttyUSB0", 115200);     // 打开 /dev/ttyUSB0 串口设备,波特率115200/*printf("ttyS0 uart test2:\n");              // 终端打印serialPrintf(hs1, "Hello World!\r\n");      // 串口打印serialPrintf(hs1, "Enter a paragraph and end with Enter:\r\n");*/while (1){snum = serialDataAvail(hs1);                   // 获取串口接收缓存区的可用字节数if(snum > 0){chrtmp[tnum] = serialGetchar(hs1);       // 从接收缓存区读取一个字节if (f_h_flag == 1)  // 有帧头,判断帧尾,接收消息{if (f_t1_flag == 1) //有帧头,有帧尾1{if (chrtmp[tnum] == Frame_Tail2){/* 用户处理代码 *//* 将接收到符合帧定义的帧,原路发送回去 */int i = 0;for (i = 0; i < (tnum + 1); i++){serialPutchar(hs1, chrtmp[i]); // 通过串口发送字节}//解析帧消息,播放对应编号的 .mp4视频char str1[50], str2[50];sprintf(str2, "echo \"\nomxplayer -o hdmi /home/pi/%04d.mp4\n\"", chrtmp[2]);system(str2);sprintf(str1, "omxplayer -o hdmi /home/pi/%04d.mp4", chrtmp[2]);system(str1);/*  处理完用户代码,重新接收计数 */tnum = 0;}else{f_t1_flag = 0;tnum ++;}}else                                   // 有帧头,无帧尾1{if (chrtmp[tnum] == Frame_Tail1){f_t1_flag = 1;tnum ++;}else                                // 接收消息包中间内容{tnum ++;}}}else                                      // 没有接收到帧头{if (f_h1_flag == 1)                        //没有帧头,有帧头1。下一步判断是否为第2个字节{if (chrtmp[tnum] == Frame_Header2)  // 如果为帧头的第2个字节,接收到帧头标志位标志位置1,tnum自增{f_h_flag = 1;tnum ++;}else{f_h1_flag = 0;tnum = 0;}}else                                  //没有帧头,没有有帧头1。下一步判断,是否为帧头的第1个字节{if (chrtmp[tnum] == Frame_Header1)  // 如果为帧头的第1个字节,标志位置1,tnum自增{f_h1_flag = 1;tnum ++;}else                                // 否则,标志位清0,tnum清0{tnum = 0;}}}// 大于MaxFrameLength个字节的帧不接收if (tnum > (MaxFrameLength - 1) ){tnum = 0;f_h1_flag = 0;f_h_flag = 0;f_t1_flag = 0;continue;}}}return 0;
}

5. 运行

  • 我在树莓派的 /home/pi/ 目录,使用FTP传输, 存放了两个视频:0001.mp4、0002.mp4。
  • 之后再将 serial.c 通过FTP,存放于 demo/serial_hdmi_video_complete/c_demo/ 目录下。
  • 编译生成可执行文件:gcc serial.c -o serial -l wiringPi
  • 运行:./serial
  • 将显示器的 HDMI线连接到 树莓派的HDMI接口上。
  • 使用串口助手,115200波特率,十六进制发送 3A 3B 01 7E 7F,播放 /home/pi/0001.mp4。
  • 之后再发送 3A 3B 02 7E 7F,播放 /home/pi/0002.mp4。

测试过程:

6. 实际播放效果

7. 相关链接

omxplayer基本使用:树莓派3B omxplayer基本使用

树莓派3B串口通信及解析代码:树莓派3B串口通信及解析代码

单片机串口控制树莓派3B播放HDMI视频,omxplayer,相关推荐

  1. MSP430单片机串口控制5路PWM频率变化程序

    MSP430单片机串口控制5路PWM频率变化程序 下面介绍一段MSP430单片机通过232串口发送0x00,0x01,0x02,0x03,0x04控制IO端口P1,P2,P4,P5,P6输出6路PWM ...

  2. matlab控制树莓派3b,树莓派3B+ 手机h5网页控制GPIO

    ezgif-4-5d181e9b42.gif 本文介绍如何在H5页面控制树莓派GPIO 仅实现以BCM编码方式控制GPIO,其他方式未做. 演示地址:http://gpio.exmll.cn/ 点击B ...

  3. Arduino串口控制DY-SV5W音频播放

    以下为DY-SV5W介绍摘抄模块应用手册 1.产品概述 DY-SV5W是本司自主研发的一款智能语音模块,集成IO分段触发,UART串口控制,ONE_line单总线串口控制,标准MP3等7种工作模式,简 ...

  4. 树莓派3B+ 串口使用大全(实现串口通信功能)

    1.树莓派串口控制台功能 在2018-10-09-raspbian-stretch.img镜像中,要使用串口来调试设备,需要修改conig.txt文件. 1. sudo systemctl disab ...

  5. 电脑连接树莓派3B+

    陈拓chentuo@ms.xab.ac.cn 2018.05.16/2018.12.18 0. 概述 本文介绍两种电脑连接树莓派3B+的方法: 电脑通过以太网连接树莓派3B+ 电脑通过WiFi连接树莓 ...

  6. 树莓派3b接收USB串口数据并解析处理

    通过树莓派3b使用wiringPi接收串口数据,并对帧头帧尾进行判断,解析出符合帧协议的数据. 1. 帧头.帧尾.帧长度定义 我们在这里定义串口数据的帧头为 0x3A 0x3B,帧尾为 0x7E 0x ...

  7. 树莓派3b+串口配置

    前言 树莓派从大的方向来说一共出了3代,每一代的CPU外设基本相同,但内核不同,外设里面一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0) ...

  8. 树莓派3B+ 叮当语音控制

    树莓派3B+ 叮当语音控制 智能音箱是一个并不新的产品,但在今年却显得尤为火爆,最近发布的天猫精灵,以99元的价格强势步入人们的生活,然而所谓的智能,无非是基于语音识别技术,联控各大平台的产品,从而实 ...

  9. 树莓派 3B+ 控制移动机器人

    树莓派 3B+ 控制移动机器人 安装树莓派系统 树莓派连接移动机器人(串口) 树莓派连接移动机器人(蓝牙) 安装树莓派系统 虽然很简单,但是还是要提一下.安装树莓派建议选择 Ubuntu Mate 系 ...

最新文章

  1. java构造函数使用方法总结
  2. CLR Via CSharp读书笔记(14):字符、字符串和文本处理
  3. oracle tsn文件,无法启动OracleOraDB10g_home1TSNListener服务
  4. linux 安装wdcp控制面板
  5. SQLite多线程使用总结
  6. python mad函数_Python函数的基本定义
  7. 全球领先的数据库!我用它直接让公司项目的性能提升了一半~
  8. Python入门很难吗? 为什么越来越多的人都学Python?
  9. 33_向路由组件传递数据
  10. 什么是Reactive Streams in Java 译
  11. 这份字节、阿里内部秘传的面经,被我搞到手了……
  12. 信息系统项目管理系列之六:项目范围管理
  13. emc re 整改 超标_两种常见EMC整改流程
  14. CSI Tool安装使用讲解
  15. docker源码编译安装步骤解析
  16. win10如何提高电脑画质_详细教您win10显示器分辨率怎么调节。
  17. Ruby方法参数默认值的一个小技巧在Rails中的应用
  18. pdc-admin 学习心得
  19. 计算机基础知识---位运算的简介
  20. 与其这样挥霍时间,倒不如折腾折腾,尝试发展副业

热门文章

  1. Luogu P3373 【模板】线段树 2
  2. Python抽象及异常处理
  3. 关于Ajax load页面中js部分$(function(){})的执行顺序
  4. 怎样才能做好技术团队管理
  5. cpu核心电压:不一定是1.55伏特 : 全体到齐!200 mhz fsb的p4处理器与i875p双通道ddr400芯片组...
  6. 衔接UI线程和管理后台工作线程的类(多线程、异步调用)[转]
  7. 【网络信息安全】鉴别和密钥分配协议
  8. opencv学习笔记01
  9. 11张高清Python全知识地图,强烈建议学习
  10. android 添加新用户,华为手机怎么添加新用户?华为手机添加新用户的方法