新手上路
- 积分
- 43
- 金钱
- 43
- 注册时间
- 2018-6-30
- 在线时间
- 8 小时
|
10金钱
求助高手帮忙
我用F407 实现 FreeRTOS+LwIP 的客户端程序 现在的问题是 用网络调试助手建立TCPserver 连接后 收发数据确实没什么问题 ,但是2台F407设备的客户端连接后 只能立即和最后一个连接的客户端 发送数据 ,选择给其他连接的客户端发送数据 大概要在14秒后 客户端才能收到数据 网络调试助手尝试过 其他测试客户端 没有这样的问题 ,我在F407 设备上实现server程序 通过多个网络调试助手模拟客户端程序 一切正常,所以 最后我分析 问题还是在于 F407客户端问题上 调试了几天 实在找不到原因 求大家帮忙分析下 代码如下
void task_TCP(void * pvParameters)
{
//消息队列用
//BaseType_t errr;
//char enter=0;
printf("Task3 start\n");
ip_addr_t serverIpAddr;
struct netbuf *revbuf;
//static struct netbuf *sentbuf;
static ip_addr_t loca_ipaddr;
static u16_t loca_port;
//void *data;
//u32_t len;
u32_t data_len = 0;
err_t err;
struct pbuf *q;
// char Text[]="hello i am client! \n";
IP4_ADDR(&serverIpAddr,server_IP[0],server_IP[1],server_IP[2],server_IP[3]);// 服务器IP地址
tcp_client_conn = netconn_new(NETCONN_TCP);
while(1)
{
if (tcp_client_conn!=NULL)
{
netconn_bind(tcp_client_conn,IP_ADDR_ANY,TCP_SERVER_PORT); //本地绑定端口和IP 绑定后 使用此IP和端口对外发送
err = netconn_connect(tcp_client_conn, &serverIpAddr, TCP_SERVER_PORT);
if(err != ERR_OK)
{
//在连接失败后 需要删除tcp_client_conn 句柄 重新创建才行
printf("TCP connect fail \n");
netconn_delete(tcp_client_conn); //返回值不等于ERR_OK,删除tcp_clientconn连接
vTaskDelay(1000);
tcp_client_conn = netconn_new(NETCONN_TCP); //
}
else if (err == ERR_OK)
{
//tcp_client_conn->recv_timeout = 10;
netconn_getaddr(tcp_client_conn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号
printf("TCP Server 192.168.100.20:9000 连接成功.\r\n");
while(1)
{
if((err = netconn_recv(tcp_client_conn, &revbuf)) == ERR_OK) //接收到数据
{
memset(tcp_client_recvbuf,0,TCP_CLIENT_RX_BUFSIZE); //数据接收缓冲区清零
//考虑需要进入临界区
taskENTER_CRITICAL();
for(q=revbuf->p;q!=NULL;q=q->next) //遍历完整个pbuf链表
{
//判断要拷贝到TCP_CLIENT_RX_BUFSIZE中的数据是否大于TCP_CLIENT_RX_BUFSIZE的剩余空间,如果大于
//的话就只拷贝TCP_CLIENT_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
if(q->len > (TCP_CLIENT_RX_BUFSIZE-data_len)) memcpy(tcp_client_recvbuf+data_len,q->payload,(TCP_CLIENT_RX_BUFSIZE-data_len));//拷贝数据
else memcpy(tcp_client_recvbuf+data_len,q->payload,q->len);
data_len += q->len;
if(data_len > TCP_CLIENT_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出
}
//推出临界区
taskEXIT_CRITICAL();
data_len=0; //复制完成后data_len要清零。
//接收完成标志置1
//tcp_rev_finish=1;
printf("%s\r\n",tcp_client_recvbuf);
netbuf_delete(revbuf);
//解析数据包
if(my_cjson_Parse((char * )tcp_client_recvbuf)==1) //接收命令
{
printf("rev data is suess\n");
memset(tcp_client_recvbuf,0x0,TCP_CLIENT_RX_BUFSIZE);
}
}
else if(err == ERR_CLSD) //关闭连接
{
netconn_close(tcp_client_conn);
netconn_delete(tcp_client_conn);
printf("服务器192.168.100.20:9000断开连接\r\n");
break;
}
}
}
}
else
{
printf("tcp_client_conn!=OK\n");
}
vTaskDelay(1);
}
//netconn_close(conn);
//netconn_delete(conn);
}
|
|