写一个程序,用到了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 串口接收数据 遇到的问题及解决思路相关推荐

  1. STM32如何从串口接收数据,取出数据中的密码段再保存到flash中。

    STM32如何从串口接收数据,取出数据中的密码段再保存到flash中 STM32如何从串口接收数据,取出数据中的密码段再保存到flash中u8 Usart2_buf[256]; unsigned in ...

  2. STM32MP157实现串口接收数据上云-MP157连接4G模块和电脑

    文章目录 前言 一.打开设备文件 二.串口初始化 三.多线程 四.程序的移植和执行 五.源码(转载请注明出处) 结语 前言 本篇分享: 这次将会用几篇博客分享STM32MP157实现串口接收数据上云的 ...

  3. 【嵌入式】——串口实验——实现芯片串口收发数据,按键中断串口发送数据,串口接收数据中断来控制LED亮/灭

    实验目的: 实现芯片串口收发数据,按键中断串口发送数据:按下按键,向串口发送数据,并通过虚拟终端显示出来: 串口接收数据中断来控制LED亮/灭:通过串口助手向MCU发送数据,"A" ...

  4. 多串口接收数据并显示-自定义串口通信类-调用委托显示数据-保存数据-实例:10串口接收数据并显示加保存

    当时搜了很久,没咋都到合适的思路,就自己整理一份吧 大致实现的功能: 通过串口接收数据,进行解析,然后显示,或者保存数据: 主要:多个串口接收显示都能用: 大致思路: 1.新建一个类SerialPor ...

  5. 单片机串口接收数据的一些经验与教训

    一些好文章 一种单片机数据解析方法:https://mp.weixin.qq.com/s/GVH8MZrlbVKXanD45wOYOw 单片机串口接收数据需要注意以下几点 1.接收数据要有顺序,接收到 ...

  6. 串口通信——串口接收数据,发送数据

    十六进制        HEX /hexadecimal   /ˌheksəˈdesɪml/ 十进制            DEC /decimalism     /'desiməlizəm/ 二进制 ...

  7. STM32串口接收数据

    参考串口接收中断处理函数: //------------------------------------------------------------------ //函数名:void USART1 ...

  8. WIN32API串口接收数据简单测试

    进行简单的API中一部分关于串口通信函数的测试,为以后的上位机编写做准备. 下面是一部分从网上和msdn整理的函数说明: ReadFile: BOOL ReadFile (    HANDLE hFi ...

  9. 解决QT接受串口数据时数据更新不及时,串口数据太多导致程序界面崩溃,串口接收数据过快等问题

    1.问题背景 最近在使用上位机测试传感器接受数据是否正常,发现了很多问题,由于没有系统的学过Qt,用到什么库就学什么库,导致库中的函数很多不清晰,产生了标题中的一系列问题,经过不断的尝试,终于解决上述 ...

  10. 串口接收数据并对数据进行处理

    正点原子的串口中断函数如下: void USART1_IRQHandler(void)                    //串口1中断服务程序     {     u8 Res; #if SYS ...

最新文章

  1. 快速构建Windows 8风格应用32-构建辅助磁贴
  2. java 读文件夹_java怎么读取读取文件夹下的所有文件夹和文件?
  3. [云炬创业学笔记]第二章决定成为创业者测试8
  4. Qt Designer的信号和插槽编辑模式
  5. time Interval in SAP UI5 SalesPipeline
  6. [MyBatisPlus]测试BaseMapper的功能测试自定义功能
  7. dumpbin发现没有入口函数_JavaScript基础之入口函数-2020版
  8. 虚拟化网络与云网关打通的解决方案
  9. 华为服务器装系统一直在读盘,系统重装一直在启动服务器
  10. java等边三角形代码_Java实现等边三角形--小程序,大思想
  11. boost boost::asio::read socket.read_some 区别
  12. 手机自动化测试IDE --手把手教你用Airtest模拟器来连接手机
  13. 20145122《Android开发基础》实验四实验报告
  14. 线程停止继续_Java并发学习第二弹:如何正确停止线程?
  15. 整整1600套Axure原型图设计源文件UI UX交互设计案例
  16. Matlab中写M文件及调用
  17. xynuoj 1919 三国志
  18. Ubuntu18.04之微信中文乱码解决(五十八)
  19. 中国石油大学(北京)-《中国近现代史纲要》第二阶段在线作业
  20. Synopsys VCS仿真编译选项

热门文章

  1. Python3 字符串操作
  2. 《剑指offer》面试题41/42——和为s的两个数字VS和为s的连续正数序列(C++代码实现)
  3. 专题一——递归与递推
  4. 模板题——容斥原理、博弈论
  5. 稳健估计,P范数最小法
  6. Sentinel-1 影像与精轨数据下载(经常更新中)
  7. Doc2EDAG: An End-to-End Document-level Framework for Chinese Financial Event Extraction
  8. arraylist扩容是创建新数组吗 java_手撕ArrayList底层,透彻分析源码
  9. andorid自定义ViewPager之——子ViewPager滑到边缘后直接滑动父ViewPager
  10. 为什么我们要设定更高的目标?