// 发送帧
BOOL __fastcall THDLC::HDLC_Send(TComm *pComm, const String& sData)
{
String str; if (!pComm)
return FALSE;
m_pComm = pComm;
// 发送引导段
str += (char)CF_BOOT;
str += (char)CF_BOOT;
// 发送帧头
str += (char)CF_START;
str += (char)CF_START;
// 发送目的地址
str += (char)(nTagAddress >> 8);
str += (char)nTagAddress;
BYTE bChkSum = (BYTE)str[5];
bChkSum ^= (BYTE)str[6];
// 发送来源地址
str += (char)(nMyAddress >> 8);
str += (char)nMyAddress;
bChkSum ^= (BYTE)str[7];
bChkSum ^= (BYTE)str[8];
// 发送帧长度
int nLengthOfFrame = sData.Length() + 9;
str += (char)(nLengthOfFrame >> 8);
str += (char)nLengthOfFrame;
bChkSum ^= (BYTE)str[9];
bChkSum ^= (BYTE)str[10];
// 发送通讯密码
for(int i=0; i<8; i++)
{
str += (char)0;
// bChkSum ^= (BYTE)0;
}
// 发送命令字
str += (char)nCommand;
bChkSum ^= (BYTE)str[19];
// 发送帧内容,校验和
for(int i=1; i<=sData.Length(); i++)
{
str += sData[i];
bChkSum ^= (BYTE)sData[i];
}
str += (char)bChkSum; m_pComm->WriteCommData(str.c_str(), str.Length());
return true;}
BOOL __fastcall THDLC::HDLC_Send(TComm *pComm, const String& sData)
{
String str; if (!pComm)
return FALSE;
m_pComm = pComm;
// 发送引导段
str += (char)CF_BOOT;
str += (char)CF_BOOT;
// 发送帧头
str += (char)CF_START;
str += (char)CF_START;
// 发送目的地址
str += (char)(nTagAddress >> 8);
str += (char)nTagAddress;
BYTE bChkSum = (BYTE)str[5];
bChkSum ^= (BYTE)str[6];
// 发送来源地址
str += (char)(nMyAddress >> 8);
str += (char)nMyAddress;
bChkSum ^= (BYTE)str[7];
bChkSum ^= (BYTE)str[8];
// 发送帧长度
int nLengthOfFrame = sData.Length() + 9;
str += (char)(nLengthOfFrame >> 8);
str += (char)nLengthOfFrame;
bChkSum ^= (BYTE)str[9];
bChkSum ^= (BYTE)str[10];
// 发送通讯密码
for(int i=0; i<8; i++)
{
str += (char)0;
// bChkSum ^= (BYTE)0;
}
// 发送命令字
str += (char)nCommand;
bChkSum ^= (BYTE)str[19];
// 发送帧内容,校验和
for(int i=1; i<=sData.Length(); i++)
{
str += sData[i];
bChkSum ^= (BYTE)sData[i];
}
str += (char)bChkSum; m_pComm->WriteCommData(str.c_str(), str.Length());
return true;}
解决方案 »
- 将MP3文件存入资源文件后,如何播放它?也如播放WAV文件样?
- 请教SpeedButton的双击事件
- 关于Dev Express 汉化整合安装包 V3.2的安装问题?
- 一个DBEXPRESS问题!
- 给大家推荐一个望站http://www.01cn.net/
- 如何将两个报表在同一张纸上输出?
- DBGRID的行高如何设置?
- 在IE中如何增加右键菜单,像NETANTS那样?
- 用什么方法可以把文本中的指定内容导入到ACCESS数据库中!注意:
- 为什么装过东方影都后mediaplayer控件老是出错(东方影都真是垃圾一堆)?
- clientDataSet怎样屏蔽掉字段.
- 在VC++中我们可以定义const对象,Delphi中好像不可以是吗?
String __fastcall THDLC::HDLC_Receive(BYTE bByte)
{
String sRecvData = "";
static String sCommBuf;
static int nCommunState=CS_RECEIVE_STANDBY, nTranCount;
static BYTE bChkSum, nTagAdr, nSrcAdr;
DriveMessage();
switch (nCommunState)
{
case CS_RECEIVE_STANDBY: // 接收等待
nCommunState = (bByte==CF_START) ? CS_RECEIVE_START2 : CS_RECEIVE_STANDBY;
break;
case CS_RECEIVE_START2: // 接收帧头
nCommunState = (bByte==CF_START) ? CS_RECEIVE_TAGADR1 : CS_RECEIVE_STANDBY;
break;
case CS_RECEIVE_TAGADR1: // 接收目的地址
bChkSum = bByte;
nTagAdr = bByte << 8;
nCommunState = CS_RECEIVE_TAGADR2;
break;
case CS_RECEIVE_TAGADR2: // 接收目的地址
bChkSum ^= bByte;
nTagAdr += bByte;
nCommunState = CS_RECEIVE_SRCADR1;
break;
case CS_RECEIVE_SRCADR1: // 接收来源地址
bChkSum ^= bByte;
nSrcAdr = bByte << 8;
nCommunState = CS_RECEIVE_SRCADR2;
break;
case CS_RECEIVE_SRCADR2: // 接收来源地址
bChkSum ^= bByte;
nSrcAdr += bByte;
nSrcAddress = nSrcAdr;
nCommunState = CS_RECEIVE_LOF1;
break;
case CS_RECEIVE_LOF1: // 接收帧长度字节1
bChkSum ^= bByte;
nTranCount = bByte << 8;
nCommunState = CS_RECEIVE_LOF2;
break;
case CS_RECEIVE_LOF2: // 接收帧长度字节2
bChkSum ^= bByte;
nTranCount += bByte;
//nTranCount = 0x0a;
///////////////////////// // 限制帧长
if (nTranCount > 6000)
nCommunState = CS_RECEIVE_STANDBY;
/////////////////////////
sCommBuf = "";
nCommunState = CS_RECEIVE_FRAME;
break;
case CS_RECEIVE_FRAME: // 接收帧内容
bChkSum ^= bByte;
sCommBuf += (char)bByte;
if (--nTranCount==0)
nCommunState = CS_RECEIVE_CHKSUM;
break;
case CS_RECEIVE_CHKSUM: // 接收校验和
nCommunState = CS_RECEIVE_STANDBY;
if (bChkSum==bByte)
{
sRecvData = sCommBuf;
CF_COMMAND = sRecvData[1];
}
break; ////////
default:
nCommunState = CS_RECEIVE_STANDBY;
break; ///////
}
return sRecvData;
}