新手上路
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2016-8-24
- 在线时间
- 65 小时
|
10金钱
程序采用的是原子的netconn tcp客户端例程,只是在例程里加了ADC采集的程序,然后将采集的ADC转为字符,并发送至网络调试助手。主体修改部分在tcp_client_demo.c里面。然后就是将按键任务堆栈改为200.
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 = 10;
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) //有数据要发送
{
int i=0;
for(i=0;i<K;i++)
{
value=Get_Adc(ADC_Channel_10);
table[0]=value/1000+0x30;//千位
table[1]=value/100%10+0x30;//百位
table[2]=value/10%100%10+0x30;//十位
table[3]=value%1000%100%10+0x30;//个位
strcat((char*)table,"\r\n");
err = netconn_write(tcp_clientconn ,table,strlen((char*)table),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) //接收到数据
{
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\r\n",tcp_client_recvbuf);
netbuf_delete(recvbuf);
}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;
}
}
}
}
其中K值为20。
例程执行过程是按下Key0,发送20个采集的ADC数据至网络调试助手,测试的结果是,有时候可以发送20个,甚至4到5次20个数据至上位机,但有时候就只能发送一个,再按Key0,始终不能发送,需要重启才行。
程序在附件里面,麻烦各位大神们教教我,谢谢。。
|
最佳答案
查看完整内容[请看2#楼]
发现问题所在了,,,不用strcat函数就可以,用了就不行,,不用发4000个都没有问题,纠结啊。。。。。有哪位高手可以解说下这个问题吗
int i=0;
for(i=0;ip=pbuf_alloc(PBUF_TRANSPORT, strlen((char*)table),PBUF_POOL); //申请内存
pbuf_take(es->p,(char*)table,strlen((char*)table)); //将tcp_client_sentbuf[]中的数据拷贝到es->p_tx中
tcp_client_senddata(tpcb,es);//将tcp_client_sentbuf[]里面 ...
|