while(pDevice ->m_bRun)
{
memset(szRecv, 0, sizeof(szRecv));
nRet = pDevice ->RecvData(szRecv, 1); if(nRet > 0)
{
if(szRecv[0] != NULL && bStart == FALSE)
{
bStart = TRUE;
nCount = 0; memset(szBuffer, 0 , sizeof(szBuffer));
szBuffer[nCount] = szRecv[0] ; if(pInfo ->m_bToKeyBuffer)
PostThreadMessage(pDeviceManager ->m_ComToKeyThreadID, WM_COMTOKEY, (WPARAM)pDevice->m_nDeviceID, (LPARAM)pData->GetData()); if(pDeviceManager ->m_RecvDataThreadID != NULL)
PostThreadMessage(pDeviceManager ->m_RecvDataThreadID, WM_SAVEDATA, (WPARAM)pDevice->m_nDeviceID, (LPARAM)pData->GetData()); if(pInfo ->m_bSaveToFile)
PostThreadMessage(pDeviceManager->m_WriteDataThreadID, WM_WRITEDATA, (WPARAM)pDevice->m_nDeviceID, (LPARAM)pData->GetData()); if(pDeviceManager ->m_RecvDataWnd != NULL)
SendMessage(pDeviceManager->m_RecvDataWnd, WM_SAVEDATA, (WPARAM)pDevice->m_nDeviceID, (LPARAM)pData->GetData()); if(pDeviceManager ->m_RS232ThreadID != NULL)
PostThreadMessage(pDeviceManager ->m_RS232ThreadID, WM_RS232, (WPARAM)pDevice ->m_nDeviceID, (LPARAM)pData ->GetData()); Sleep(10);
}
else if(bStart == TRUE)
{
if( nCount < g_settingInfo.m_nCharacterNum - 1)
{
szBuffer[++nCount] = szRecv[0];
}
else
{
bStart = FALSE;
pDevice ->process_auto(pDevice, szBuffer, nCount);
} }
}//end if(nRet)
}//end while
当串口有数据时,就用线程抛出,但就提示"ScannerHost.exe 中的 0x00401ac8 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突",这是为什么?错误指示如下注释LRESULT CDeviceManager::OnSaveData(WPARAM wParam, LPARAM lParam)
{
int nDeviceID;
char szData[256];
TCHAR wszData[256]; memset(szData, 0, sizeof(szData));
nDeviceID = (int)wParam;
strcpy(szData, (char *)lParam);//错误指到这,这有错吗?
wsprintf(wszData, _T("%S"), szData);
InsertItem(wszData, nDeviceID); return 0;
}

解决方案 »

  1.   

    pData->GetData(); 检查下为什么返回了空指针。
      

  2.   


    断点跟踪了,有值但是strcpy无效
      

  3.   

    串口的数据是已NULL结束的字符串格式返回的吗?
    用memcpy怎么样?
      

  4.   

     strcpy(szData, (char *)lParam);//错误指到这,这有错吗
    有错误,因为串口上来的数据不一定是字符串。不要把lParam强制转换成char*
    改为 memcpy(szData,lParam,80);拷贝80个字符!
      

  5.   

    非法访问。检查下lParam是否为空指针;
      

  6.   

    如果收到了数据,首先将lParam的指向的内存放到memery调试器中看看到底指向的是什么。比如你看看它的长度,是否有啥非法的字符等,是否越界了。还有是否为空
      

  7.   

    如果不是字符串.
    你还得传一个数据的长度.你可以让pData->GetData()返回一个结构体的指针.
    结构体为:
    struct tag_data{
    void* pv;
    int len;
    }data;//名字你改一下.