程序用的光盘上的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_UP
uit");
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");
}
一周热门 更多>