sinat_20267607 2016-07-23 15:45 采纳率: 0%
浏览 2101
已结题

API实现串口通讯,读数据时显示“烫烫烫烫烫”是怎么回事

【更新】
按照各位的方法进行了内存初始化
现在不显示“烫烫烫“了 但也没有显示任何的字符是怎么回事呢?
这是执行到ReadFile语句时候的各个变量
图片说明
但是再执行下一句的时候length就变为0了
而且str也是空的

在CString str(RXBuff);处断点显示:
图片说明

麻烦各位了。。。

发送“123”的话就会显示一长串的烫
缓冲区也没清空
如果改成只接收单个字符的程序
也还是收到乱码
不管发送'1'还是'2'都显示‘Ì’

求指教~~

```struct Parameter
{
COMConfig* c;
CBLDDlg* dlg;
};
//这是开启的线程:
UINT ThreadFunc(LPVOID lpParam)
{
Parameter* parameter = (Parameter*)lpParam;
COMConfig* comConfig = parameter->c;
CBLDDlg* dlg = parameter->dlg;

BOOL bResult = TRUE;
DWORD Event = 0;

DWORD BytesTransfered = 0;
DWORD CommEvent = 0;
DWORD dwError = 0;

if(comConfig->m_hComm)
{
    PurgeComm(comConfig->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR);
}
else
{
    AfxMessageBox(_T("串口初始化失败"));
    return 0;
}

    for(;;)
    {
        bResult = WaitCommEvent(comConfig->m_hComm,&Event,&(comConfig->m_ov));//监测通信事件
        if(!bResult)
        {
            switch(dwError = GetLastError())
            {
            case ERROR_IO_PENDING:
                {
                    AfxMessageBox(_T("正常"));  
                    break;
                }
            case 87:
                {
                    break;
                }
            default:
                {
                    //显示错误信息
                    AfxMessageBox(_T("其他错误")); 
                    break;
                }
            }
        }
        else
        {
            bResult = ClearCommError(comConfig->m_hComm,&dwError,&(comConfig->comstat));

            if(comConfig->comstat.cbInQue == 0)//接收缓冲区字节数
                continue;
        }//end if bResult

        Event = WaitForMultipleObjects(3,comConfig->m_hEventArray,FALSE,INFINITE);
        switch(Event)
        {
        case 0:
            {
                //关闭串口操作
            }
        case 1:
            {
                GetCommMask(comConfig->m_hComm,&CommEvent);//获取当前通信事件
                if(CommEvent & EV_RXCHAR)                       
                    dlg->ReceiveChar(comConfig,100);

                AfxMessageBox(_T("读事件")); 
                break;
            }
        case 2:
            {
                //写数据操作
            }
        }

    }
return 0;

}

然后下面是读数据的函数:


void CBLDDlg::ReceiveChar(LPVOID lpParam, DWORD dwLength)
{
BOOL bRead = TRUE;
BOOL bResult = TRUE;
DWORD dwError = 0;
COMConfig* comConfig = (COMConfig*)lpParam;
DWORD length = 0;
CString str;
char RXBuff[100];

InitializeCriticalSection(&cs);

for (;;)
{
    EnterCriticalSection(&cs);

    bResult = ClearCommError(comConfig->m_hComm, &dwError, &(comConfig->comstat));

    LeaveCriticalSection(&cs);

    if (comConfig->comstat.cbInQue == 0)
    { 
        break;
    }

    EnterCriticalSection(&cs);

    length=min(dwLength, comConfig->comstat.cbInQue);

    if (bRead)
    {
       //读数据
        bResult = ReadFile(comConfig->m_hComm,      // Handle to COMM port
                RXBuff,         // RX Buffer Pointer
                length,                   // Read one byte
                &length,          // Stores number of bytes read
                &(comConfig->m_ov));          // pointer to the m_ov structure

        CString str(RXBuff);
        m_strEditReceiveMsg = str;

        GetDlgItem(IDC_receive)->SetWindowText(str);//显示在控件中

        if (!bResult)
        {
            switch (dwError = GetLastError())
            {
                case ERROR_IO_PENDING:
                {
                     bRead = FALSE;
                     break;
                }
                default:
                {
                     break;
                }
            }
        }
        else
        {
            bRead = TRUE;
        }
    } // close if (bRead)
    if (!bRead)
    {
        bRead = TRUE;
        bResult = GetOverlappedResult(comConfig->m_hComm,  // Handle to COMM port
                          &(comConfig->m_ov),  // Overlapped structure
                          &length,     // Stores number of bytes read
                          TRUE);          // Wait flag
        if(!bResult)
        {
            AfxMessageBox(_T("GetOverlappedResults()in ReadFile()"));
        }

        SetCommMask(comConfig->m_ov.hEvent,EV_RXCHAR);//重置为有信号

        LeaveCriticalSection(&cs);
    }
}

}



  • 写回答

4条回答 默认 最新

  • threenewbee 2016-07-23 15:50
    关注

    烫烫烫烫烫说明你访问了没有初始化的内存。
    为了便于调试,VC++在调试版的程序中会把堆上的内存全部初始化为0xCC,而0xCCCC正好是烫这个字的内码。
    所以你下个断点,检查下你RXBuff的内存是否初始化。建议调用前用memset先把RXBuff清空下。
    另外你从串口读取的是数字的1还是ascii的字符的1。

    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序