打印
[STM32F1]

串口3运行一段时间后只能发送数据,不能中断接收数据

[复制链接]
4466|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
何笑888|  楼主 | 2016-1-21 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
高手们,可有人遇到这个情况
沙发
songchenping| | 2016-1-21 10:51 | 只看该作者
软件和硬件问题都有可能啊。

使用特权

评论回复
板凳
mmuuss586| | 2016-1-21 11:08 | 只看该作者
可能板子虚焊了吧;
也不排除程序BUG;

使用特权

评论回复
地板
airwill| | 2016-1-21 14:55 | 只看该作者
USART 并没有故障锁死功能, 所以正常不会出现不接收数据的情况.
除了硬件虚焊, 寄存器控制给修改, 还有就是 RXD 一直保持低电平.
先检查你的寄存器吧

使用特权

评论回复
5
何笑888|  楼主 | 2016-1-22 16:13 | 只看该作者
谢谢各楼

使用特权

评论回复
6
何笑888|  楼主 | 2016-1-22 16:17 | 只看该作者
void USART3_IRQHandler(void)
{
        u8 i;
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
        {
                USART_ClearITPendingBit(USART3,USART_IT_RXNE);

                                tn_num[key_num++] = USART_ReceiveData(USART3);
                                if(tn_num[key_num-1]==0xf1)
                                {
                                        key_num=1;
                                        tn_num[0]=0xf1;
                                }
                                else if(tn_num[key_num-1]==0xf2)
                                {
                                       
                                        if((tn_num[1]==0xe2)&&(tn_num[23]==playnumsend))
                                        {                                               
                                                for(i=0;i<26;i++)
                                                {
                                                        USART_SendData(USART1, tn_num[i]);
                                                }
                                                if(play_state!=tn_num[22])
                                                {
                                                        if(tn_num[22]==1){disp_state=7;disp_code=0;}
                                                        else if(tn_num[22]==10){if(print_sn==1){disp_state=10;disp_code=0;}}
                                                        if((play_state!=4)&&(play_state!=5)&&(tn_num[22]==4))
                                                        {
                                                                disp_state=11;disp_code=0;
                                                        }                                               
                                                }                                               
                                                if(yf_time!=tn_num[21])
                                                {
                                                        yf_time=tn_num[21];       
                                                        LCD_disp_num(18,1,yf_time%100/10);
                                                        LCD_disp_num(19,1,yf_time%10);
                                                }
                                               
                                                play_state=tn_num[22];
                                                re_delay=0;
                                        }
                                        else if((tn_num[1] ==0xe3))
                                        {
                                                win_odds =         tn_num[2];//ÅâÂÊ
                                                all_in=tn_num[3]*1000000+tn_num[4]*10000+tn_num[5]*100+tn_num[6];
                                                all_out=tn_num[7]*1000000+tn_num[8]*10000+tn_num[9]*100+tn_num[10];
                                                w_year_tp = tn_num[16]*100+tn_num[17];
                                                w_month_tp=        tn_num[18];
                                                w_date_tp= tn_num[19];
                                                w_hour_tp= tn_num[20];
                                                w_minute_tp= tn_num[21];
                                                if(machine_code==100)
                                                {
                                                        USART_SendData(USART3, 0xa1);
                                                        USART_SendData(USART3, read_fpga(0));
                                                        USART_SendData(USART3, read_fpga(1));
                                                        USART_SendData(USART3, read_fpga(2));
                                                        if(print_sn==1)start_printb();
                                                        machine_code=0;       
                                                }
                                        }
                                        else if((tn_num[1]==0xe4))
                                        {
                                                receive_ok=1;
                                                USART_SendData(USART3, 0xa2);                                               
                                                for(i=2;i<102;i++)
                                                {
                                                        card_rank[i-1]=tn_num[i];
                                                }
                                                w_year_tp = tn_num[102]*100+tn_num[103];
                                                w_month_tp=        tn_num[104];
                                                w_date_tp= tn_num[105];
                                                w_hour_tp= tn_num[106];
                                                w_minute_tp= tn_num[107];
                                                run_rs= tn_num[108];
                                                rom[0]=tn_num[102];
                                                rom[1]=tn_num[103];
                                                rom[2]=tn_num[104];
                                                rom[3]=tn_num[105];
                                                rom[4]=tn_num[106];
                                                rom[5]=tn_num[107];
                                                SPI_write_FM25CL64(rom,45,6);
                                                re_delay=0;
                                        }
                                        else if((tn_num[1]==0xe5))
                                        {
                                                re_delay=0;
                                        }
                                        else if((tn_num[1]==0xe6))
                                        {
                                                all_in=tn_num[2]*1000000+tn_num[3]*10000+tn_num[4]*100+tn_num[5];
                                                all_out=tn_num[6]*1000000+tn_num[7]*10000+tn_num[8]*100+tn_num[9];
                                                key_in=tn_num[10]*1000000+tn_num[11]*10000+tn_num[12]*100+tn_num[13];
                                                key_out=tn_num[14]*1000000+tn_num[15]*10000+tn_num[16]*100+tn_num[17];
                                                coin=tn_num[18]*1000000+tn_num[19]*10000+tn_num[20]*100+tn_num[21];
                                                pay_out=tn_num[22]*1000000+tn_num[23]*10000+tn_num[24]*100+tn_num[25];
                                                all_bet=tn_num[26]*1000000+tn_num[27]*10000+tn_num[28]*100+tn_num[29];
                                                all_win=tn_num[30]*1000000+tn_num[31]*10000+tn_num[32]*100+tn_num[33];
                                                my_win=tn_num[34]*1000000+tn_num[35]*10000+tn_num[36]*100+tn_num[37];
                                                bouns_num=tn_num[38]*1000000+tn_num[39]*10000+tn_num[40]*100+tn_num[41];
                                        }
                                        else if((tn_num[1]==0xe7))
                                        {
                                                all_in=tn_num[2]*1000000+tn_num[3]*10000+tn_num[4]*100+tn_num[5];
                                                all_out=tn_num[6]*1000000+tn_num[7]*10000+tn_num[8]*100+tn_num[9];
                                                coin=tn_num[10]*1000000+tn_num[11]*10000+tn_num[12]*100+tn_num[13];
                                                pay_out=tn_num[14]*1000000+tn_num[15]*10000+tn_num[16]*100+tn_num[17];
                                                all_bet=tn_num[18]*1000000+tn_num[19]*10000+tn_num[20]*100+tn_num[21];
                                                all_win=tn_num[22]*1000000+tn_num[23]*10000+tn_num[24]*100+tn_num[25];
                                                for(i=0;i<8;i++)
                                                {
                                                        play_bet[i][0]=tn_num[26+i*16]*1000000+tn_num[27+i*16]*10000+tn_num[28+i*16]*100+tn_num[29+i*16];
                                                        play_bet[i][1]=tn_num[30+i*16]*1000000+tn_num[31+i*16]*10000+tn_num[32+i*16]*100+tn_num[33+i*16];
                                                        play_bet[i][2]=tn_num[34+i*16]*1000000+tn_num[35+i*16]*10000+tn_num[36+i*16]*100+tn_num[37+i*16];
                                                        play_bet[i][3]=tn_num[38+i*16]*1000000+tn_num[39+i*16]*10000+tn_num[40+i*16]*100+tn_num[41+i*16];
                                                }
                                        }
                                        else if((tn_num[1]==0xe8))
                                        {                                       
                                                for(i=2;i<102;i++)
                                                {
                                                        card_rank[i-1]=tn_num[i];
                                                }
                                                bd_print();
                                                re_delay=0;
                                        }
                                }
                                if(key_num>=160)key_num=0;
                        }               
        }       
这个是我的串口3的中断接收程序

使用特权

评论回复
7
何笑888|  楼主 | 2016-1-22 16:19 | 只看该作者
if((tn_num[1]==0xe2)&&(tn_num[23]==playnumsend))
                                         {                                                
                                                 for(i=0;i<26;i++)
                                                 {
                                                         USART_SendData(USART1, tn_num[i]);
                                                 }
                                                 if(play_state!=tn_num[22])
                                                 {
                                                         if(tn_num[22]==1){disp_state=7;disp_code=0;}
                                                         else if(tn_num[22]==10){if(print_sn==1){disp_state=10;disp_code=0;}}
                                                         if((play_state!=4)&&(play_state!=5)&&(tn_num[22]==4))
                                                         {
                                                                 disp_state=11;disp_code=0;
                                                         }                                                
                                                 }                                                
                                                 if(yf_time!=tn_num[21])
                                                 {
                                                         yf_time=tn_num[21];        
                                                         LCD_disp_num(18,1,yf_time%100/10);
                                                         LCD_disp_num(19,1,yf_time%10);
                                                 }
                                                
                                                 play_state=tn_num[22];
                                                 re_delay=0;
                                         }
一般情况下只会运行这一段,收到数据后从串口1发送出去

使用特权

评论回复
8
何笑888|  楼主 | 2016-1-22 16:57 | 只看该作者
USART 并没有故障锁死功能, 所以正常不会出现不接收数据的情况.
除了硬件虚焊, 寄存器控制给修改, 还有就是 RXD 一直保持低电平.
先检查你的寄存器吧       楼上说的寄存器是哪些寄存器呢?

使用特权

评论回复
9
何笑888|  楼主 | 2016-1-22 17:09 | 只看该作者
void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        /* Configure the NVIC Preemption Priority Bits */  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
       
        /* Enable the USARTy Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;         
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;         
        NVIC_Init(&NVIC_InitStructure);
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;         
        NVIC_Init(&NVIC_InitStructure);



        NVIC_InitStructure.NVIC_IRQChannel= TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority= 3;       
        NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;       
        NVIC_Init(&NVIC_InitStructure);
}这个是我的中断设置

使用特权

评论回复
10
bobde163| | 2016-1-22 23:48 | 只看该作者
有示波器的话,可以看看死了之后发送和接收的引脚电平值如何,还有“一段时间”是多长,有连续的进行收发测试吗,如果能在调试模式下查看各寄存器的值应该更好

使用特权

评论回复
11
何笑888|  楼主 | 2016-1-23 09:44 | 只看该作者
死了之后发送和接收的引脚电平值     正常波形

使用特权

评论回复
12
米尔豪斯| | 2016-1-23 14:43 | 只看该作者
是不接受数据,还是接受了但不进中断

使用特权

评论回复
13
lueluelue| | 2016-1-25 16:23 | 只看该作者

使用特权

评论回复
14
稳稳の幸福| | 2016-1-25 19:54 | 只看该作者
你要检测,如果不能发送接收了,应该有个处理方式,就是调用初始化函数。

使用特权

评论回复
15
Brand2| | 2016-1-25 22:04 | 只看该作者
可能是程序理由bug,运行一段时间就飞了

使用特权

评论回复
16
kaizxm| | 2016-1-26 09:21 | 只看该作者

使用特权

评论回复
17
Garen2| | 2016-1-26 10:42 | 只看该作者
发送和接收的引脚是正常波形?那就是发送和接收是正常的,接收处理部分有问题

使用特权

评论回复
18
Ryze| | 2016-1-26 11:27 | 只看该作者
是不是中断要请标志位

使用特权

评论回复
19
deviceplugs| | 2016-1-31 15:59 | 只看该作者
我觉得软件的可能性比较大,你的接收是不是在中断中呢?

使用特权

评论回复
20
qq12344321| | 2017-5-17 17:02 | 只看该作者
亲,我最近也遇到这个问题,还能请教下你,我qq:527050828

使用特权

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

本版积分规则

1

主题

7

帖子

0

粉丝