-
2021-11-15 19:01:10
本文介绍3种使用串口接受一帧完整数据包的方法,串口接收数据是字节接收的,串口每接收1字节数据,产生一个串口中断,我们在中断中将接收到的数据存放到buf中进行保存,但是数据的发送和接收都是按照帧为单位进行传输的,因此我们要在接收数据的同时判断当前接收的数据是否是完整的一帧。
一般串口完整数据帧的定义:帧头(2字节,例如AA、BB) + 数据长度(2字节) + 数据 + CRC16校验(2字节) + 帧尾(2字节)
帧头、帧尾表示一帧数据的开始和结尾,数据长度表示当前数据帧中负载数据大小,CRC16校验用来检查接收到的数据是否正确。
第一种方法(根据帧头、帧尾进行判断):
串口在接收数据时,我门在串口中断函数中对接收到的每一字节数据进行判断,如果检测到帧头数据(例如AA、BB),我们开始将接收到的数据存到buf中,同时记录下该帧数据的数据长度字段,然后一直接收,直到接收到的数据长度与我们记录下的数据长度字段值一致或接收到帧尾数据,到此一帧数据接收完成,将数据扔到消息队列,等待任务处理即可。
假如接收的数据包格式如下 帧头(AA 、BB) + 数据长度 + 数据 + CRC校验 + 帧尾(CC、DD)
void USART1_IRQHandler(void) //串口中断处理函数
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
buf[buf_size++] = USART_ReceiveData(USART1);
if (buf_size >= 2)
{
if (buf[0] == 0xAA && buf[1] == 0xBB) //接收到帧头
{
//接收到帧尾
if (buf[buf_size] == 0xCC && buf[buf_size-1] == 0xDD)
{
//此处为数据包处理逻辑
buf_size = 0;
memset(buf,0,BUF_SIEZ);
}
}
else
{
buf_size = 0;
memset(buf,0,BUF_SIZE);
}
}
if(buf_size >= BUF_SIZE)
{
buf_size = 0;
memset(buf,0,BUF_SIZE);
}
}
}
第二种方法(根据接收到的字符之间的间隔进行判断):
串口数传输都是使用标准波特率,因此串口传输一帧数据时,字符与字符之间的时间间隔是一个固定值,我们可以根据串口的波特率去计算串口每个字符的间隔时间,在数据接收的过程中判断当字符间隔大于3.5个(modbus协议常用),则认为当前数据帧传输完毕,具体方法如下:
我们先设置定时器超时时间为计算出的3.5字符间隔时间,然后在串口中断中每接收到一个字符,就将其保存至buf中,并刷新定时器计数值,如果串口接收到的数据时间间隔大于3.5个字符间隔,定时器就会进入超时中断,我们在定时器中断中判断当前buf中的数据是否完整,如果完整,则扔到消息队列中,等待任务去处理。
//本例中,如果串口字符间隔大于3ms,我们认为一帧数据接收完毕,如果使用的协议是Modbus 协议,则时间间隔应该设置为3.5字符间隔时间。
#define BUF_SIZE 128 // 定义串口接收buf 长度
typedef enum {DISABLE = 0, ENABLE = !DISABLE} ; //定义枚举类型
u16 buf_size = 0;
u8 buf[BUF_SIZE] = {0}; //定义串口接收缓存区
u16 TimerCount = 0;
u8 TimerEnable = ENABLE; //定义定时器计数使能标志位
void USART1_IRQHandler(void) //串口中断处理函数
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断是否接收中断标志位置位
{
buf[buf_size++]= USART_ReceiveData(USART1); //将接收到的数据存入buf
TimerCount=0;
TimerEnable = ENABLE; //置位定时器计数使能标志位
if(buf_size >= BUF_SIZE)
{
buf_size = 0; //接收数据缓冲区溢出,重新开始接收
memset(buf,0,BUF_SIZE);
}
}
}
void TIM1_IRQHandler(void) //定时器中断处理函数 每1ms产生一次中断
{
u8 cnt = 0;
if(TIM_GetITStatus(TIM1 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM1 , TIM_FLAG_Update); //清除定时器中断标志位
if(TimerEnable == ENABLE)
{
TimerCount++;
if(TimerCount > 3) //大于3ms,则判断为一帧数据接收完成
{
TimerCount = 0;
Timer.Enable = DISABLE;
//此处为数据包处理逻辑
buf_size = 0;
memset(buf,0,BUF_SIZE);
}
}
}
}
第三种方法(使用串口帧空闲中断,推荐使用):
串口IDLE中断,串口接收完完整的一帧数据自身产生的中断,配置使能该中断后,串口会判断总线上一个字节的时间间隔内有没有再次接收到数据,如果没有则当前一帧数据接收完成,产生IDLE中断。
使用方法,原串口配置不变,添加下列语句,开启IDLE中断:
#define BUF_SIZE 128 // 定义串口接收buf 长度
u16 buf_size = 0;
u8 buf[BUF_SIZE] = {0}; //定义串口接收缓存区
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启串口帧空闲中断
void USART1_IRQHandler(void) //串口中断服务函数
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
buf[buf_size++] = USART_ReceiveData(USART1);
}
if(buf_size >= BUF_SIZE )
{
buf_size = 0; //接收缓冲区溢出,重新开始接收
memset(buf,0,BUF_SIZE);
}
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) //当前为接收到一帧完整的数据包
{
USART1->SR; //先读SR
USART1->DR; //再度DR 清除帧空闲中断标志位
//此处为数据包处理逻辑
buf_size = 0;
memset(buf,0,BUF_SIZE);
}更多相关内容 -
STM32串口连续接收一帧数据
2015-08-31 08:26:49STM32串口接收一帧数据的写法,数据包括帧头,功能帧,数据帧,校验位! -
手机录制视频然后一帧一帧分析
2022-03-31 10:14:26手机录制视频然后一帧一帧分析 提高手机分辨率的方法 红米手机 ---- 屏幕录制app ,设置,里面 的 都设置成最大的 然后进入 驾考宝典3D app里面 侧面有个 游戏加速的 点击一个 条目,比如 曲线行驶, 这个时候 手机 ...手机录制视频然后一帧一帧分析
提高手机分辨率的方法
红米手机 ---- 屏幕录制app ,设置,里面 的 都设置成最大的
然后进入 驾考宝典3D app里面
侧面有个 游戏加速的
点击一个 条目,比如 曲线行驶, 这个时候 手机 进入 横屏显示的模式这个时候,点击 游戏加速的 屏幕录制功能。
等录制完毕,点击 那个 小悬浮窗口的 关闭按钮。然后 通过 微信的 文件传输功能 传到 电脑上。
电脑上也登录的 这个微信。然后用 plotplayer.exe
-
使用VLC把视频转换为一帧一帧的图片
2021-09-03 14:17:00目录路径,写一个自己想要放置帧序列的路径 总是写入到相同的文件,不勾选 录制比率,我设置为10 ,是指10张图片选择一张进行存储 6、点击保存 7、点击媒体,选择打开文件, 选中你想要转换的视频,点击打开即可 8...1、打开软件VLC
2、点击工具,选择偏好设置
3、选择左下角的全部
4、在左栏选择 视频–》滤镜–》场景滤镜
5、点击场景滤镜,可以看到左边的详细设置图片格式,我一般默认png
宽高为-1表示默认的宽高
文件名前缀可以自己设置
目录路径,写一个自己想要放置帧序列的路径总是写入到相同的文件,不勾选
录制比率,我设置为10 ,是指10张图片选择一张进行存储6、点击保存
7、点击媒体,选择打开文件,
选中你想要转换的视频,点击打开即可
8、之后就可以看到选中视频开始播放,同时文件夹也在写入帧图片
若视频暂停播放,图片也暂停写入。
9、保存的帧图片,如下所示
-
Java截取视频某一帧
2022-03-10 20:04:03//获取视频总帧数 int frames = fFmpegFrameGrabber.getLengthInFrames(); int i = 0; while (i ){ frame = fFmpegFrameGrabber.grabImage(); //截取第10帧 if(frame!=null && i==10){ String fileName = "C:\\...导入依赖
<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv</artifactId> <version>1.5.6</version> </dependency> <dependency> <groupId>org.bytedeco</groupId> <artifactId>ffmpeg-platform</artifactId> <version>4.4-1.5.6</version> </dependency>
代码示例
import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.Frame; import org.bytedeco.javacv.Java2DFrameConverter; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.util.*; public class Test { public static void main (String [] args) throws Exception{ String fileUrl = "C:\\Users\\Administrator\\Desktop\\《摩擦力》说课.mp4"; FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(fileUrl); fFmpegFrameGrabber.start(); Frame frame = null; //获取视频总帧数 int frames = fFmpegFrameGrabber.getLengthInFrames(); int i = 0; while (i <= frames){ frame = fFmpegFrameGrabber.grabImage(); //截取第10帧 if(frame!=null && i==10){ String fileName = "C:\\Users\\Administrator\\Desktop\\"+System.currentTimeMillis()+".jpg"; File file = new File(fileName); //创建BufferedImage对象 Java2DFrameConverter converter = new Java2DFrameConverter(); BufferedImage bufferedImage = converter.getBufferedImage(frame); ImageIO.write(bufferedImage,"jpg",file); break; } i++; } fFmpegFrameGrabber.stop(); fFmpegFrameGrabber.close(); }
运行效果
-
java 获取视频第一帧 | Java工具类
2021-11-11 13:56:20前言 本文提供提取mp4视频文件的第一帧java工具类, -
potplayer如何设置以一帧一帧的逐帧播放播放?
2020-11-13 16:03:49支持单帧播放(F键前进一帧,D键倒退一帧,空格键正常播放) 支持变速播放(X键降速10%,C键提速10%,Z键重置) 支持5.1声道和7.1声道,可以搭建环绕声家庭影院第四,支持画声同步调节 按Tab键就能显示视频文件. -
【前端】如何在video上显示视频的第一帧
2021-06-17 06:24:07移动端 如何在video上显示视频的第一帧?能写下具体代码吗? 谢谢了回答video标签有个poster属性,事先截好封面放进去就行是啊 但是怎么截呢 前端能实现吗?视频第一帧图片:(function(){var video, output;var ... -
快速将视频分解成一帧帧的图片
2021-12-31 15:48:54参考网站:Download file – your conversion was successful -
串口接收完整一帧数据包的3种方法
2020-06-25 20:08:07本文介绍3种使用串口接受一帧完整数据包的方法,串口接收数据是字节接收的,串口每接收1字节数据,产生一个串口中断,我们在中断中将接收到的数据存放到buf中进行保存,但是数据的发送和接收都是按照帧为单位进行... -
前端截取视频第一帧作为封面
2022-01-30 13:05:171.做项目的时候突然想截取视频第一帧,作为视频的封面,然后搜了很多博客都发现得到空白的图片,最后得到了解决。 2.方法:通过创建canvas标签,利用其drawImage() 方法在画布上绘制该视频,然后运用toDataURL方法... -
一帧数据接收方法
2020-09-03 20:58:19最近在做485数据通讯,遇到一些通讯问题,特意去查找资料,一帧数据接收有三种方法,现分享如下: 第一种方法:根据帧头和帧尾进行校验, 串口发送2字节例如(AA ,BB),然后程序对每2个字节进行判断,例如设定一个... -
Android中获取视频的第一帧图片的三种方法
2021-04-06 14:33:111、使用Glide获取视频的第一帧图片 Glide.with(holder.mCover.getContext()) .setDefaultRequestOptions( new RequestOptions() .frame(0) .centerCrop() ) -
STM32串口接收一帧数据方法(处理一帧数据中所需内容)
2020-07-26 20:58:21stm32支持接受单个数据或者一帧数据,若配置单个数据接收中断的话,会出现接收包丢包,数据不完整的情况!因此在stm32的串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说串口发来n个... -
Unity 设置对象参数后,延迟一帧
2021-12-07 17:48:58原因:对对象修改参数后,当前帧并未执行完,或许如set方法被丢进下一帧执行了,如果不是这样,可以试试使用对象列表还原该问题。 解决办法:假设设置的是图片宽,image.width = w;则如果要在当前帧引用它应该debug.... -
Pr删除视频中的某一帧
2022-02-02 10:35:50运用Pr软件删除视频中的帧 -
把视频转化为一帧一帧的图片
2020-05-13 11:48:08https://wenwen.sogou.com/z/q828824054.htm -
手机显示一帧的流程是如何实现?
2022-03-29 10:10:18和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、显示一帧流程概览二、生产者,消费者 BufferQueue 流转图三、App ,SF Buffer 交互图四、SF 跟 HWC 交互图一、显示一帧... -
python 获取MP4视频第一帧 | Python工具类
2021-11-11 22:50:02获取MP4视频第一帧图片,mp4的视频路径支持url链接。 环境部署 需要部署ffmpeg环境,具体的部署步骤可以参考我的另一篇文章:windows ffmpeg安装部署_阿良的博客-CSDN博客 代码 不废话,上代码。 #!/... -
vue 获取上传视频的第一帧做为视频封面
2021-11-18 16:40:07//截取视频第一帧作为播放前默认图片 findvideocover(url,file) { const video = document.getElementById("upvideo"); // 获取视频对象 // const video = document.createElement("video") // 也可以自己创建... -
js截取视频第一帧作为封面
2022-03-22 16:25:19js截取视频第一帧作为封面 -
JS截取视频第一帧
2019-09-18 20:32:58当视频能够预览并上传后,非要来一张视频第一帧的截图贴上,第一帧是黑的怎么办,下一帧。一、文件上传使用 <inputtype="file">上传, change... -
微信小程序:video标签默认显示视频的第一帧作为封面
2021-07-06 12:02:27微信小程序:video标签默认显示视频的第一帧作为封面 <video src="video_url" controls="{{false}}" initial-time='0.01' muted autoplay object-fit="cover"></video> 参数 src 资源地址 ... -
js获取在线视频的第一帧画面的直链作为视频封面
2022-03-16 15:22:23最近碰到一个需求,要求获取在线视频文件的第一帧画面作为视频的封面图片,项目中使用的是 xgplayer 播放器,封面 poster 要求传封面的 url。 思路:用 canvas 绘出画面 - 转成 base64 - base64 转成 File - 获取 ... -
h5获取视频的第一帧
2019-06-14 17:15:121.需求 网站前端开发过程,可能有这样的场景,需要显示一个视频图片列表,点击图片,直接播放视频。 实现思路:1....对每一个video,都创建一个图片与之对应 2.前端代码 <!DOCTYPE html> &l... -
如何读取H264文件获得每一帧的数据(VsParserPro)
2019-02-02 12:07:28网上有很多读取H264的封装类,但是大多数都是提取NAL单元的,而我想要的是提取每一帧的数据。并且,很多解析H264的代码都是有Bug的,不是太完善。在这篇博文里我向大家分享一个比较完善的H264的封装类,该代码可以... -
python保存视频中的每一帧
2019-07-04 16:24:19python保存视频中的每一帧 import cv2 import os def save_img(): video_path = r'./dataset/sample/video' videos = os.listdir(video_path) for video_name in videos: file_name = video_name.split('... -
uniapp获取视频第一帧展示,及视频的层级问题,亲测有效
2022-01-21 12:48:12uniapp 获取视频第一帧,video层级过高问题 -
使用 opencv-python 提取视频每一帧的图片
2020-10-02 10:48:29计算机视觉是指用摄影机和计算机代替人眼...OpenCV 的全称是 Open Source Computer Vision Library,是一个跨平台的计算机视觉库,其基于C/C++,支持 Linux/Windows/MacOS/Android/iOS,并提供了 Python,Matlab 和 Ja. -
JavaScript设置显示video第一帧
2019-03-06 14:23:17设置视频封面为视频第一帧 .video{ width:500px; height:300px; } (event)" controls="controls" calss="video"> function showFrame(event) { let scale = 0.8,video = event.target, ...