1、首先建立客户端的线程,我的实例实在UCOS-II上
//创建TCP客户端线程
//返回值:0 TCP客户端创建成功
// 其他 TCP客户端创建失败
INT8U tcp_client_init(void)
{
INT8U res;
OS_CPU_SR cpu_sr;
//关中断
OS_ENTER_CRITICAL();
//创建TCP客户端线程
res = OSTaskCreate(tcp_client_thread,(void*)0,(OS_STK*)&TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE-1],TCPCLIENT_PRIO);
//开中断
OS_EXIT_CRITICAL();
return res;
}
2、关于LWIP的客户端线程的内容
/******************************************************************************************************/
//非常重要的函数
//tcp客户端任务函数
static void tcp_client_thread(void *arg)
{
OS_CPU_SR cpu_sr;
u32 data_len = 0;
struct pbuf *q;
err_t err,recv_err;
static ip_addr_t server_ipaddr,loca_ipaddr;
static u16_t server_port,loca_port;
u8 err1;
// u8 err2;
LWIP_UNUSED_ARG(arg);//暂时不知道
// server_port = REMOTE_PORT;
/********************20170516 change server port**************************/
server_port = localPara.serverPort;//服务器端端口
IP4_ADDR(&server_ipaddr, lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);
// IWDG_Init(6,2000); //与分频数为4*2^6/32,重载值为2000,溢出时间为16s
while (1)
{
tcp_clientconn = netconn_new(NETCONN_TCP); //创建一个TCP链接
err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port);//连接服务器
if(err != ERR_OK) netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接
else if (err == ERR_OK) //处理新连接的数据
{
struct netbuf *recvbuf;
tcp_clientconn->recv_timeout = 2;
netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号
printf("连接上服务器%d.%d.%d.%d,本机端口号为:%d\r\n",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3],loca_port);
while(1)
{
if((tcp_client_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA) //有数据要发送
{
IWDG_Feed();//喂狗
OSSemPend(sem_io,0,&err1);
// err = netconn_write(tcp_clientconn ,tcp_client_sendbuf,strlen((char*)tcp_client_sendbuf),NETCONN_COPY); //发送tcp_server_sentbuf中的数据
err = netconn_write(tcp_clientconn ,tcp_client_sendbuf,buffLen,NETCONN_COPY); //发送tcp_server_sentbuf中的数据
// err = netconn_write(tcp_clientconn ,tcp_c_sendArry,strlen((char*)tcp_c_sendArry),NETCONN_COPY); //发送tcp_server_sentbuf中的数据
if(err != ERR_OK)
{
printf("发送失败\r\n");
}
tcp_client_flag &= ~LWIP_SEND_DATA;
}
if((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK) //接收到数据
{
/*************************************20170518 suspend the send task********************************************///挂起定时发送传感器状态任务
// switch(localPara.type)
// {
// case TYPE_SIO:
// OSTaskSuspend(IOBOARD_TASK_PRIO);break;
// case TYPE_PWD:
// OSTaskSuspend(PWD_TASK_PRIO);break;
// default:
OSTaskSuspend(IOBOARD_TASK_PRIO);
// }
/*************************************20170518 suspend the send task end********************************************///
OS_ENTER_CRITICAL(); //关中断
memset(tcp_client_recvbuf,0,TCP_CLIENT_RX_BUFSIZE); //数据接收缓冲区清零
for(q=recvbuf->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客户端接收数组,跳出
}
OS_EXIT_CRITICAL(); //开中断
data_len=0; //复制完成后data_len要清零。
printf("%s",tcp_client_recvbuf);
/************************process the received Data 20170517*********************************************************/
SsrReportAnal(tcp_client_recvbuf);
/***********************process the received Data 20170517 end**********************************************************/
netbuf_delete(recvbuf);
/*************************************20170518 resume the send task********************************************/
// switch(localPara.type)
// {
// case TYPE_SIO:
// OSTaskResume(IOBOARD_TASK_PRIO);break;
// case TYPE_PWD:
// OSTaskResume(PWD_TASK_PRIO);break;
// default:
OSTaskResume(IOBOARD_TASK_PRIO);
//
// }
/*************************************20170518 resume the send task end********************************************/
}else if(recv_err == ERR_CLSD) //关闭连接
{
netconn_close(tcp_clientconn);
netconn_delete(tcp_clientconn);
printf("服务器%d.%d.%d.%d断开连接\r\n",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);
break;
}
OSTimeDlyHMSM(0,0,0,10); //延时200ms
}
}
OSTimeDlyHMSM(0,0,0,10); //延时200ms
}
}
这就是使用UCOS-II和LWIP,然后建立的客户端程序,当然在此之前,您应该需要进行,LWIP的初始化,包括,你是用的PHY的初始化、TCPIP内核的初始化、设置默认的IP信息等。