STM32 ucosii 串口接收数据 遇到的问题及解决思路
写一个程序,用到了ucos ii ,串口在中断中接收数据(一包数据 8个字节 包含: 1byte包头 5byte数据 1byte校验和 1byte 包尾 ) ,数据由上位机每隔500ms发送一次,在串口中断中接收1byte数据放到数组Rev_dat[8]中并判断,直到接收到包尾后进行校验和判断 , 如果数据正确后 把接收到的数据存到另外一个数组B中 ,然后发送消息量给任务A ,任务A接收到消息量进行判断,如果在一定时间内没有接收到消息量就启动任务C,接收到了消息量的话,再发送消息量给任务B ,由任务B对数组B进行解码操作 ,在此过程中遇到问题如下:
1 上位机通过串口助手每隔1S给下位机发送一包命令码 , 可是实际运行过程中,任务B只解码了一次,然后程序就跳到任务C了④
说明任务A只接收到一次正确的数据 ,然后就接收不到消息量,所以会调到任务C 。
解决思路:① 会不会是 串口中断中判断命令的程序有问题 。 把所有任务屏蔽,只留下串口中断,在校验和成功的条件下 加一个变量check_num_cnt ,每校验和成功一次 ,变量check_num_cnt就加1 ,测试发现,串口助手发送的数据次数和变量最终的值check_num_cnt相等,说明中断中 判断命令的语句是没有问题的。
② 然后把程序中的相关任务一个一个放出来发现 ,解码后 ,根据上位机的命令 ,机器开始运行的程序中有延时命令,只要只留下延时命令,就会导致程序出错 。
解决思路:只要一运行系统延时命令,整个系统就开始任务间的调度 ,会不会是 任务调度命令中有临界区 在临界区中会关闭系统中断 ,导致串口中断接收出错 。但是由于之前 ,手动给下位机隔一段时间发送一个命令,机器是能正常运行的 ,所以就做一下操作:把上位机 给下位机自动发送命令的时间间隔设置为5S ,运行半个小时 ,后发现 ,上位机发送命令的次数和变量值check_num_cnt的值能对上,就说明发送间隔时间长了以后是没有问题,不是临界区导致的 。
③ 在定义一个变量数组a[240],把他放到串口中断读数的命令下边,只要串口中断读数,就把读到的数放到数组中,不进行判断 ,上位机发送240byte的数据,调试发现 只要把发送消息量的命令屏蔽了 接收到的数据就是正常的,加上消息量的语句 就不能接收到正确的命令,并且数组中会丢失30%的数据
通过查阅资料发现可能的原因是 :串口中断收到命令后要进行判断,把收到的数据存放到数组Rev_dat ,校验和成功后 ,数组Rev_dat在把数据复制给数组Command[8]中,并发送消息量,最后在任务B中对数组Command进行操作解码,这样就会有冲突,在任务B读数组Command时,串口中断又收到数据,会写数组Command,读写之间没有做互斥,说以导致程序出错。
为了验证,在串口中接收到数据后使用消息队列把数据发送出来,在通信任务中接收数据,把数据放到一个全局变量中,发现这样就不会影响到串口数据的接收了
同时,当接收到的上位机命令不停的创建同一个任务时,也会导致串口接收数据丢失
查阅的资料:http://www.docin.com/p-282809512.html?qq-pf-to=pcqq.c2c
转载于:https://www.cnblogs.com/kevin-salt/p/5781040.html
STM32 ucosii 串口接收数据 遇到的问题及解决思路相关推荐
- STM32如何从串口接收数据,取出数据中的密码段再保存到flash中。
STM32如何从串口接收数据,取出数据中的密码段再保存到flash中 STM32如何从串口接收数据,取出数据中的密码段再保存到flash中u8 Usart2_buf[256]; unsigned in ...
- STM32MP157实现串口接收数据上云-MP157连接4G模块和电脑
文章目录 前言 一.打开设备文件 二.串口初始化 三.多线程 四.程序的移植和执行 五.源码(转载请注明出处) 结语 前言 本篇分享: 这次将会用几篇博客分享STM32MP157实现串口接收数据上云的 ...
- 【嵌入式】——串口实验——实现芯片串口收发数据,按键中断串口发送数据,串口接收数据中断来控制LED亮/灭
实验目的: 实现芯片串口收发数据,按键中断串口发送数据:按下按键,向串口发送数据,并通过虚拟终端显示出来: 串口接收数据中断来控制LED亮/灭:通过串口助手向MCU发送数据,"A" ...
- 多串口接收数据并显示-自定义串口通信类-调用委托显示数据-保存数据-实例:10串口接收数据并显示加保存
当时搜了很久,没咋都到合适的思路,就自己整理一份吧 大致实现的功能: 通过串口接收数据,进行解析,然后显示,或者保存数据: 主要:多个串口接收显示都能用: 大致思路: 1.新建一个类SerialPor ...
- 单片机串口接收数据的一些经验与教训
一些好文章 一种单片机数据解析方法:https://mp.weixin.qq.com/s/GVH8MZrlbVKXanD45wOYOw 单片机串口接收数据需要注意以下几点 1.接收数据要有顺序,接收到 ...
- 串口通信——串口接收数据,发送数据
十六进制 HEX /hexadecimal /ˌheksəˈdesɪml/ 十进制 DEC /decimalism /'desiməlizəm/ 二进制 ...
- STM32串口接收数据
参考串口接收中断处理函数: //------------------------------------------------------------------ //函数名:void USART1 ...
- WIN32API串口接收数据简单测试
进行简单的API中一部分关于串口通信函数的测试,为以后的上位机编写做准备. 下面是一部分从网上和msdn整理的函数说明: ReadFile: BOOL ReadFile ( HANDLE hFi ...
- 解决QT接受串口数据时数据更新不及时,串口数据太多导致程序界面崩溃,串口接收数据过快等问题
1.问题背景 最近在使用上位机测试传感器接受数据是否正常,发现了很多问题,由于没有系统的学过Qt,用到什么库就学什么库,导致库中的函数很多不清晰,产生了标题中的一系列问题,经过不断的尝试,终于解决上述 ...
- 串口接收数据并对数据进行处理
正点原子的串口中断函数如下: void USART1_IRQHandler(void) //串口1中断服务程序 { u8 Res; #if SYS ...
最新文章
- 快速构建Windows 8风格应用32-构建辅助磁贴
- java 读文件夹_java怎么读取读取文件夹下的所有文件夹和文件?
- [云炬创业学笔记]第二章决定成为创业者测试8
- Qt Designer的信号和插槽编辑模式
- time Interval in SAP UI5 SalesPipeline
- [MyBatisPlus]测试BaseMapper的功能测试自定义功能
- dumpbin发现没有入口函数_JavaScript基础之入口函数-2020版
- 虚拟化网络与云网关打通的解决方案
- 华为服务器装系统一直在读盘,系统重装一直在启动服务器
- java等边三角形代码_Java实现等边三角形--小程序,大思想
- boost boost::asio::read socket.read_some 区别
- 手机自动化测试IDE --手把手教你用Airtest模拟器来连接手机
- 20145122《Android开发基础》实验四实验报告
- 线程停止继续_Java并发学习第二弹:如何正确停止线程?
- 整整1600套Axure原型图设计源文件UI UX交互设计案例
- Matlab中写M文件及调用
- xynuoj 1919 三国志
- Ubuntu18.04之微信中文乱码解决(五十八)
- 中国石油大学(北京)-《中国近现代史纲要》第二阶段在线作业
- Synopsys VCS仿真编译选项
热门文章
- Python3 字符串操作
- 《剑指offer》面试题41/42——和为s的两个数字VS和为s的连续正数序列(C++代码实现)
- 专题一——递归与递推
- 模板题——容斥原理、博弈论
- 稳健估计,P范数最小法
- Sentinel-1 影像与精轨数据下载(经常更新中)
- Doc2EDAG: An End-to-End Document-level Framework for Chinese Financial Event Extraction
- arraylist扩容是创建新数组吗 java_手撕ArrayList底层,透彻分析源码
- andorid自定义ViewPager之——子ViewPager滑到边缘后直接滑动父ViewPager
- 为什么我们要设定更高的目标?