既然udp说完了,那接下来自然就是TCP通讯了,今天说说TCP客户端通讯,也就是单片机作为客户端,主机PC作为服务器

相比于udp而言,tcp增加了一个连接服务器的流程,首先还是创建tcp_client任务

//创建TCP客户端线程
//返回值:0 TCP客户端创建成功
//        其他 TCP客户端创建失败
INT8U tcp_client_init(void)
{INT8U res;OS_CPU_SR cpu_sr;OS_ENTER_CRITICAL();    //关中断res = OSTaskCreate(tcp_client_thread,(void*)0,(OS_STK*)&TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE-1],TCPCLIENT_PRIO); //创建TCP客户端线程OS_EXIT_CRITICAL();        //开中断return res;
}

任务的执行流程如下

//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;LWIP_UNUSED_ARG(arg);server_port = REMOTE_PORT;IP4_ADDR(&server_ipaddr, 192,168, 1,105);while(dhcpstatus != 2)//等待dhcp成功
    {OSTimeDly(10);//printf("wait dhcp\r\n");
    }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",192,168, 1,105,loca_port);while(1){if(keyValue == KEY_LEFT){tcp_client_flag = LWIP_SEND_DATA;keyValue = 0;}if((tcp_client_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA) //有数据要发送
                {err = netconn_write(tcp_clientconn ,tcp_client_sendbuf,strlen((char*)tcp_client_sendbuf),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",192,168, 1,105);break;}}}OSTimeDly(10);}
}

里面核心的就是netconn的使用,这个熟能生巧

忘了传代码,补上

http://download.csdn.net/detail/dengrengong/8599071

转载于:https://www.cnblogs.com/dengxiaojun/p/4433729.html

LWIP_STM32_ENC28J60_NETCONN_TCP_CLIENT(4)相关推荐

  1. OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

    OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...

  2. 2022-2028年中国第五代移动通信技术(5G)市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国第五代移动通信技术(5G)行业市场行业相 ...

  3. 2021-2027全球与中国经颅磁刺激仪(TMS)市场现状及未来发展趋势

    [报告类型]产业研究 [报告价格]¥4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国经颅磁刺激仪(TMS)行业市场行 ...

  4. Go 学习笔记(84)— Go 项目目录结构

    1. 目录规范 一个好的目录结构至少要满足以下几个要求. 命名清晰:目录命名要清晰.简洁,不要太长,也不要太短,目录名要能清晰地表达出该目录实现的功能,并且目录名最好用单数.一方面是因为单数足以说明这 ...

  5. Redis 笔记(16)— info 指令和命令行工具(查看内存、状态、客户端连接数、监控服务器、扫描大key、采样服务器、执行批量命令等)

    Info 命令返回关于 Redis 服务器的各种信息和统计数值.通过给定可选的参数 section ,可以让命令只返回某一部分的信息. 1. 显示模块 server : 一般 Redis 服务器信息, ...

  6. Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程

    Redis 使用了单线程架构.非阻塞 I/O .多路复用模型来实现高性能的内存数据库服务.Redis 是单线程的.那么为什么说是单线程呢? Redis 在 Reactor 模型内开发了事件处理器,这个 ...

  7. Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)

    1. 发布-订阅概念 发布-订阅 模式包含两种角色,分别为发布者和订阅者. 订阅者可以订阅一个或者若干个频道(channel): 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消 ...

  8. Redis 笔记(08)— 事务(一次执行多条命令、命令 watch/multi/exec/discard、错误处理)

    1. 事务概念 Redis 中的事务 (transaction)是一组命令的集合.事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的 ...

  9. Redis 笔记(07)— sorted set 类型(添加、删除有序集合元素、获取分数范围内成员、按score排序、返回集合元素个数)

    zset 可能是 Redis 提供的最为特色的数据结构,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权 ...

最新文章

  1. HTML5 本地文件操作之FileSystemAPI整理(二)
  2. webbrowser1 脚本报错_c# winform程序 webBrowser 当前页面的脚本发生异常 找不到成员...
  3. Optical_Flow(2)
  4. win7装mysql一直未响应6_win7重装mysql最后一步无响应解决方法
  5. php文章远程图片,php实现异步将远程链接上内容(图片或内容)写到本地的方法
  6. docker kibana mysql_docker 安装常用组件:[redis,mysql,mongodb,elasticsearch,kibana,exceptionless]...
  7. ecs mysql 安装_CentOS8 安装MySQL8(ECS系列二)
  8. (CSS3)CSS3- 最常用的属性(一)
  9. spring mvc xss html,note/SpringMvc防御XSS实践.md at master · yangc91/note · GitHub
  10. 非biztalk项目的部署
  11. JS中showModalDialog (模态窗口)详细使用
  12. 软考历程(4)——安全问题之病毒
  13. 视频教程-H3C-H3CNE 华三网络工程师从入门到精通 自学视频课程[肖哥]-H3C认证
  14. Luogu P3174 [HAOI2009]毛毛虫 (树形dp)
  15. (转载)重新编译SJF2410以适应NM9805并口卡(PCMICIA接口)
  16. Netty高级进阶之基于Netty的Websocket开发网页聊天室
  17. 【操作说明】全能型H.265播放器如何使用
  18. SpringMVC的学习
  19. C++ Opencv之3D透视变换
  20. 优化案例2:select标量子查询且主查询排序

热门文章

  1. Emscripten 单词_免费下载 | 北师大版高中英语教材重点单词汇总(可下载mp3版本)...
  2. 生新技能树单细胞GBM数据分析(SignleR以及Seurat 联合分析及细胞簇注释
  3. python matplotlib 保存图片失真_Python matplotlib线框失真
  4. 利用Python进行数据分析--数据聚合与分组运算
  5. R语言的特征选择(Feature Selection)包:Boruta和caret
  6. 子类重写方法aop切不到_Spring-aop 全面解析(从应用到原理)
  7. 决策树(十三)--XGBoost参数调优完全指南
  8. 人脸对齐(十二)--PIFA2017
  9. 三维计算机视觉(二)--点云滤波
  10. OSError: [WinError 126] 找不到指定的模块。【专治疑难杂症】