串口通信发送数据的有关问题

串口通信发送数据的问题
部分代码如下所示,发送的数据来自编辑框中的输入,即m_send 变量。问题在于
无论我发什么,接收端收到的都是发送的数据加上同样个byte的无效数据。
请指教。看看哪里的问题呢?
C/C++ code
void CDllDialog::OnSend() 
{
    // TODO: Add your control notification handler code here
    COMSTAT ComStat;
    ULONG nLength=0;
    UpdateData(true);
    ULONG szLength = m_send.GetLength();
    
    char *sz = new char[szLength];
    if(sz==NULL)
        return;
    CString tempstr;
    tempstr = ChangeCharstr2Hexstr(m_send);
    memcpy(sz,tempstr.GetBuffer(szLength),szLength);
    DWORD dwErrorFlags;
    ClearCommError(h_com,&dwErrorFlags,&ComStat);
    BOOL fState=WriteFile(h_com,sz,szLength,&nLength,&m_osWrite);
    if(!fState)
    {
        ULONG my_error=GetLastError();
        if(my_error==ERROR_IO_PENDING)
        {
            GetOverlappedResult(h_com,&m_osWrite,&nLength,TRUE);
        }
        else
            nLength=0;
    }
    delete[] sz;
    sz=NULL;        
}


//工作者线程
//用于判断串口是否接收到数据,如果有数据,就发信息给WM_COMMNOTIFY
// 工作者线程,负责监视串行口
//
UINT CommProc(LPVOID pParam)
{
    OVERLAPPED os;
    DWORD dwMask, dwTrans;
    COMSTAT ComStat;
    DWORD dwErrorFlags;
    CDllDialog *pX1=(CDllDialog*)pParam;

    memset(&os, 0, sizeof(OVERLAPPED));
    os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);

    if(os.hEvent==NULL)
    {
        AfxMessageBox("Can't create event object!");
        return (UINT)-1;
    }

    while(pX1->m_bConnected)
    {
        ClearCommError(pX1->h_com,&dwErrorFlags,&ComStat);

        if(ComStat.cbInQue)
        {
            // 无限等待WM_COMMNOTIFY消息被处理完
            WaitForSingleObject(pX1->m_hPostMsgEvent, INFINITE);
            //重置事件
            ResetEvent(pX1->m_hPostMsgEvent);

            // 通知!!!
            PostMessage(pX1->GetSafeHwnd(),WM_COMMNOTIFY, EV_RXCHAR, 0);
                        //pX1->m_hTermWnd
            continue;
        }

        dwMask=0;

        if(!WaitCommEvent(pX1->h_com, &dwMask, &os)) // 重叠操作
        {

            if(GetLastError()==ERROR_IO_PENDING)
            // 无限等待重叠操作结果
                GetOverlappedResult(pX1->h_com, &os, &dwTrans, TRUE);
            else
            {
                CloseHandle(os.hEvent);
                return (UINT)-1;
            }
        }
    }

    CloseHandle(os.hEvent);
    return 0;
}

//串口消息函数
LRESULT CDllDialog::OnCommNotify(WPARAM wParam, LPARAM lParam)
{
    

    if( (!m_bConnected) || (wParam&EV_RXCHAR)!=EV_RXCHAR)
    {
        SetEvent(m_hPostMsgEvent);    //允许允许发送下一个信息
        return 0L;
    }

    int nLength;
    char buf[4096/4];
    CString str;
    nLength=ReadComm(buf,100);        //获取数据和长度
    
    if(nLength)
    {
        for(int i=0;i<nLength/2;i++)
            str+=DevideHexChar(buf[i]);
        
        str+=_T("");
    m_receive.ReplaceSel(str);
    }
    SetEvent(m_hPostMsgEvent);        //允许发送下一个信息
    return 0L;


}


//读取串口数据,返回长度。
//输入参数:要读的长度
//注意事项:输入的要读的长度如果比实际缓冲里面的数据量大的话,返回的是较小的值
DWORD CDllDialog::ReadComm(char *buf, DWORD dwLength)
{
    DWORD length=0;
    COMSTAT ComStat;
    DWORD dwErrorFlags;

    ClearCommError(h_com,&dwErrorFlags,&ComStat);
    length=min(dwLength, ComStat.cbInQue);        
    ReadFile(h_com,buf,length,&length,&m_osRead);

    return length;
}

CString CDllDialog::ChangeCharstr2Hexstr(CString Charstr)
{
    CString Hexstr=_T("");
    Charstr.MakeUpper();
    HexStringFilter(Charstr);
    int Length=Charstr.GetLength();
    if(Length%2)
        Charstr.Delete(Length-1);
    Length=Charstr.GetLength();
    for(int i=0;i<Length/2;i++)
    {
        Hexstr+=CombineHexChar(Charstr.GetAt(i*2),Charstr.GetAt(i*2+1));
    }
    return Hexstr;
}

void CDllDialog::HexStringFilter(CString &str)
{
    BOOL bOK;
    for(int i=0;i<str.GetLength();)
    {
        bOK=((str.GetAt(i)>='0')&&(str.GetAt(i)<='9'))||
            ((str.GetAt(i)>='A')&&(str.GetAt(i)<='F'))||
            ((str.GetAt(i)>='a')&&(str.GetAt(i)<='f'));
        if(!bOK)
            str.Delete(i);
        else i++;
    }
}

char CDllDialog::CombineHexChar(char CharH, char CharL)
{
    char result;
    CString temp;
    if(CharH>='0'&&CharH<='9')            result=(CharH-'0');
    else if(CharH>='a'&&CharH<='f')        result=(CharH-'a'+10);
    else if(CharH>='A'&&CharH<='F')        result=(CharH-'A'+10);
    else                                result=0;
    result<<=4;    
    if(CharL>='0'&&CharL<='9')            result+=(CharL-'0');
    else if(CharL>='a'&&CharL<='f')        result+=(CharL-'a'+10);
    else if(CharL>='A'&&CharL<='F')        result+=(CharL-'A'+10);
    else                                result+=0;
    return result;
}

CString CDllDialog::DevideHexChar(char HexChar)
{
    CString result=_T("");
    int temp=(HexChar&0xF0)>>4;
    if(temp<10)
        result+=(temp+'0');
    else 
        result+=(temp+'A'-10);
    temp=HexChar&0x0F;
    if(temp<10)
        result+=(temp+'0');
    else 
        result+=(temp+'A'-10);
    return result;
}