// 发送帧
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;}

解决方案 »

  1.   

    再来一个接收函数
    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;
    }