区域 |
长度
|
描述
|
客户端
|
服务器
|
传输标志
|
2字节
|
MODBUS 请求和响应传输过程中
序列号
|
客户端生成 |
应答时复制该值
|
协议标志 |
2字节
|
Modbus协议
默认为0
|
客户端生成
|
应答时复制该值
|
长度
|
2字节
|
剩余部分的长度 |
客户端生成
|
应答时由服务器端生成
|
单元标志
|
1字节
|
从机标志(从机地址) |
客户端生成
|
应答时复制该值
|
BOOL xMBTCPPortInit( USHORT usTCPPort ) { BOOL bOkay = FALSE; USHORT usPort; if( usTCPPort == 0 ) { usPort = MB_TCP_DEFAULT_PORT; } else { usPort = (USHORT)usTCPPort; } // 侦听端口 502端口 uip_listen(HTONS(usPort)); bOkay = TRUE; return bOkay; }
void uip_modbus_appcall(void) { if(uip_connected()) { PRINTF("connected!\r\n"); } if(uip_closed()) { PRINTF("closed\r\n"); } if(uip_newdata()) { PRINTF("request!\r\n"); // 获得modbus请求 memcpy(ucTCPRequestFrame, uip_appdata, uip_len ); ucTCPRequestLen = uip_len; // 向 modbus poll发送消息 xMBPortEventPost( EV_FRAME_RECEIVED ); } if(uip_poll()) { if(bFrameSent) { bFrameSent = FALSE; // uIP发送Modbus应答数据包 uip_send( ucTCPResponseFrame , ucTCPResponseLen ); } } }
static UCHAR ucTCPRequestFrame[MB_TCP_BUF_SIZE];static USHORT ucTCPRequestLen;static UCHAR ucTCPResponseFrame[MB_TCP_BUF_SIZE];static USHORT ucTCPResponseLen;
BOOL xMBTCPPortGetRequest( UCHAR ** ppucMBTCPFrame, USHORT * usTCPLength ) { *ppucMBTCPFrame = &ucTCPRequestFrame[0]; *usTCPLength = ucTCPRequestLen; /* Reset the buffer. */ ucTCPRequestLen = 0; return TRUE; }
BOOL xMBTCPPortSendResponse( const UCHAR * pucMBTCPFrame, USHORT usTCPLength ) { memcpy( ucTCPResponseFrame , pucMBTCPFrame , usTCPLength); ucTCPResponseLen = usTCPLength; bFrameSent = TRUE; // 通过uip_poll发送数据 return bFrameSent; }