网络通信数据包与串口通信数据包异同:

网络通信数据包与串口通信数据包异同:

相同点:中间数据(从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;

原文地址:https://www.cnblogs.com/chenzuoyou/p/3270335.html