打印

51串口接受数据放数组后做运算错误

[复制链接]
1166|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tcc8073|  楼主 | 2016-12-22 16:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
KEIL中的程序,51串口中断接受数据放到数组中,因为要做处理,所以在做运算后数组赋值放到另外一个数组中,每次开机第一次接受数据后做运算都会出错,第二次以后就不会,如果数组不做运算和数组间赋值,结果不会有问题,想不明白,以下处理程序:
           bufferT[0]=Address;
           numbery=count2B+1;
            for(numberx=0;numberx<count2B;numberx++)
            {bufferT[numberx+1]=buffer2B[numberx];}
            sendarry(bufferT,numbery);

其实就是把一个数组每个字节往后移一个位置,在第一个字节位置添加一个地址

相关帖子

沙发
ayb_ice| | 2016-12-22 17:11 | 只看该作者
算法有问题吧

使用特权

评论回复
板凳
tcc8073|  楼主 | 2016-12-22 23:12 | 只看该作者
用for给对数组赋值我一直都是这么做的,但是从来没有发现过有这个问题,没有什么算法,就是接受串口发来的数据放到一个数组,在把这个数组的数都往后移动一个下,再在这个数组的第一个位置放一个数值,比如串口接受到buffer2B[4]={0X01,0X02,0X03,0X04},现在把这个数组往后偏移一个字的位置后放到bufferT[5]={0X00,0X01,0X02,0X03,0X04},再把0X0A放进去,得到bufferT[5]={0X0A,0X01,0X02,0X03,0X04},就做这个算法,现在发现第一次得到数据我会出错,后面就不会出错,不知道是什么原因,如果不做移位和添加数据,不会出错

使用特权

评论回复
地板
yichunshan| | 2016-12-23 08:43 | 只看该作者
是不是串口上电之后就有数据接收啊?比如上电后就有个00,这种情况不少见;
如果不是,那有没有可能是系统开始运行时候变量初始化问题呢,在主程序对全局变量赋个初值看看?

使用特权

评论回复
5
ningling_21| | 2016-12-23 10:30 | 只看该作者
如果呈现出规律,可以忽略第一次的数据

使用特权

评论回复
6
tcc8073|  楼主 | 2016-12-23 10:49 | 只看该作者
yichunshan 发表于 2016-12-23 08:43
是不是串口上电之后就有数据接收啊?比如上电后就有个00,这种情况不少见;
如果不是,那有没有可能是系统 ...

我把赋值算法去掉后,直接自发自收,第一次上电就不会出现这样的情况,应该不是接受的问题,问题就出在数组赋值运算上,上面上的OXOA这是全局变量,不会改变,这二个数组在开始的时候都有做初始化,虽然是全局变量的数组,但是其他地方不会用到,我怀疑是编译器的问题,不知道哪位有没有遇见过这样的问题

使用特权

评论回复
7
tcc8073|  楼主 | 2016-12-23 10:51 | 只看该作者
ningling_21 发表于 2016-12-23 10:30
如果呈现出规律,可以忽略第一次的数据

产品在现场应用很稳定,就是有这个毛病,目前客户有反应这个问题,虽然能稳定使用用,但是还是想把问题解决了

使用特权

评论回复
8
yichunshan| | 2016-12-23 11:13 | 只看该作者
tcc8073 发表于 2016-12-23 10:49
我把赋值算法去掉后,直接自发自收,第一次上电就不会出现这样的情况,应该不是接受的问题,问题就出在数 ...

0x0a赋值是在什么时候赋值给变量的呢?如果固定是0x0a,干脆宏定义一个#define  FirstData  0x0a

使用特权

评论回复
9
w522930954| | 2016-12-23 16:24 | 只看该作者
第一次开机的时候系统刚初始化好串口就默认有一个字节接收了吧。。
初始化串口之后稍微留点延时,再把相关的变量初始化一遍,再去main里面处理你这部分程序看看

使用特权

评论回复
10
datouyuan| | 2016-12-26 09:41 | 只看该作者
本帖最后由 datouyuan 于 2016-12-26 09:48 编辑
tcc8073 发表于 2016-12-22 23:12
用for给对数组赋值我一直都是这么做的,但是从来没有发现过有这个问题,没有什么算法,就是接受串口发来的 ...
           bufferT[0]=Address;
           numbery=count2B+1;
            for(numberx=0;numberx<count2B;numberx++)
            {bufferT[numberx+1]=buffer2B[numberx];}
            sendarry(bufferT,numbery);

你应该先移位,再给buffer[0]赋值.你的这段代码应该不止第一次会错误吧.你这段代码,执行结果不是bufferT[5]={0X0A,0X01,0X02,0X03,0X04},
而是bufferT[5]={0X0A,0X0A,0X02,0X03,0X04},以后总是前2个值是一样的.

使用特权

评论回复
11
tcc8073|  楼主 | 2016-12-26 20:29 | 只看该作者
实际上第一次错误会变成bufferT[5]={0X0A,0X01,0X0A,0X02,0X03,0X04},很有规律,都是这样的错误

使用特权

评论回复
12
datouyuan| | 2016-12-27 11:20 | 只看该作者
本帖最后由 datouyuan 于 2016-12-27 11:24 编辑
tcc8073 发表于 2016-12-26 20:29
实际上第一次错误会变成bufferT[5]={0X0A,0X01,0X0A,0X02,0X03,0X04},很有规律,都是这样的错误 ...
        numbery=count2B+1;
        for(numberx=0;numberx<count2B;numberx++)
        {bufferT[numberx+1]=buffer2B[numberx];}
        bufferT[0]=Address;
        sendarry(bufferT,numbery);


怎么还没理解,你代码这样写就没问题了.要先移位再给buffer[0]赋值.而不能先给buffer[0]赋值再移位.

使用特权

评论回复
13
tcc8073|  楼主 | 2016-12-29 15:16 | 只看该作者
datouyuan 发表于 2016-12-27 11:20
怎么还没理解,你代码这样写就没问题了.要先移位再给buffer[0]赋值.而不能先给buffer[0]赋值 ...

做个这个测试了,情况还是一样,只要做了数组标号的运算,上电第一次怎么都会错,没有找到原因,客户对第一次这种现象不是很在意,但是非常奇怪,第一次遇见这样的情况。

使用特权

评论回复
14
datouyuan| | 2016-12-30 10:05 | 只看该作者
本帖最后由 datouyuan 于 2016-12-30 10:23 编辑
tcc8073 发表于 2016-12-29 15:16
做个这个测试了,情况还是一样,只要做了数组标号的运算,上电第一次怎么都会错,没有找到原因,客户对第 ...
{bufferT[numberx+1]=buffer2B[numberx];}
才发现这么简单的功能尽然用了2个数组,3个变量,估计还有几个是全局变量.
从一楼代码处出现这么明显的算法错误你都能忽略,对你这个程序能可靠运行表示怀疑.
不要怀疑编译器的bug,肯定还是你软件算法的问题.

使用特权

评论回复
15
tcc8073|  楼主 | 2016-12-30 21:19 | 只看该作者
本帖最后由 tcc8073 于 2016-12-30 21:22 编辑
datouyuan 发表于 2016-12-30 10:05
才发现这么简单的功能尽然用了2个数组,3个变量,估计还有几个是全局变量.
从一楼代码处出现这么明显的算法错 ...

接收到的数据时先放在buffer2B数组中,把buffer2B的数组往后移一个位置后把数据放到bufferT数组中;;count2B是接收到并放到buffer2B中的数据个数,其实bufferT[0]开始就预留出来了,bufferT只是做个中转而已,我这个算法本来就是做这个简单的处理,只是还没有发现为什么会出现第一出现数据乱的错误,可能思维定式没有发现问题。bufferT[numberx+1]=buffer2B[numberx]保证了数据buffer2B[0]送入bufferT[1],numberx累加的话,都能保证到同样的功能,这样bufferT[0]就一直是空出来的。稳定性不要怀疑,现场已经应用二年了,从来没有出过问题。我也是很象搞明白为什么,不管什么原因,总想找个结果,希望各位多指教,谢谢!!!

使用特权

评论回复
16
tcc8073|  楼主 | 2017-1-5 13:54 | 只看该作者
问题解决了,不是算法的问题,上电赋值的时候考虑干扰做了处理,第一次数据为丢弃处理的,老客户指定的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:诚信,务实,专业,创新

179

主题

1359

帖子

7

粉丝