写一个程序,用到了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. NSDate简单介绍

    NSDate简单介绍 一:NSDate是一个日期\时间方面的类,主要用来创建\获取时间 1.NSDate对象的创建: date 创建一个当前系统日期和时间的对象 dateWithTimeInterva ...

  2. CSS属性(常用的属性)

    CSS属性(常用的属性)http://www.w3school.com.cn/cssref/index.asp 一:文本与字体属性 1.字体属性 (1):font-size:字体的大小(例如:font ...

  3. codeforces 676B B. Pyramid of Glasses(模拟)

    题目链接: B. Pyramid of Glasses time limit per test 1 second memory limit per test 256 megabytes input s ...

  4. Quartz.Net使用

    相关的Quartz的Demo https://yunpan.cn/cY3GZGcyTSQxu  访问密码 8b60 官方的写的也挺仔细的.http://www.quartz-scheduler.net ...

  5. 【CSS3】---为边框应用图片 border-image

    为边框应用图片 border-image 顾名思义就是为边框应用背景图片,它和我们常用的background属性比较相似.例如: background:url(xx.jpg) 10px 20px no ...

  6. php学习笔记3--php中获取时间与实际时间不符

    问题描述:在php脚本中使用date()获取服务器时间时总是与实际时间相差几个小时. 可能原因:php配置文件中时区的设置出现问题 解决方法: 方法1. php.ini文件中date.timezone ...

  7. Sass之初识

    Sass is the most mature, stable, and powerful professional grade CSS extension language in the world ...

  8. jQuery$命名冲突问题解决方法

    也许你在看此文章之前还不知道jquery有一个noConflict()东西了,它就是为了避免与其它js插件碰到相同变量的一个解决方法,利用noConflict()可以把变量存到其它指定的变量中去如,我 ...

  9. web.config connectionStrings 数据库连接字符串的解释

    先来看一下默认的连接SQL Server数据库配置<connectionStrings>   <add name="LocalSqlServer" connect ...

  10. Focus相关点滴

    获取当前焦点所在的控件. .Net本身没有该API.必须使用Win32 API解决. internal static extern IntPtr GetFocus(); Control focused ...