LWIP_STM32_ENC28J60_NETCONN_TCP_CLIENT(4)
既然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)相关推荐
- OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3
OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...
- 2022-2028年中国第五代移动通信技术(5G)市场研究及前瞻分析报告
[报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国第五代移动通信技术(5G)行业市场行业相 ...
- 2021-2027全球与中国经颅磁刺激仪(TMS)市场现状及未来发展趋势
[报告类型]产业研究 [报告价格]¥4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国经颅磁刺激仪(TMS)行业市场行 ...
- Go 学习笔记(84)— Go 项目目录结构
1. 目录规范 一个好的目录结构至少要满足以下几个要求. 命名清晰:目录命名要清晰.简洁,不要太长,也不要太短,目录名要能清晰地表达出该目录实现的功能,并且目录名最好用单数.一方面是因为单数足以说明这 ...
- Redis 笔记(16)— info 指令和命令行工具(查看内存、状态、客户端连接数、监控服务器、扫描大key、采样服务器、执行批量命令等)
Info 命令返回关于 Redis 服务器的各种信息和统计数值.通过给定可选的参数 section ,可以让命令只返回某一部分的信息. 1. 显示模块 server : 一般 Redis 服务器信息, ...
- Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程
Redis 使用了单线程架构.非阻塞 I/O .多路复用模型来实现高性能的内存数据库服务.Redis 是单线程的.那么为什么说是单线程呢? Redis 在 Reactor 模型内开发了事件处理器,这个 ...
- Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)
1. 发布-订阅概念 发布-订阅 模式包含两种角色,分别为发布者和订阅者. 订阅者可以订阅一个或者若干个频道(channel): 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消 ...
- Redis 笔记(08)— 事务(一次执行多条命令、命令 watch/multi/exec/discard、错误处理)
1. 事务概念 Redis 中的事务 (transaction)是一组命令的集合.事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的 ...
- Redis 笔记(07)— sorted set 类型(添加、删除有序集合元素、获取分数范围内成员、按score排序、返回集合元素个数)
zset 可能是 Redis 提供的最为特色的数据结构,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权 ...
最新文章
- HTML5 本地文件操作之FileSystemAPI整理(二)
- webbrowser1 脚本报错_c# winform程序 webBrowser 当前页面的脚本发生异常 找不到成员...
- Optical_Flow(2)
- win7装mysql一直未响应6_win7重装mysql最后一步无响应解决方法
- php文章远程图片,php实现异步将远程链接上内容(图片或内容)写到本地的方法
- docker kibana mysql_docker 安装常用组件:[redis,mysql,mongodb,elasticsearch,kibana,exceptionless]...
- ecs mysql 安装_CentOS8 安装MySQL8(ECS系列二)
- (CSS3)CSS3- 最常用的属性(一)
- spring mvc xss html,note/SpringMvc防御XSS实践.md at master · yangc91/note · GitHub
- 非biztalk项目的部署
- JS中showModalDialog (模态窗口)详细使用
- 软考历程(4)——安全问题之病毒
- 视频教程-H3C-H3CNE 华三网络工程师从入门到精通 自学视频课程[肖哥]-H3C认证
- Luogu P3174 [HAOI2009]毛毛虫 (树形dp)
- (转载)重新编译SJF2410以适应NM9805并口卡(PCMICIA接口)
- Netty高级进阶之基于Netty的Websocket开发网页聊天室
- 【操作说明】全能型H.265播放器如何使用
- SpringMVC的学习
- C++ Opencv之3D透视变换
- 优化案例2:select标量子查询且主查询排序
热门文章
- Emscripten 单词_免费下载 | 北师大版高中英语教材重点单词汇总(可下载mp3版本)...
- 生新技能树单细胞GBM数据分析(SignleR以及Seurat 联合分析及细胞簇注释
- python matplotlib 保存图片失真_Python matplotlib线框失真
- 利用Python进行数据分析--数据聚合与分组运算
- R语言的特征选择(Feature Selection)包:Boruta和caret
- 子类重写方法aop切不到_Spring-aop 全面解析(从应用到原理)
- 决策树(十三)--XGBoost参数调优完全指南
- 人脸对齐(十二)--PIFA2017
- 三维计算机视觉(二)--点云滤波
- OSError: [WinError 126] 找不到指定的模块。【专治疑难杂症】