写一个程序,用到了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

STM32 ucosii 串口接收数据 遇到的问题及解决思路的更多相关文章

  1. 2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9490616.html 本文用的是VS2013MFC写串口数据接收: 第一步:首先建立一个MFC ...

  2. stm32的串口接收字符串以十六进制数

      #include "pbdata.h"   uint8_t TxBuffer1[] = "USART Interrupt Example: This isUSART1 ...

  3. C# 串口接收数据中serialPort.close()死锁

    最近在做一个有关高铁模拟仓显示系统的客户端程序,在这个程序中要运用串口serialPort传输数据,因为每次接收数据结束后要更新UI界面,所以就用到了的Invoke,将更新UI的程序代码封装到一个方法 ...

  4. C# 解决串口接收数据不完整

    方法1: 使 用缓存机制完成.首先通过定义一个成员变量List<byte> buffer = new List<byte> (4096);用来存放所有的数据,在接收函数里,通过 ...

  5. Linux系统串口接收数据编

    http://blog.csdn.net/bg2bkk/article/details/8668576 之前基于IBM deveplopworks社区的代码,做了串口初始化和发送的程序,今天在此基础上 ...

  6. freertos,串口接收数据后如何发送给任务

    http://www.stmcu.org.cn/module/forum/thread-610230-1-1.html http://www.stmcu.org.cn/module/forum/thr ...

  7. Qt串口通信接收数据不完整的解决方法

    在使用串口接收数据时,当数据量大的时候会出现数据接收不完整的情况.因为串口数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串口读到起始标志时立即发送,并不 ...

  8. Qt串口通信接收数据不完整的解决方法(传输图片)

    在使用串口接收数据时,当数据量大的时候会出现数据接收不完整的情况.因为串口数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串口读到起始标志时立即发送,并不 ...

  9. delphi SPCOMM 接收数据不完整!该如何解决

    SPCOMM 接收数据不完整!该如何解决   SPCOMM 接收数据不完整!我作了一个 读取地磅数据的程序,是用spcomm接收的! 总共有五台地磅,其他4台地磅数据读取都正常.但是有一台接收数据的时 ...

随机推荐

  1. Callable--创建有返回值的线程

    转自:JAVA 笔记 Callable 与 FutureTask:有返回值的多线程 常用的Thread类在run方法执行完之后是没有返回值的,要实现子线程完成任务后返回值给主线程需要借助第三方转存.C ...

  2. 不停服务情况下升级nginx

    第三方支付平台因安全问题对nginx做了升级操作,为了不影响业务,整个操作过程都不能停服务,因此对升级方法做出了要求.以下为我整理的生产环境实际操作方法,已在第三方支付平台上成功应用,希望对即将或者可 ...

  3. oracle数据操纵语言(DML)data manipulation language

    数据库操纵语言(DML)用于查询和操纵模式对象中的数据,它不隐式地提交当前事务. SELECTINSERTUPDATEDELETECALLEXPLAIN PLANLOCK TABLEMERGE使用算术 ...

  4. System.Data.OracleClient requires Oracle client software version 8.1.7 or greater

    It is a security issue, so to fix it simply do the following: Go to the Oracle folder. 1- Right Clic ...

  5. 有一种风格,叫做 Low Poly 3D

    原作:Simon阿文    杂交编辑者:RhinoC       个人更推崇使用第二款神器 ImageTriangulator :http://www.conceptfarm.ca/2013/port ...

  6. 实现多个UIView之间切换的动画效果

    @interface RootViewController (){ UIView *view1; UIView *view2; int flag; } @end @implementation Roo ...

  7. Python之随机数

    import numpy as np list = range(3) # 0 1 2 np.random.shuffle(list)#2 1 3,打乱了list import randomprint ...

  8. JS辨别浏览器系统IOS或安卓

    详细内容请点击 /* * 智能机浏览器版本信息: * */ (function($,window,document){     $.extend({         browser:{         ...

  9. 瀑布流布局--jQuery写法

    HTML <div id="main"> <div class="box"> <div class="pic" ...

  10. Log4net记录日志存库并存本地

    <?xml version="1.0" encoding="utf-8"?> <configuration> <configSec ...