[应用相关] 丝滑单片机 STM32 串口播放视频

[复制链接]
Jiangxiaopi 发表于 2025-8-26 08:41 | 显示全部楼层 |阅读模式
前言
一直以来,STM32 搭配 OLED 显示屏的**都很常见,但大多数人只是用它来显示文字、波形或者静态图片。有没有想过让 STM32 播放视频?
本篇博客分享一个利用 Python 进行视频数据处理,并通过串口高速传输到 STM32,在 OLED 上进行视频播放的有趣项目。整个过程丝滑流畅,带你感受一下“小屏幕大世界”的魅力。

项目原理
视频帧处理:PC 上用 Python(OpenCV + NumPy)将视频逐帧读取、灰度化、二值化,并转换为 OLED 的显存格式。

高速串口传输:通过串口(921600 波特率)将帧数据传输到 STM32。

STM32 显示驱动:STM32 接收数据后直接写入 OLED 的显存数组,实时刷新显示。

硬件准备
STM32F103C8T6 开发板

0.96 寸 128×64 I2C OLED 显示屏

USB 转 TTL 模块(或开发板自带的串口功能)

杜邦线若干




使用方法
1.硬件连接
按照接线图连接好 OLED 与 STM32。

2.下载固件
将 Keil 工程代码烧录到 STM32。

3.运行 Python 脚本

安装依赖:

pip install numpy
pip install opencv-python
pip install pyserial


修改 serial.Serial('COM3', 921600) 中的串口号为自己的。

修改 cv2.VideoCapture('打篮球.mp4') 为自己的视频文件路径。

4.播放视频
运行 Python 脚本后,STM32 OLED 屏会显示实时视频。按 q 键退出播放。

5.注意事项

串口收发无帧同步机制,建议每次中断后重启 STM32 防止帧错位。

视频过长可适当裁剪,减少传输延迟。

核心代码解析
1.STM32 主程序

int main(void)
{
    OLED_Init();     // 初始化 OLED
    Serial_Init();   // 初始化串口

    OLED_Clear();
    OLED_ShowString(40, 24, "START", OLED_8X16);
    OLED_Update();

    while (1)
    {
        OLED_Update(); // 刷新 OLED 显存到屏幕
    }
}



2.串口中断接收

void USART1_IRQHandler(void)
{
    static uint8_t p0 = 0, p1 = 0;
    if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
    {
        uint8_t RxData = USART_ReceiveData(USART1);
        OLED_DisplayBuf[p0][p1] = RxData; // 写入显存
        p1++;
        if (p1 >= 128) { p1 = 0; p0++; if (p0 >= 8) p0 = 0; }
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}



3.Python 视频处理与发送

def img2array(frame):
    array = np.zeros((8, 128), dtype='uint8')
    for j in range(64):
        for i in range(128):
            if frame[j] > 0:
                array[j // 8] |= (0x01 << (j % 8))
    return array

cap = cv2.VideoCapture('打篮球.mp4')
serial_port = serial.Serial('COM3', 921600)

while cap.isOpened():
    ret, img = cap.read()
    if not ret: break
    img = cv2.resize(img, (128, 64))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img = cv2.threshold(img, 170, 255, cv2.THRESH_BINARY)[1]
    serial_port.write(img2array(img))



总结
本项目充分发挥了 STM32 与 Python 的协作优势:

Python 负责繁重的视频解码与图像处理

STM32 专注于高速接收和 OLED 显示
最终实现了在小小的 OLED 屏幕上播放视频的效果。
虽然帧率与分辨率有限,但这是个非常适合入门图形处理与嵌入式串口通信的有趣项目。

下一步升级:可加入帧同步协议、压缩算法、SD 卡缓存等,让播放更流畅稳定。
————————————————
版权声明:本文为CSDN博主「jingjing~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhu_xian_gang/article/details/150147038

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

本版积分规则

55

主题

224

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部