FreeModbus TCP传输初始化
先看一下初始化函数,参数只有端口。
/* modbus协议栈初始化 */
eMBErrorCode eMBTCPInit(USHORT ucTCPPort);
在网络通信过程中,502端口是专门为modbus保留的,其它应用不得占用该端口。在缺省配置的情况下,强制使用502端口。
modbus协议栈的初始化,主要工作为tcp初始化,注册一些接口,设置节点号。
特别要注意节点号问题,由于网络中通过IP地址寻址,因此节点号对于本机来说就没什么用了,本机必须使用0xFF。
但是对于专门用于通过以太网TCP-IP网络和MODBUS串行链路之间的网关对MODBUS或MODBUS+串行链路从站的通信来说。网关转发数据包给串行链路时,节点号被用来寻址从节点。
modbus tcp端口初始化,主要就是创建modbus tcp服务器,监听端口,等待客户端连接。
/* modbus tcp端口初始化 */
BOOL xMBTCPPortInit(USHORT usTCPPort)
{struct tcp_pcb *pxPCBListenNew, *pxPCBListenOld;BOOL bOkay = FALSE;USHORT usPort;/* 默认端口502 */if(usTCPPort == 0){usPort = MB_TCP_DEFAULT_PORT;}else{usPort = (USHORT)usTCPPort;}/* 创建tcp控制块 */if((pxPCBListenNew = pxPCBListenOld = tcp_new()) == NULL){bOkay = FALSE;}/* 绑定端口 */else if(tcp_bind(pxPCBListenNew, IP_ADDR_ANY, (u16_t)usPort) != ERR_OK){(void)tcp_close(pxPCBListenOld);bOkay = FALSE;}/* 监听端口 */else if((pxPCBListenNew = tcp_listen(pxPCBListenNew)) == NULL){(void)tcp_close(pxPCBListenOld);bOkay = FALSE;}/* 注册连接回调函数 */else{tcp_accept(pxPCBListenNew, prvxMBTCPPortAccept);pxPCBListen = pxPCBListenNew;#ifdef MB_TCP_DEBUGvMBPortLog( MB_LOG_DEBUG, "MBTCP-ACCEPT", "Protocol stack ready.\r\n" );
#endif}bOkay = TRUE;return bOkay;
}
modbus tcp服务器同时只能接受一个客户端的连接。
/* 客户端连接回调函数 */
err_t prvxMBTCPPortAccept(void *pvArg, struct tcp_pcb *pxPCB, err_t xErr)
{err_t error;if(xErr != ERR_OK){return xErr;}/* 之前没有客户端连接 */if(pxPCBClient == NULL){pxPCBClient = pxPCB;/* 注册接收回调函数 */tcp_recv(pxPCB, prvxMBTCPPortReceive);/* 注册错误回调函数 */tcp_err(pxPCB, prvvMBTCPPortError);/* 回调函数参数 */tcp_arg(pxPCB, pxPCB);/* 接收字节数置0 */usTCPBufPos = 0;#ifdef MB_TCP_DEBUGvMBPortLog(MB_LOG_DEBUG, "MBTCP-ACCEPT", "Accepted new client %d.%d.%d.%d\r\n",ip4_addr1(&(pxPCB->remote_ip)), ip4_addr2(&(pxPCB->remote_ip)),ip4_addr3(&(pxPCB->remote_ip)), ip4_addr4(&(pxPCB->remote_ip)));
#endiferror = ERR_OK;}/* 已经有客户端连接,不允许第二个客户端连接 */else{prvvMBPortReleaseClient(pxPCB);error = ERR_OK;}return error;
}
FreeModbus TCP传输初始化相关推荐
- FreeModbus TCP传输
首先,在使能modbus协议栈的时候,会调用pvMBFrameStartCur函数 /* 使能modbus */ eMBErrorCode eMBEnable(void) {eMBErrorCode ...
- Qt下Tcp传输文件
Qt下Tcp传输文件 文章目录 Qt下Tcp传输文件 1.服务端 2.客户端 1.服务端 //ServerWidgets.h #ifndef SERVERWIDGET_H #define SERVER ...
- TCP传输连接建立与释放详解
一直以来有许多读者朋友对TCP的传输连接建立和释放过程不是很理解,而这又是几乎网络认证中必考的知识点,包括软考.CCNA\CCNP.H3CNA\H3CNE等,为此再把笔者年度巨作,广受好评的--< ...
- 基于STM32F407+W5500的freemodbus tcp移植与实现
环境:STM32CUBEMX6.6.1 MDK532 freemodbus1.6 首先是创建能驱动W5500的工程 主要用到硬件为SPI UART SPI速度建议不要太快,SPI1可以设置到40M, ...
- 利用TCP传输协议实现基于Socket的聊天程序(高级版_多线程)
大家好,在上篇<利用TCP和UDP协议,实现基于Socket的小聊天程序(初级版)>博客中,所写程序只是实现简单的连接通信,基于控制台实现,运用了TCP和UDP两种传输协议.今天我和大家分 ...
- 【Java 网络编程】TCP 传输机制 ( 数据拆分 | 排序 | 顺序发送 | 顺序组装 | 超时重发 )
文章目录 I TCP 传输过程 II TCP 传输示例 III TCP 传输特殊情况处理 I TCP 传输过程 1. TCP 传输过程 : 排序 , 顺序发送 , 顺序组装 ; ① 排序 : TCP ...
- TCP传输的单个报文最大字节(MSS和MTU)
TCP和1448 1448字节是实际场景下,单个TCP包的实际运载能力.也就是说,实际场景下,上层调用send(1000KB),下层会把这1000KB封装成多个TCP包进行发送.单个TCP包每次打包1 ...
- s6-7 TCP 传输策略
TCP 传输策略 防止黏包现象的出现 当窗口数为 0 时,发送者不能正常发送数据段,除非: -Urgent数据.比如,用户想杀掉远端机器上的进程的时候,可以发送数据 -发送者可以发送一个字节的数据段, ...
- java网络编程TCP传输—流操作—拿到源后的写入动作
在网络编程中的TCP传输里,拿到Socket的源后,应该怎么进行读写操作呢,下面我列举了两种方法,希望大家帮忙补充···· 1.利用byte数组作为一个缓冲区进行读写 客户端上传 1 //获取sock ...
最新文章
- WPF ControlTemplate TemplateBinding
- 《那些年啊,那些事——一个程序员的奋斗史》——61
- 一篇文章看懂Git是什么以及如何简单的上手Git
- zookeeper中的ZAB协议理解
- mac m1搭建java opencv 环境(遇到的坑记录)
- 通过vb代码将多个excel合并成一个
- 阿里云大学双11特惠活动
- php 博饼 源代码,php实现中秋博饼小游戏
- Scrapy爬虫框架,入门案例(非常详细)
- rtx服务器限制文件传输,rtx 服务器 文件传输 配置
- 类神经网络训练不起来怎么办——机器学习模型训练指南
- IDEA与VsCode两种开发工具的比较
- Service starting has been prevented by iaware or trustsbase sInfo ServiceInfo 解决方法
- Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
- 台达HMI触摸屏多语种切换
- 用java在控制台实现扫雷
- OpenLDAP+SSL+SSSD 实现Linux登录集中认证
- 【JavaSE】继承
- 西蒙说游戏 计算机,编程课不用电脑?因为芬兰教师将编程当做一种思想来教...
- RSA--维纳攻击--代码和题目分析