单片机串口控制树莓派3B播放HDMI视频,omxplayer,
使用树莓派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,相关推荐
- MSP430单片机串口控制5路PWM频率变化程序
MSP430单片机串口控制5路PWM频率变化程序 下面介绍一段MSP430单片机通过232串口发送0x00,0x01,0x02,0x03,0x04控制IO端口P1,P2,P4,P5,P6输出6路PWM ...
- matlab控制树莓派3b,树莓派3B+ 手机h5网页控制GPIO
ezgif-4-5d181e9b42.gif 本文介绍如何在H5页面控制树莓派GPIO 仅实现以BCM编码方式控制GPIO,其他方式未做. 演示地址:http://gpio.exmll.cn/ 点击B ...
- Arduino串口控制DY-SV5W音频播放
以下为DY-SV5W介绍摘抄模块应用手册 1.产品概述 DY-SV5W是本司自主研发的一款智能语音模块,集成IO分段触发,UART串口控制,ONE_line单总线串口控制,标准MP3等7种工作模式,简 ...
- 树莓派3B+ 串口使用大全(实现串口通信功能)
1.树莓派串口控制台功能 在2018-10-09-raspbian-stretch.img镜像中,要使用串口来调试设备,需要修改conig.txt文件. 1. sudo systemctl disab ...
- 电脑连接树莓派3B+
陈拓chentuo@ms.xab.ac.cn 2018.05.16/2018.12.18 0. 概述 本文介绍两种电脑连接树莓派3B+的方法: 电脑通过以太网连接树莓派3B+ 电脑通过WiFi连接树莓 ...
- 树莓派3b接收USB串口数据并解析处理
通过树莓派3b使用wiringPi接收串口数据,并对帧头帧尾进行判断,解析出符合帧协议的数据. 1. 帧头.帧尾.帧长度定义 我们在这里定义串口数据的帧头为 0x3A 0x3B,帧尾为 0x7E 0x ...
- 树莓派3b+串口配置
前言 树莓派从大的方向来说一共出了3代,每一代的CPU外设基本相同,但内核不同,外设里面一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0) ...
- 树莓派3B+ 叮当语音控制
树莓派3B+ 叮当语音控制 智能音箱是一个并不新的产品,但在今年却显得尤为火爆,最近发布的天猫精灵,以99元的价格强势步入人们的生活,然而所谓的智能,无非是基于语音识别技术,联控各大平台的产品,从而实 ...
- 树莓派 3B+ 控制移动机器人
树莓派 3B+ 控制移动机器人 安装树莓派系统 树莓派连接移动机器人(串口) 树莓派连接移动机器人(蓝牙) 安装树莓派系统 虽然很简单,但是还是要提一下.安装树莓派建议选择 Ubuntu Mate 系 ...
最新文章
- java构造函数使用方法总结
- CLR Via CSharp读书笔记(14):字符、字符串和文本处理
- oracle tsn文件,无法启动OracleOraDB10g_home1TSNListener服务
- linux 安装wdcp控制面板
- SQLite多线程使用总结
- python mad函数_Python函数的基本定义
- 全球领先的数据库!我用它直接让公司项目的性能提升了一半~
- Python入门很难吗? 为什么越来越多的人都学Python?
- 33_向路由组件传递数据
- 什么是Reactive Streams in Java 译
- 这份字节、阿里内部秘传的面经,被我搞到手了……
- 信息系统项目管理系列之六:项目范围管理
- emc re 整改 超标_两种常见EMC整改流程
- CSI Tool安装使用讲解
- docker源码编译安装步骤解析
- win10如何提高电脑画质_详细教您win10显示器分辨率怎么调节。
- Ruby方法参数默认值的一个小技巧在Rails中的应用
- pdc-admin 学习心得
- 计算机基础知识---位运算的简介
- 与其这样挥霍时间,倒不如折腾折腾,尝试发展副业
热门文章
- Luogu P3373 【模板】线段树 2
- Python抽象及异常处理
- 关于Ajax load页面中js部分$(function(){})的执行顺序
- 怎样才能做好技术团队管理
- cpu核心电压:不一定是1.55伏特 : 全体到齐!200 mhz fsb的p4处理器与i875p双通道ddr400芯片组...
- 衔接UI线程和管理后台工作线程的类(多线程、异步调用)[转]
- 【网络信息安全】鉴别和密钥分配协议
- opencv学习笔记01
- 11张高清Python全知识地图,强烈建议学习
- android 添加新用户,华为手机怎么添加新用户?华为手机添加新用户的方法