打印
[STM32F1]

103VET6串口求救(找到原因,但不知道是为什么)。

[复制链接]
1127|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yzzly|  楼主 | 2016-7-20 08:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yzzly 于 2016-7-22 18:10 编辑

同一个串口2种电力系统通信协议,同一个接收中断程序,当传输电力系统104协议时,一切正常;当传输电力系统101协议,在接收“68 09 09 68 73 01 64 01 06 01 00 00 14 f4 16 ”或“68 09 09 68 53 01 64 01 06 01 00 00 14 d4 16 ”时,在收到倒数第二个数据“F4”或者“D4”(本次接收未引起中断)后,CR1的配置由2B2C变成了2B2E,也就是接收器被设置成静默模式,怎么回事?我要疯了!

未命名.bmp (1.03 MB )

未命名.bmp
沙发
yzzly|  楼主 | 2016-7-20 08:46 | 只看该作者
本帖最后由 yzzly 于 2016-7-20 09:05 编辑

void USART3_IRQHandler(void)                                                                                                                                                //USART3ÖжÏ
{
        Uint08 RxdData;
        if((USART3->SR & 0x20)&&(UART3_RxNEIE))        
        {
                RxdData=USART_ReceiveData(USART3);
                Flags.Rxd3=1;        
                Flags.Rxd3Timer=0;
                Rxd3_buf[Rxd3_Cnt++]=RxdData;
                if(Rxd3_Cnt == UART3_BUF_LEN)               
                {
                        Rxd3_Cnt=0;
                        Flags.Rxd3=0;
                }
        }
        if((USART3->SR & 0x80)&&(UART3_TxEIE))        
        {   
                if(Txd3_Cnt<Txd3_len)
                {
                        USART3->DR = *Txd3_point++;
                        Txd3_Cnt++;
                }
                else
                {
                        USART3->CR1=USART3->CR1 & (~0x80);                                
                }
//                USART3->DR = 0x55;
        }
}
void Usart3RxdProcess(void)
{
        Flags.Rxd3Over=0;                                                                                                                                //·ÅÔÚÕâÀï²Å²»Ó°ÏìÓ¦´ðÖ÷Õ¾µÄÏÂÒ»°üÃüÁî
        if(Rxd3_buf[0]==0xAA && Rxd3_buf[1]==0xAA)                                                                                //ÊÕµ½ÉϺ£¼¯î£Ä£¿é¶ÌÏûÏ¢Êý¾Ý°ü
        {
                ShortMessageDecode();                                                                                                                //¶ÌÏûÏ¢½âÂë
        }
        else if(Rxd3_buf[0]==0xAA && Rxd3_buf[1]==0x55 && Rxd3_buf[4]==0x17)                                //ÊÕµ½±±¾©Ó³º²Í¨Ä£¿é»ØÓ¦µÄ¶ÌÏûÏ¢·¢Ëͽá¹û(ʧ°Ü»òÕ߳ɹ¦)
        {
        }
        else if(Rxd3_buf[0]==0xAA && Rxd3_buf[1]==0x55 && Rxd3_buf[4]==0x13)                                //ÊÕµ½±±¾©Ó³º²Í¨Ä£¿éµÄ¶ÌÏûÏ¢Êý¾Ý°ü
        {
                ShortMessageDecode();                                                                                                                //¶ÌÏûÏ¢½âÂë
        }
        else if(Rxd3_buf[0]==0x68 && Rxd3_buf[1]==Rxd3_buf[2] && Rxd3_buf[3]==0x68)                       //ÊÕµ½101ЭÒé¿É±äÖ¡³¤Êý¾Ý°ü               
        {
                Decode101Protocol((Uint08 *)Rxd3_buf,(Uint08 *)Txd3_buf,Com3,Com3RxdByteNum);
        }
        else if(Rxd3_buf[0]==0x10 && (Com3RxdByteNum==5 || Com3RxdByteNum==6))                        //ÊÕµ½101¹æÔ¼¹Ì¶¨Ö¡³¤Êý¾Ý°ü
        {
                Decode101Protocol((Uint08 *)Rxd3_buf,(Uint08 *)Txd3_buf,Com3,Com3RxdByteNum);
        }
        else if(Rxd3_buf[0]==0xE5 && Com3RxdByteNum==1)                                                                        //ÊÕµ½101ЭÒéµ¥×Ö½Ú0xE5Êý¾Ý°ü
        {
                Decode101Protocol((Uint08 *)Rxd3_buf,(Uint08 *)Txd3_buf,Com3,Com3RxdByteNum);
        }
        else if(Rxd3_buf[0]==0x68 && Rxd3_buf[1]==4 && Com3RxdByteNum==6)                                        //ÊÕµ½104ЭÒé¹Ì¶¨Ö¡³¤Êý¾Ý°ü
        {
                Decode104Protocol((Uint08 *)Rxd3_buf,(Uint08 *)Txd3_buf,Com3,Com3RxdByteNum);
        }
        else if(Rxd3_buf[0]==0x68)                                                                                                                //ÊÕµ½104ЭÒé¿É±äÖ¡³¤Êý¾Ý°ü       
        {
                Decode104Protocol((Uint08 *)Rxd3_buf,(Uint08 *)Txd3_buf,Com3,Com3RxdByteNum);
        }
}

使用特权

评论回复
板凳
mmuuss586| | 2016-7-20 09:26 | 只看该作者
中断程序加溢出处理看看;

使用特权

评论回复
地板
neeringstu| | 2016-7-20 14:36 | 只看该作者
yzzly 发表于 2016-7-20 08:46
void USART3_IRQHandler(void)                                                                         ...

中断程序里面处理的太多了,感觉是这样

使用特权

评论回复
5
xmshao| | 2016-7-20 17:36 | 只看该作者
两个协议的差别主要是什么?

CR1变了的话,感觉程序有跑飞现象。注意是否出现数组数据越界现象。

另外你把波特率放低点看看?

使用特权

评论回复
6
天灵灵地灵灵| | 2016-7-20 22:57 | 只看该作者
是不是初始化配置在某个地方恢复默认了。需要重新初始化。

使用特权

评论回复
7
yzzly|  楼主 | 2016-7-21 18:19 | 只看该作者
本帖最后由 yzzly 于 2016-7-21 18:25 编辑

找到原因了:
读FLASH存储器M25P40的函数由:
void InitEventRecordBuf(void)
{
        Uint32 Cnt,RecordByteNum,RecordPageNum;
        M25p40PageRead((Uint32 *)&EventRecord[0],EventRecordSectorNum,EventRecordStartPage,sizeof(EventRecordType)/sizeof(Uint32),4);        
        if(EventRecord[0].EventType > MaxSaveRecordNum)
        {
                EventRecord[0].EventType=0;                                                                                                                                                                                                
                M25p40PageProgram((Uint32 *)&EventRecord[0],EventRecordSectorNum,EventRecordStartPage,sizeof(EventRecordType)/sizeof(Uint32),4);
        }
        else                                                                                                                                                                                                                                                                                                
        {
                RecordByteNum=(EventRecord[0].EventType+1)*sizeof(EventRecordType);  
                RecordPageNum=RecordByteNum/256;                                                                                                                                                                       
                if(RecordByteNum > RecordPageNum * 256)RecordPageNum++;                                                                              
                for(Cnt=0;Cnt<RecordPageNum;Cnt++)
                {
                        M25p40PageRead((Uint32 *)&EventRecord[Cnt*(256/sizeof(EventRecordType))],EventRecordSectorNum,Cnt+EventRecordStartPage,256/sizeof(Uint32),4);
                }
        }
}
改成了:
void InitEventRecordBuf(void)
{
        Uint32 Cnt,RecordByteNum,RecordPageNum;
        Uint08 *P1;
        M25p40PageRead((Uint32 *)&EventRecord[0],EventRecordSectorNum,EventRecordStartPage,sizeof(EventRecordType)/sizeof(Uint32),4);  
        if(EventRecord[0].EventType > MaxSaveRecordNum)
        {
                EventRecord[0].EventType=0;                                                                                                                                                                                          
                M25p40PageProgram((Uint32 *)&EventRecord[0],EventRecordSectorNum,EventRecordStartPage,sizeof(EventRecordType)/sizeof(Uint32),4);
        }
        else                                                                                                                                                                                                                                                                                               
        {
                RecordByteNum=(EventRecord[0].EventType+1)*sizeof(EventRecordType);                              
                if(RecordByteNum % 256 ==0)RecordPageNum = RecordByteNum / 256;
                else RecordPageNum = RecordByteNum / 256 + 1;
                P1=(Uint08 *)&EventRecord[0];
                for(Cnt=0;Cnt<RecordPageNum;Cnt++)
                {
                        M25p40PageRead((Uint32 *)(P1+Cnt*256),
                        EventRecordSectorNum,EventRecordStartPage+Cnt,256/sizeof(Uint32),4);
                }
        }
}就影响101协议的正常接收通信,感觉是与P1指针有关,但不知道为什么,即使else内语句不执行也一样。
之所以改动,是因为上面的函数有问题,改动后的函数操作结果完全正确,但是.......

使用特权

评论回复
8
yzzly|  楼主 | 2016-7-22 18:09 | 只看该作者
有谁知道是什么原因?

使用特权

评论回复
9
yzzly|  楼主 | 2016-7-26 14:26 | 只看该作者
天热坛子里也不活跃了!

使用特权

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

本版积分规则

428

主题

1183

帖子

3

粉丝