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;
}
断点跟踪了,有值但是strcpy无效
用memcpy怎么样?
有错误,因为串口上来的数据不一定是字符串。不要把lParam强制转换成char*
改为 memcpy(szData,lParam,80);拷贝80个字符!
你还得传一个数据的长度.你可以让pData->GetData()返回一个结构体的指针.
结构体为:
struct tag_data{
void* pv;
int len;
}data;//名字你改一下.