HardFault_Handler 死循环

2019-08-20 18:49发布

程序用的光盘上的RAW_TCP服务器程序,在tcp_server_test函数里增加了些代码,程序如下。每次客户端发送数据时,就会进入到HardFault_Handler死循环里。麻烦大神给看下是什么原因/
void tcp_server_test(void)
{
        err_t err;  
        struct tcp_pcb *tcppcbnew;          //定义一个TCP服务器控制块
        struct tcp_pcb *tcppcbconn;          //定义一个TCP服务器控制块
       
        u8 *tbuf;
        u8 key;
        u8 res=0;               
        u8 t=0;
        u16 byte_len,i,byte_addr;
        u8 byte_cmd,byte_subcmd;
        int byte_cs;
       
        LCD_Clear(WHITE);        //清屏
        POINT_COLOR=RED;         //红 {MOD}字体
        LCD_ShowString(30,30,200,16,16,"WARSHIP STM32F103");
        LCD_ShowString(30,50,200,16,16,"TCP Server Test");
        LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");  
        LCD_ShowString(30,90,200,16,16,"KEY0:Send data");  
        LCD_ShowString(30,110,200,16,16,"KEY_UPuit");  
        tbuf=mymalloc(SRAMIN,200);        //申请内存
        if(tbuf==NULL)return ;                //内存申请失败了,直接退出
        sprintf((char*)tbuf,"Server IP:%d.%d.%d.%d",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);//服务器IP
        LCD_ShowString(30,130,210,16,16,tbuf);  
        sprintf((char*)tbuf,"Server Port:%d",TCP_SERVER_PORT);//服务器端口号
        LCD_ShowString(30,150,210,16,16,tbuf);
        tcppcbnew=tcp_new();        //创建一个新的pcb
        if(tcppcbnew)                        //创建成功
        {
                err=tcp_bind(tcppcbnew,IP_ADDR_ANY,TCP_SERVER_PORT);        //将本地IP与指定的端口号绑定在一起,IP_ADDR_ANY为绑定本地所有的IP地址
                if(err==ERR_OK)        //绑定完成
                {
                        tcppcbconn=tcp_listen(tcppcbnew);                         //设置tcppcb进入监听状态
                        tcp_accept(tcppcbconn,tcp_server_accept);         //初始化LWIP的tcp_accept的回调函数
                }else res=1;  
        }else res=1;
        POINT_COLOR=BLUE;//蓝 {MOD}字体
        while(res==0)
        {
                key=KEY_Scan(0);
                if(key==WKUP_PRES)break;
                if(key==KEY0_PRES)//KEY0按下了,发送数据
                {
                        tcp_server_flag|=1<<7;//标记要发送数据
                }
                if(tcp_server_flag&1<<6)//是否收到数据?
                {
                //        LCD_Fill(30,210,lcddev.width-1,lcddev.height-1,WHITE);//清上一次数据
                //        LCD_ShowString(30,210,lcddev.width-30,lcddev.height-210,16,tcp_server_recvbuf);//显示接收到的数据       
                        if(tcp_server_recvbuf[0]==0x68)
                        {
                               
                                byte_cs=0;
                                byte_len=tcp_server_recvbuf[1]+(tcp_server_recvbuf[2]<<8);
                                byte_addr=tcp_server_recvbuf[4]+(tcp_server_recvbuf[5]<<8);
                                byte_cmd=tcp_server_recvbuf[6];
                                byte_subcmd=tcp_server_recvbuf[7];
                                for(i=0;i<byte_len;i++)
                                        byte_cs=byte_cs+tcp_server_recvbuf[4+i];
                                byte_cs=~byte_cs;
                                byte_cs+=1;
                                byte_cs=byte_cs&0xFF;
                                tcp_server_sendbuf="";
                                tcp_server_sendbuf[0]=0x68;                        //帧起始符
                                tcp_server_sendbuf[3]=0x63;                        //界定符
                                tcp_server_sendbuf[4]=(u8)byte_addr;        //地址低位
                                tcp_server_sendbuf[5]=(u8)(byte_addr>>8);        //地址高位
                                tcp_server_sendbuf[6]=byte_cmd;        //功能号
                                tcp_server_sendbuf[7]=byte_subcmd+100;//子功能号
                                tcp_server_sendbuf[1]=0;//长度低位
                                tcp_server_sendbuf[2]=5;//长度高位
                                if ((u8)byte_cs==tcp_server_recvbuf[4+i])
                                        tcp_server_sendbuf[8]=0x66;
                                else
                                        tcp_server_sendbuf[8]=0x33;
                                byte_cs=0;
                                for(i=0;i<5;i++)
                                        byte_cs=byte_cs+tcp_server_sendbuf[4+i];
                                byte_cs=~byte_cs;
                                byte_cs+=1;
                                byte_cs=byte_cs&0xFF;
                                tcp_server_sendbuf[4+i]=(u8)byte_cs;
                                tcp_server_sendbuf[5+i]=0x16;
                                tcp_server_flag|=1<<7;//标记要发送数据
                        }
                        tcp_server_flag&=~(1<<6);//标记数据已经被处理了.
                }
                if(tcp_server_flag&1<<5)//是否连接上?
                {
                        sprintf((char*)tbuf,"Client IP:%d.%d.%d.%d",lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]);//客户端IP
                        LCD_ShowString(30,170,230,16,16,tbuf);
                        POINT_COLOR=RED;
                        LCD_ShowString(30,190,lcddev.width-30,lcddev.height-190,16,"Receive Data:");//提示消息               
                        POINT_COLOR=BLUE;//蓝 {MOD}字体
                }else if((tcp_server_flag&1<<5)==0)
                {
                        LCD_Fill(30,170,lcddev.width-1,lcddev.height-1,WHITE);//清屏
                }
                lwip_periodic_handle();
                lwip_pkt_handle();
                delay_ms(2);
                t++;
                if(t==200)
                {
                        t=0;
                        LED0=!LED0;
                }
        }   
        tcp_server_connection_close(tcppcbnew,0);//关闭TCP Server连接
        tcp_server_connection_close(tcppcbconn,0);//关闭TCP Server连接
        tcp_server_remove_timewait();
        memset(tcppcbnew,0,sizeof(struct tcp_pcb));
        memset(tcppcbconn,0,sizeof(struct tcp_pcb));
        myfree(SRAMIN,tbuf);
        LCD_Clear(WHITE);                        //清屏
        POINT_COLOR = RED;
        LCD_ShowString(30,30,200,16,16,"WARSHIP STM32F103");
        LCD_ShowString(30,50,200,16,16,"TCP Server Test");
        LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
       
        POINT_COLOR=BLUE;
        LCD_ShowString(30,90,200,16,16,"Connect break!");  
        LCD_ShowString(30,110,200,16,16,"KEY1:Connect");
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。