打印

串口回送数据部分出问题、EEPROM 数据被篡改!!

[复制链接]
3836|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Ryanhsiung|  楼主 | 2012-3-15 16:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Ryanhsiung 于 2012-3-16 09:18 编辑

我的设备是一个基于485的从机(转换芯片为2483),使用协议为232的协议。
   
问题1描述如下:  
       在上电后出现,下位机正常运行(显波器测量相应自动采集外设),可正常接收上位机发送的指令(这个也是观察IO端口判断的)。  
      在返回数据时就很乱,有时不回送数据,有时回送若干个、有时回送了4000多个。且没有规律。  注:正常回送5个数据(固定格式)     
      断电重启后再上电可正常通信。但是EEPROM中的数据中的部分被篡改 (比如:485地址(存在0X00位置)被篡改了)。      
     上午,重启  1/30概率会出现一次,无规律。 注:仅测试一台设备,,下午就没有出现了!
以下为我串口从机回送数据的函数:

void PcCom_SendSomeByteForLine(uchar command,uint8 *string, uint8 lenth )
{
uint8 i=0;
RS485_SendData[0] = STX;
RS485_SendData[1] = RS485Addr ;
RS485_SendData[2] = 0x1+lenth;
RS485_SendData[3] = command;
for(i=0;i<lenth;i++)
{
  RS485_SendData[4+i] = *string;
  string++;
}
PcCom_SendData(RS485_SendData,RS485_SendData[2]+3);
}



我的格式里最少要有5个byte,在什么状态下可能会回送1BYTE、若干个BYTE,4000byte ??

这一个很关键:EEPROM中的数据中的部分被篡改,这个有什么可能性呢??


回送的数据(随意COPY):
00 00 02 00 04 04 00 00 00 00 00 00 00 00 08 A2 03 01 80 52 01 28 D0 D4 C1 00 1B 34 A4 04 E3 14 F9 A8 24 41 06 71 13 C1 2D 9A 54 22 4D 48 8A 55 26 
C9 10 EC 0A 10 02 AB C4 4B 24 93 2D 1A A0 1E 85 09 A9 D6 00 94 30 4F 08 85 68 00 08 02 D1 CE 92 41 A8 01 84 50 F0 80 68 83 34 1E 28 93 21 34 D1 0B
DA 60 00 10 57 98 46 F2 11 27 40 C2 D3 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 12 31 10 07 00 20 10 07 00 32 10
07 00 31 10 07 00 20 10 07 00 32 10 07 00 00 00 00 00 00 00 00 00 00 0A D1 4C F0 02 90 60 50 84 AC 00 21 36 81 62 24 43 04 60 02 01 01 99 9D 03 0C
04 F2 41 22 10 4C B0 02 A4 11 08 85 88 85 50 00 01 84 0A 95 90 20 D9 02 24 28 8F B2 04 5C 22 4A 00 CC 02 C8 83 90 5B 01 48 26 41 44 06 6D 95 0B 30
25 12 09 1C 10 29 0A 20 C1 12 04 9C 82 73 80 01 3B 20 87 31 34 00 A8 03 09 25 54 8B 13 52 40 00 63 44 90 53 2A 10 F8 00 0A 1F 40 00 02 01 08 FF 16
00 00 95 E1 00 00 04 C7 02 8A 40 09 42 C1 48 83 01 24 8C 11 F2 21 2C 84 10 8E 01 AA D4 40 08 ED 48 04 2C 01 40 A4 20 41 04 06 58 89 84 70 09 A8 C4
93 40 C2 60 16 25 04 30 00 6D 00 10 45 24 AC 00 ED AA 50 45 00 32 87 4F 80 2A 50 C5 35 43 70 90 00 00 B4 42 1F 90 7B 04 04 40 50 04 41 80 04 01 FF
00 FF FF FF FF FF FF 7E 00 FF FF FF 7E 00 FE 00 00 00 00 00 00 00 00 00 F5 A4 01 00 01 00 00 00 00 00 00 00 0D FF FF FF FF FF 08 7E 00 00 9D 18 81
5C 02 A1 16 00 00 95 E1 00 00 00 FF FF 1B 03 C1 E9 01 7E 00 7E 00 00 00 00 06 21 C2 9C 00 00 00 00 00 00 30 01 33 20 00 00 00 00 00 00 00 00 00 00
00 00 FF FF FF FF FF FF FF FF FF FF FF FF 09 10 AE 1A 48 C5 88 67 21 1C 01 18 90 E2 2F 9A 25 09 87 2A 40 13 05 A0 16 62 90 8A 06 29 86 62 05 18 A5
20 8B 89 0C 00 30 88 A8 18 02 B7 00 01 14 12 00 01 10 81 95 03 90 D7 00 82 C2 19 90 88 25 01 58 81 05 36 02 A8 11 62 42 A4 60 94 0B 12 C8 04 C0 4B
02 F3 0C 47 80 01 A4 88 00 3B A1 30 10 04 52 83 01 55 A0 94 29 42 90 F3 20 05 08 63 9C 00 12 9A 4A D1 8C 01 8C 04 34 46 90 8B BC 41 9B 54 82 24 50
80 14 AE 01 31 2C A5 51 81 24 B0 00 11 2D D9 41 07 28 16 86 A2 80 68 10 15 61 24 12 51 20 17 58 CB 1C 90 02 00 D1 EE 01 05 86 8C 38 48 02 01 42 A3


以下问题已经解决:

  问题2描述如下:已解决,为RCSTA接收溢出,我在初始化的时候打开接收中断后,没有马上打开总中断,若在这个时候溢出,就会导致下位机UART死掉。
     下午准备找上午那个问题,结果又发现一个问题。
      在上电后出现,下位机正常运行(显波器测量相应自动采集外设), 但是通信不上了。这个概率很小。                 
串口初始化程序为这个!!

        F_TRIS_USART_RXD(IN);               
        F_TRIS_USART_TXD(OUT);                        F_USART_TXD(HIGH);
        F_TRIS_USART_RTEN(OUT);                        F_USART_RXD(HIGH);
        F_USART_RTEN(LOW);                                
        TXSTA=0x04;                        
        RCSTA=0x90;                        //1101 1000   1001 0000
        BAUDCON=0x08;                //3:RGB16=1 16位baudrate模式,
        Baudrate =        EEPROM_ReadOneByte(PAGE1,EEP1_COM_BAUD_RATE);
        if(Baudrate>=BAUDRATE_MAX_NUM)                        //大于
                {
                        Baudrate=0;        
                        EEPROM_WriteOneByte_Save(PAGE1,EEP1_COM_BAUD_RATE,Baudrate);
                }
        SPBRG                = BaudrateSPBRG[Baudrate][0]        ;                                
        SPBRGH        = BaudrateSPBRG[Baudrate][1]        ;                        
        IPR1bits.RCIP=1;                        //UART接收中断为高优先级                        
        PIE1bits.RCIE=1;     
沙发
NE5532| | 2012-3-15 17:30 | 只看该作者
呵呵,当你老遇到莫名其妙的问题的时候,就要反思一下自己搞设计是不是有原则错误了,比如随手、随意、违反基本的设计规则。简单来说,电路板上每个元件的是用来做什么的,怎么设计,程序架构和实现是否仔细想过。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Ryanhsiung + 1 谢谢提醒!
板凳
Ryanhsiung|  楼主 | 2012-3-15 17:55 | 只看该作者
本帖最后由 Ryanhsiung 于 2012-3-15 19:30 编辑
呵呵,当你老遇到莫名其妙的问题的时候,就要反思一下自己搞设计是不是有原则错误了,比如随手、随意、违反基本的设计规则。简单来说,电路板上每个元件的是用来做什么的,怎么设计,程序架构和实现是否仔细想过。 ...
NE5532 发表于 2012-3-15 17:30


确实可能是我的问题,肯定有仔细想过了!只是想的可能不够周全!

谢谢, 第二个问题2已解决,为RCSTA接收溢出,我在初始化的时候打开接收中断后,没有马上打开总中断,若在这个时候溢出,就会导致下位机UART死掉。

但是第一点还没有想到问题!!

使用特权

评论回复
地板
XIEYUANBIN| | 2012-3-15 20:50 | 只看该作者
头痛医头:UART溢出有标志,你上位机估计是采用一直查询下位机的方法,一旦下位机开机,来不及接收上位机数据指令的时候就会发生溢出,同样,在下位机执行其他中断的时候收到数据不能及时处理,一样会导致溢出。
所以你每次进入中断后先看看溢出标志或者其他错误标志位,如果有就丢掉此次数据。

使用特权

评论回复
5
NE5532| | 2012-3-15 20:51 | 只看该作者
这个也是没有按照要求来做,PIC的串口接收溢出错误不会自动清除,而且将关闭掉串口接收功能,请仔细看下数据手册就知道了。开中断的办法治标不治本,应该有检查溢出标志的代码。

使用特权

评论回复
6
ocon| | 2012-3-16 03:01 | 只看该作者
 
#int_rda //串口接收中断处理
void rx_handler(void)
{
    int b;
    if (OERR || FERR){
        SPEN=0;
        CREN = 0;
        b = RCREG;
        CREN = 1;
        SPEN=1;
    }
    else if (RCIF)
    {
        get_data(); //对接收到的数据进行加工
    }
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Ryanhsiung + 1 我一直没把OERR FERR当会事!谢谢 ...
7
yewuyi| | 2012-3-16 08:06 | 只看该作者
代码的那些事:
1、不要以为代码可以写得很多,就认为水平很高
2、程序出现BUG虽然是可能的,但一个设计屡屡出现致命性的BUG则需要去认真分析一下自己的程序框架结构是否合理?
3、新手不要动不动去尝试写一个庞大的代码,这基本也同时意味着庞大的错误。
4、遇到代码错误时,要学会合理的DEBUG方法以快速的找到问题所在,一般最有效的往往不是带上一个仿真工具跑,而是先按功能模块屏蔽掉一些任务代码,再逐步增加或者逐步减少任务,看看问题是否能定位在那一个或那几个任务内。
5、任务代码要尽量降低耦合度,几个任务之间必须需要全局变量等耦合的,要心中牢牢记得是那些耦合了,要对耦合的各种失效可能进行代码分析。
6、要学会软件仿真,使用手工直接向变量或寄存器赋值的方式,看软件运行一段代码后的结果,很多BUG往往是数据越界了,但又没有对应的越界处理代码。
7、心中要对自己代码的堆栈开销有确定的了解,基本不去看编译结果和IDE的提示,也应该能一口说出自己代码的堆栈开销,即使不能一口说出,也要能够从自己的代码中快速理出堆栈的开销。

使用特权

评论回复
8
Ryanhsiung|  楼主 | 2012-3-16 08:35 | 只看该作者
本帖最后由 Ryanhsiung 于 2012-3-17 18:27 编辑
代码的那些事:
1、不要以为代码可以写得很多,就认为水平很高
2、程序出现BUG虽然是可能的,但一个设计屡屡出现致命性的BUG则需要去认真分析一下自己的程序框架结构是否合理?
3、新手不要动不动去尝试写一个庞大的 ...
yewuyi 发表于 2012-3-16 08:06


谢谢叶工指点:
    堆栈的使用,确实是我的弱点。

    找问题,关键现像重现的概率太低,不好找!
     EEPROM中的数据中的部分被篡改,这个有什么可能性呢??

20120318 18:27
   刚仔细看了一下C18 关于堆栈的说明,仿傎看了一下软件堆栈只用到了0X40,还有2/3没有!!
硬件堆栈只用到了7级(总共32级)

使用特权

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

本版积分规则

认证:嵌入式技术专家
简介:道阻且长,行则将至!

64

主题

4654

帖子

14

粉丝