用其他软件接收数据没有问题,而用我写的代码接收最近只能接收100多个字节左右,以下是打开串口和接收数据代码,请各位帮忙BOOL CSerialComm::Open(int nPort, long nBaud)
{
if(m_bOpened)
return TRUE; if(m_ov.hEvent == NULL)
m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
else
ResetEvent(m_ov.hEvent); char szPort[10];
char szComParams[50];
DCB dcb;
sprintf(szPort, "COM%d", nPort);
sprintf(szComParams, "COM%d:%d,n,8,1", nPort, nBaud);
m_hIDComDev = CreateFile(szPort,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
if(m_hIDComDev == INVALID_HANDLE_VALUE)
return FALSE;
COMMTIMEOUTS m_CommTimeOuts;
m_CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
m_CommTimeOuts.ReadTotalTimeoutMultiplier = 1000;
m_CommTimeOuts.ReadTotalTimeoutConstant = 1000;
m_CommTimeOuts.WriteTotalTimeoutMultiplier = 1000;
m_CommTimeOuts.WriteTotalTimeoutConstant = 1000;
if(SetCommTimeouts(m_hIDComDev, &m_CommTimeOuts))
{
if(SetCommMask(m_hIDComDev, EV_CTS|EV_RXCHAR))
{
if(GetCommState(m_hIDComDev, &dcb))
{
if(BuildCommDCB(szComParams, &dcb))
{
dcb.fRtsControl = DTR_CONTROL_ENABLE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
SetCommState(m_hIDComDev, &dcb);
}
}
}
}
SetupComm(m_hIDComDev, 1024, 1024);
PurgeComm(m_hIDComDev, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
//PurgeComm(m_hIDComDev, PURGE_TXCLEAR|PURGE_RXCLEAR);
m_bOpened = TRUE;
return TRUE;
}
int CSerialComm::ReadData(void* lpBuf)
{
BOOL bRead = TRUE;
BOOL bResult = TRUE;
DWORD dwError = 0;
DWORD BytesRead = 0;
DWORD dwTotalRead = 0;
int i = 0;
COMSTAT comstat;
unsigned char RXBuff;
//lpBuf=(void*)malloc(1);
for(;;)
{
bResult = ClearCommError(m_hIDComDev, &dwError, &comstat);
if(comstat.cbInQue == 0)
break;
if(bRead)
{
bResult = ReadFile(m_hIDComDev, &RXBuff, 1, &BytesRead, &m_ov);
//Sleep(10);
if(bResult)
bRead = TRUE;
}
if(!bRead)
{
bRead = TRUE;
bResult = GetOverlappedResult(m_hIDComDev, &m_ov, &BytesRead, TRUE);
}
dwTotalRead += BytesRead;
lpBuf=(void*)realloc(lpBuf,dwTotalRead);
memcpy(((unsigned char*)lpBuf + i), &RXBuff, 1);
i++;
}
return dwTotalRead;
}
{
if(m_bOpened)
return TRUE; if(m_ov.hEvent == NULL)
m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
else
ResetEvent(m_ov.hEvent); char szPort[10];
char szComParams[50];
DCB dcb;
sprintf(szPort, "COM%d", nPort);
sprintf(szComParams, "COM%d:%d,n,8,1", nPort, nBaud);
m_hIDComDev = CreateFile(szPort,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
if(m_hIDComDev == INVALID_HANDLE_VALUE)
return FALSE;
COMMTIMEOUTS m_CommTimeOuts;
m_CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
m_CommTimeOuts.ReadTotalTimeoutMultiplier = 1000;
m_CommTimeOuts.ReadTotalTimeoutConstant = 1000;
m_CommTimeOuts.WriteTotalTimeoutMultiplier = 1000;
m_CommTimeOuts.WriteTotalTimeoutConstant = 1000;
if(SetCommTimeouts(m_hIDComDev, &m_CommTimeOuts))
{
if(SetCommMask(m_hIDComDev, EV_CTS|EV_RXCHAR))
{
if(GetCommState(m_hIDComDev, &dcb))
{
if(BuildCommDCB(szComParams, &dcb))
{
dcb.fRtsControl = DTR_CONTROL_ENABLE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
SetCommState(m_hIDComDev, &dcb);
}
}
}
}
SetupComm(m_hIDComDev, 1024, 1024);
PurgeComm(m_hIDComDev, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
//PurgeComm(m_hIDComDev, PURGE_TXCLEAR|PURGE_RXCLEAR);
m_bOpened = TRUE;
return TRUE;
}
int CSerialComm::ReadData(void* lpBuf)
{
BOOL bRead = TRUE;
BOOL bResult = TRUE;
DWORD dwError = 0;
DWORD BytesRead = 0;
DWORD dwTotalRead = 0;
int i = 0;
COMSTAT comstat;
unsigned char RXBuff;
//lpBuf=(void*)malloc(1);
for(;;)
{
bResult = ClearCommError(m_hIDComDev, &dwError, &comstat);
if(comstat.cbInQue == 0)
break;
if(bRead)
{
bResult = ReadFile(m_hIDComDev, &RXBuff, 1, &BytesRead, &m_ov);
//Sleep(10);
if(bResult)
bRead = TRUE;
}
if(!bRead)
{
bRead = TRUE;
bResult = GetOverlappedResult(m_hIDComDev, &m_ov, &BytesRead, TRUE);
}
dwTotalRead += BytesRead;
lpBuf=(void*)realloc(lpBuf,dwTotalRead);
memcpy(((unsigned char*)lpBuf + i), &RXBuff, 1);
i++;
}
return dwTotalRead;
}
解决方案 »
- 木马客户端为什么要配置服务端?在里面配置的内容是什么?以及其他相关问题
- 如何动态加载工具条图片?
- 动态库问题???
- 如何获取网络时间?
- CArchive是不是不支持文本读取方式
- ▁▂▃▄▅在线结贴▅▄▃▂▁mfc中TRY CATCH ENDCATCH是不是有些多余
- 与VC++串口通信测试相关的文献谁有?
- 有谁知道:我的程序在debug版没有异常,当Release出来后发生异常。不知道怎么调试,哪位老兄指点以下.(100相送)
- 怎么把TXT文件中的字符一行一行读出来
- vc++程序员有必要现在就向vc.net方向转型吗?大家发表一下意见?
- 请问如何在启动程序的时候把windows的任务栏隐藏,或者把它改成自动隐藏的?
- 想做个个人管理软件,大家给点意见,来者有分!
{
//GetCommMask(m_hIDComDev,&dwError);
if(WaitCommEvent(m_hIDComDev,&dwEvent,NULL))
{
ClearCommError(m_hIDComDev,&dwError,&comstat);
if((dwEvent & EV_RXCHAR) && comstat.cbInQue)
{
break;
}
}
}