本帖最后由 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;
|