这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
icore4t_45 [2020/09/26 19:59] zgf |
icore4t_45 [2022/04/01 10:54] (当前版本) sean |
||
---|---|---|---|
行 2: | 行 2: | ||
|技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
|技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
- | |技术论坛|http://www.eeschool.org||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
| V1.0 | 2020-9-26 | zgf | 初次建立 | | | V1.0 | 2020-9-26 | zgf | 初次建立 | | ||
行 31: | 行 30: | ||
|事务处理标识 |协议标识 |报文长度 |设备标识 |功能码 |起始地址 |寄存器数量| | |事务处理标识 |协议标识 |报文长度 |设备标识 |功能码 |起始地址 |寄存器数量| | ||
|2byte |2byte |2byte |1byte |1byte |2 byte |2 byte| | |2byte |2byte |2byte |1byte |1byte |2 byte |2 byte| | ||
+ | |||
* 事务处理标识符:两个字节,一般每次通讯后将加1,从而区别不同的通讯数据报文。 | * 事务处理标识符:两个字节,一般每次通讯后将加1,从而区别不同的通讯数据报文。 | ||
* 协议标识符:两个字节,Modbus TCP标识符为0x0000。 | * 协议标识符:两个字节,Modbus TCP标识符为0x0000。 | ||
行 41: | 行 41: | ||
* 数据读取应答报文格式如表2所示。 | * 数据读取应答报文格式如表2所示。 | ||
* 表2 Modbus TCP数据读取应答报文 | * 表2 Modbus TCP数据读取应答报文 | ||
+ | |||
|事务处理标识 |协议标识 |报文长度 |设备标识 |功能码 |数据长度 |数据| | |事务处理标识 |协议标识 |报文长度 |设备标识 |功能码 |数据长度 |数据| | ||
|2byte |2byte |2byte |1byte |1byte |1byte |n byte| | |2byte |2byte |2byte |1byte |1byte |1byte |n byte| | ||
+ | |||
* 事务处理标识符:两个字节,与请求标识一致。 | * 事务处理标识符:两个字节,与请求标识一致。 | ||
* 协议标识符:两个字节,与请求标识一致。 | * 协议标识符:两个字节,与请求标识一致。 | ||
行 171: | 行 173: | ||
memcpy(eth_tcps.send_buffer,data,len); | memcpy(eth_tcps.send_buffer,data,len); | ||
es = tpcb->callback_arg; | es = tpcb->callback_arg; | ||
- | if(es != NULL){ //连接处于空闲可以发送数据 | + | if(es != NULL){ //连接处于空闲可以发送数据 |
es->p = pbuf_alloc(PBUF_TRANSPORT,len,PBUF_POOL);//申请内存 | es->p = pbuf_alloc(PBUF_TRANSPORT,len,PBUF_POOL);//申请内存 | ||
- | //将eth_tcps.send_buffer[]中的数据拷贝到es->p_tx中 | + | pbuf_take(es->p,(char*)eth_tcps.send_buffer,len);//将eth_tcps.send_buffer[]中的数据拷贝到es->p_tx中 |
- | pbuf_take(es->p,(char*)eth_tcps.send_buffer,len); | + | tcp_server_senddata(tpcb,es); //将eth_tcps.send_buffer[]里面复制给pbuf的数据发送出去 |
- | tcp_server_senddata(tpcb,es); //将eth_tcps.send_buffer[]里面复制给pbuf的数据发送出去 | + | if(es->p)pbuf_free(es->p); //释放内存 |
- | if(es->p)pbuf_free(es->p); //释放内存 | + | |
ret_err=ERR_OK; | ret_err=ERR_OK; | ||
}else{ | }else{ | ||
- | tcp_abort(tpcb); //终止连接,删除pcb控制块 | + | tcp_abort(tpcb); //终止连接,删除pcb控制块 |
ret_err=ERR_ABRT; | ret_err=ERR_ABRT; | ||
} | } |