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;
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;
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;
收藏0 举报
查看全部评分
呵呵,当你老遇到莫名其妙的问题的时候,就要反思一下自己搞设计是不是有原则错误了,比如随手、随意、违反基本的设计规则。简单来说,电路板上每个元件的是用来做什么的,怎么设计,程序架构和实现是否仔细想过。 ... NE5532 发表于 2012-3-15 17:30
#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、不要以为代码可以写得很多,就认为水平很高 2、程序出现BUG虽然是可能的,但一个设计屡屡出现致命性的BUG则需要去认真分析一下自己的程序框架结构是否合理? 3、新手不要动不动去尝试写一个庞大的 ... yewuyi 发表于 2012-3-16 08:06
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
等级类勋章
发帖类勋章
时间类勋章
人才类勋章
64
4653
14
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号