写一个程序,用到了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. 《UNIX环境高级编程》学习心得 二

    窝萌来看我们看到这本书里的第一个程序 #include "apue.h" #include <dirent.h> int main(int argc, char *ar ...

  2. 正则转nfa:bug消除

    正则到nfabug的解决方法 前面提到了这个bug,为了解决这个bug,我们必须在每次引用到一个假名的时候,都构建一个拷贝.现在假设我们遇到了一个假名,并得到了他的开始节点和结束节点,当前的难题就是构 ...

  3. hdu1331 按着题目的公式直接写

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #d ...

  4. JavaScript原型(链)学习笔记

    javascript是基于原型的一门脚本语言,那究竟原型是什么? 本文将从以下几个方面重点阐述原型 构造函数是什么? 构造函数和我们常见的Array String有什么关系? 原型的使用? __pro ...

  5. springmvc的一个小例子学习(一)

    个人觉得,学框架最好的 方法无外乎两个:一个是实践这个框架,真实的去用它,比如spring框架,先搭一个简单的spring项目,然后一步一步得去丰富它,从中学到spring框架的精髓和知识:另外一个就 ...

  6. 记录一下,关于错误提示:could not find a part of path “X:\”的解决办法

    Win2k在NTFS系统下可能会出现这样的错误提示,解决办法很简单,只要在网站所在系统盘根目录给ASPNET用户读取权限就可以了,因为原因就是 Server.MapPath() 这个方法,这个方法是让 ...

  7. Android微信支付SDK开发笔记

    一.准备工作 1.开发平台及SDK下载 微信开放平台 https://open.weixin.qq.com 下载SDK 微信支付Demo下载 http://pay.weixin.qq.com/wiki ...

  8. Android 混淆与混淆过滤

    Android 中代码混淆一般用的是ProGuard.它除了混淆代码之后还有其它许多实用的功能.这里主要记录混淆相关的实现. 1.ProGuard的作用 删除无用代码,压缩和优化Class文件,缩小A ...

  9. Part 57 to 58 Why should you override ToString and Equal Method

    Part 57 Why should you override ToString Method sometimes you can override ToString method like that ...

  10. ASP.Net 获取当前时间,包含各种时间格式

    在c# / ASP.net中我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间 ...