网络通信数据包与串口通信数据包异同:
网络通信数据包与串口通信数据包异同:
相同点:中间数据(从0x68到检验码)是一样的
不同点:串口数据需要加0xA5开头,0xAE结尾,中间数据需要转码:
0xa5 è 0xaa 0x05。目的是避免与起始符0xa5相同
0xae è 0xaa 0x0e。目的是避免与结束符0xae相同。
0xaa è 0xaa 0x0a。目的是避免与转义符0xaa相同。
而网络数据只需要在中间的数据前加上下面的部分即可:
数据 |
数值 |
长度(字节) |
意义描述 |
ID Code |
0x00000000 ~ 0xffffffff |
4 |
控制卡的识别码,高字节在前。 需要与设置到卡上的值相同。 |
网络数据长度 |
0x0000 ~ 0xffff |
2 |
从”包类型”开始,到“数据校验和”的数据字节数,低字节在前 |
保留 |
0x0000 |
2 |
保留备用。填0 |
比如 网络通讯:
BYTE *buf;
buf = new BYTE[ 18 ];
ulong2buf_be( buf+lenSerch , 0xffff );// 控制卡的识别码,高字节在前
lenSerch +=4;
ushort2buf( &buf[ lenSerch ] , 10 );//网络数据长度
lenSerch +=2;
ushort2buf( &buf[lenSerch] , 0 );//保留
lenSerch +=2;
nPOS = lenSerch;
buf[ lenSerch ++] = 0x68;//包类型
buf[ lenSerch ++] = 0x32 ;//卡类型码
buf[ lenSerch ++] = 0xff;//;卡id
buf[ lenSerch ++] = 0x90;//命令码(CMD
buf[ lenSerch ++] =0x01;//返回标记
buf[lenSerch ++] = 0x03;//选项
buf[lenSerch++] = bypos;//标记
buf[ lenSerch++ ] = bydata ;//要设置的值
//校验和
unsigned short wdchek = cheknnume( &buf[ lenSerch ] , lenSerch - nPOS );
ushort2buf( &buf[ lenSerch ] , wdchek );
lenSerch += 2;
if( WriteAndRead( buf , lenSerch , nPOS , INQUIRY , pPSign ) )
{
pPSign->SetRelayInfo( byRelayInfo );
CString StrModify = pPSign->GetModifySQL( pPSign->GetID() );
if( theApp.m_adoConn.ExecuteNoSelectSQL( StrModify ) )
{
MessageBox("Set success");
}
bSuccess = TRUE;
}
if (buf)
{
delete []buf ;
buf = NULL;
}
SetRadioCan();
return bSuccess;