区域 |
长度
|
描述
|
客户端
|
服务器
|
传输标志
|
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;
}