📄 scomm.cpp
字号:
if(m_hComDev==INVALID_HANDLE_VALUE)return FALSE;
SetCommMask(m_hComDev,EV_RXCHAR);
if(m_bUseOverlapped)
{
if(!WaitCommEvent(m_hComDev,&dwEventMask,&m_OverlappedStatus))
{
if(WaitForSingleObject(m_OverlappedStatus.hEvent,INFINITE)==WAIT_OBJECT_0)
return TRUE;
else
return FALSE;
}
else
return TRUE;
}
if(WaitCommEvent(m_hComDev,&dwEventMask,NULL) && (dwEventMask & EV_RXCHAR))
return TRUE;
else
return FALSE;
}
/*void CSerial::SetDatasViewp(CMyRichEdit * pView)
{
m_pcView=pView;
}*/
void CSerial::ShowString(unsigned char *p,DWORD num)
{
CString str,str1;
// static line;
// line+=num;
// if(m_pcView==NULL || m_bShow==FALSE) return ;
if(m_bShow == FALSE) return;
for(DWORD i=0;i<num;i++)
{
str1.Format("%02X ",*(p+i));
str+=str1;
}
// m_pcView->ReplaceSel(LPCTSTR(str));
// m_pcView->ReplaceSel("\r\n");
// m_pcView->LineScroll(1);
}
void CSerial::GetDefaultDcb()
{
char *buffer1=NULL;
char buffer[80];
GetPrivateProfileString("DCB","length","4294967295",buffer,80,szIniFileName);
m_dcb.DCBlength=strtoul(buffer,&buffer1,10);
GetPrivateProfileString("DCB","baud rate","10416",buffer,80,szIniFileName);
m_dcb.BaudRate=strtoul(buffer,&buffer1,10);
m_dcb.ByteSize=GetPrivateProfileInt("DCB","byte size",8,szIniFileName);
m_dcb.StopBits=GetPrivateProfileInt("DCB","stop bits",0,szIniFileName);
m_dcb.Parity=GetPrivateProfileInt("DCB","parity",0,szIniFileName);
}
void CSerial::GetDefaultTimeOuts()
{
char *buffer1=NULL;
char buffer[80];
GetPrivateProfileString("CommTimeOuts","ReadIntervalTimeout","4294967295",buffer,80,szIniFileName);
m_CommTimeOuts.ReadIntervalTimeout = strtoul(buffer,&buffer1,10);
GetPrivateProfileString("CommTimeOuts","ReadTotalTimeoutMultiplier","1",buffer,80,szIniFileName);
m_CommTimeOuts.ReadTotalTimeoutMultiplier = strtoul(buffer,&buffer1,10);
GetPrivateProfileString("CommTimeOuts","ReadTotalTimeoutConstant","40",buffer,80,szIniFileName);
m_CommTimeOuts.ReadTotalTimeoutConstant = strtoul(buffer,&buffer1,10);
GetPrivateProfileString("CommTimeOuts","WriteTotalTimeoutMultiplier","1",buffer,80,szIniFileName);
m_CommTimeOuts.WriteTotalTimeoutMultiplier = strtoul(buffer,&buffer1,10);
GetPrivateProfileString("CommTimeOuts","WriteTotalTimeoutConstant","40",buffer,80,szIniFileName);
m_CommTimeOuts.WriteTotalTimeoutConstant = strtoul(buffer,&buffer1,10);
}
BOOL CSerial::AutoSetTimeOuts()
{
m_CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
if(bIsHostWinNT)
{
m_CommTimeOuts.ReadTotalTimeoutConstant =0;
m_CommTimeOuts.ReadTotalTimeoutMultiplier=0;
m_CommTimeOuts.WriteTotalTimeoutConstant =0;
m_CommTimeOuts.WriteTotalTimeoutMultiplier =0;
}
else
{
m_CommTimeOuts.ReadTotalTimeoutConstant =40;
m_CommTimeOuts.ReadTotalTimeoutMultiplier=11*1000/m_dcb.BaudRate+1;
m_CommTimeOuts.WriteTotalTimeoutConstant =40;
m_CommTimeOuts.WriteTotalTimeoutMultiplier =11*1000/m_dcb.BaudRate+1;
}
if(m_hComDev!=INVALID_HANDLE_VALUE) SetCommTimeouts(m_hComDev,&m_CommTimeOuts);
//if(!SetCommTimeouts(m_hComDev,&m_CommTimeOuts)) return FALSE;
//Because Win95 & Win98
return TRUE;
}
void CSerial::ShowString(BYTE *p, DWORD num, CString szHead, BOOL bAns)
{
CString str,str1;
// if(m_pcView==NULL || m_bShow==FALSE) return;
if(m_bShow == FALSE) return;
if(bAns)
{
// m_pcView->SetCharColor(m_crAH);
// m_pcView->ReplaceSel(LPCTSTR(szHead));
// m_pcView->SetCharColor(m_crAD);
str.Empty();
for(DWORD i=0;i<num;i++)
{
str1.Format("%02X ",*(p+i));
str+=str1;
}
str+=CString("\r\n");
// m_pcView->ReplaceSel(LPCTSTR(str));
}
else
{
// m_pcView->SetCharColor(m_crRH);
// m_pcView->ReplaceSel(LPCTSTR(szHead));
// m_pcView->SetCharColor(m_crRD);
str.Empty();
for(DWORD i=0;i<num;i++)
{
str1.Format("%02X ",*(p+i));
str+=str1;
}
str+=CString("\r\n");
// m_pcView->ReplaceSel(LPCTSTR(str));
}
// m_pcView->LineScroll(1);
}
BOOL CSerial::SetBaudRate(DWORD dwNewValue)
{
m_dcb.BaudRate=dwNewValue;
if(m_hComDev==INVALID_HANDLE_VALUE) return FALSE;
SetCommState( m_hComDev, &m_dcb );
//Windows 95 and Windows 98: Because SetLastError is a 32-bit function only, Win32 functions that are actually implemented in 16-bit code do not set the last-error code. You should ignore the last-error code when you call these functions. They include window management functions, GDI functions, and Multimedia functions
//if(!SetCommState( m_hComDev, &m_dcb )) return FALSE;
return TRUE;
}
void CSerial::SetColor(COLORREF crAD, COLORREF crAH, COLORREF crRD, COLORREF crRH)
{
m_crAD=crAD;
m_crAH=crAH;
m_crRD=crRD;
m_crRH=crRH;
}
/*CFrameData * CSerial::GetDatap()
{
return m_pData;
}*/
/*void CSerial::SetDatap(CFrameData *pCmdData)
{
m_pData=pCmdData;
}*/
BOOL CSerial::ClearBuffer()
{
return PurgeComm(m_hComDev,PURGE_TXCLEAR | PURGE_RXCLEAR|PURGE_RXABORT|PURGE_TXABORT);
}
void CSerial::SetShow(BOOL bShow)
{
m_bShow=bShow;
}
DWORD CSerial::ReadDataNOWait(BYTE *buffer, DWORD dwBytesToRead)
{
if( !m_bOpened || m_hComDev == INVALID_HANDLE_VALUE ) return 0;
BOOL bReadStatus;
DWORD dwErrorFlags;
DWORD dwEventFlags;
DWORD dwBytesRead;
// DWORD dwEventMask;
COMSTAT ComStat;
ClearCommError( m_hComDev, &dwErrorFlags, &ComStat );
//if(dwErrorFlags) ::AfxMessageBox("Read Datas Error!");
if( !ComStat.cbInQue ) return 0;
DWORD dwCount = min(dwBytesToRead,(DWORD) ComStat.cbInQue);
if(m_bUseOverlapped)
{
bReadStatus = ReadFile( m_hComDev, buffer, dwCount, &dwBytesRead, &m_OverlappedRead );
if( !bReadStatus )
{
if(GetLastError() == ERROR_IO_PENDING )//ERROR_IO_INCOMPLETE
{
dwEventFlags=WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
if(dwEventFlags==WAIT_OBJECT_0||dwEventFlags==WAIT_TIMEOUT)
{
GetOverlappedResult(m_hComDev,&m_OverlappedRead,&dwBytesRead,FALSE);
return dwBytesRead;
}
return 0;
}
return 0;
}
}
else
{
bReadStatus = ReadFile( m_hComDev, buffer, dwCount, &dwBytesRead, NULL );
if(!bReadStatus) return 0;
}
return dwBytesRead;
}
void CSerial::SetRunning(BOOL bRun)
{
m_bGoAhead=bRun;
}
BOOL CSerial::IsRunning()
{
return(m_bGoAhead);
}
BOOL CSerial::RecvOneByteReturnOneRevByte(BYTE *ch)
{
if(ReadData(ch,1)==1)
{
BYTE ucTemp;
ucTemp=~(*ch);
Sleep(10);
if(SendData(&ucTemp,1)==1 )
{
Sleep(10);
if(ReadData(&ucTemp,1)>0) return TRUE;
}
}
return FALSE;
}
BOOL CSerial::SendOneByteRecvOneRevByte(BYTE *ch)
{
BYTE pBuffer[4];
if(SendData(ch,1)>0 )
{
Sleep(10);
if(ReadData(pBuffer,2)==2 && pBuffer[1]==0xFF-(*ch))
{
TRACE("%2X,%2X\n",pBuffer[0],pBuffer[1]);
return TRUE;
}
return FALSE;
}
return FALSE;
}
void CSerial::SetOverlapped(BOOL bTrue)
{
m_bUseOverlapped=bTrue;
}
int CSerial::ReceiveBoschFrame(BYTE *pBuffer)
{
int i=0,iLen;
if(RecvOneByteReturnOneRevByte(pBuffer+i))
{
iLen=pBuffer[0]+1;
Sleep(10);
for(i=1;i<iLen-1;i++)
{
if(RecvOneByteReturnOneRevByte(pBuffer+i)==FALSE) return -1;
Sleep(10);
}
if(ReadData(pBuffer+i,1)!=1) return -1;
return iLen;
}
return -1;
}
/*int CSerial::ReadCanData(BYTE *pBuffer)
{
int iRet=0;
BYTE ch;
iRet=ReadData(pBuffer,20);
return iRet;
}*/
int CSerial::ReadCanData(BYTE *pBuffer)
{
int iRet=0;
BYTE ch;
ReadData(&ch,1);
if(ch!=0x55) iRet=-1;
ReadData(&ch,1);
if(ch!=0xAA) iRet=-1;
ReadData(&ch,1);
iRet=ReadData(pBuffer,ch+1);
if(iRet!=ch+1)
iRet=-1;
if(iRet!=-1)
iRet=ch;
else
pBuffer[2]=3;
return iRet;
}
/*int CSerial::SendCanData(BYTE *pSendBuffer,int count)
{
int i;
unsigned int izyz = 0;
BYTE ch,pucBuffer[30]={0x55,0xAA,0x0F,0x61,0xFF};
BYTE TempBuff[64]={0};
memcpy(TempBuff,pSendBuffer,count);
if((TempBuff[0]&0x80)==0x80)
{
izyz = 0;
izyz = ((TempBuff[1]*0x01000000+TempBuff[2]*0x010000+TempBuff[3]*0x0100+TempBuff[4])<<3);
//izyz = (izyz&0x1fffffff);
TempBuff[4] = (BYTE)(izyz&0xff);
TempBuff[3] = (BYTE)((izyz>>8)&0xff);
TempBuff[2] = (BYTE)((izyz>>16)&0xff);
TempBuff[1] = (BYTE)((izyz>>24)&0xff);
}
memcpy(pucBuffer+5,TempBuff,count);
//check check sum
ch=pucBuffer[2];
pucBuffer[pucBuffer[2]+3]=0x00;
for(i=3; i<count+5; i++)
ch^=pucBuffer[i];
pucBuffer[count+5]=ch;
i=SendData(pucBuffer,6+count);
return i;
}*/
int CSerial::SendCanData(BYTE *pSendBuffer)
{
int i;
BYTE ucLen,pucBuffer[20]={0x55,0xAA,0x00,0x61,0x00};
ucLen=pSendBuffer[0]&0x0F;
if(ucLen>8) ucLen=8;
if(ucStandardCAN)
{
pucBuffer[4]=0x00;
pucBuffer[2]=ucLen+5;
}
else
{
pucBuffer[4]=0xFF;
pucBuffer[2]=ucLen+7;
}
memcpy(pucBuffer+5,pSendBuffer,pucBuffer[2]-2);
//check check sum
pucBuffer[pucBuffer[2]+3]=0x00;
for(i=0; i<=pucBuffer[2]; i++)
pucBuffer[pucBuffer[2]+3]^=pucBuffer[i+2];
i=SendData(pucBuffer,pucBuffer[2]+4);
return i;
}
int CSerial::SendCanData(BYTE *pSendBuffer,int count)
{
int i;
unsigned int izyz = 0;
BYTE ch,pucBuffer[30]={0x55,0xAA,0x0F,0x61,0xFF};
BYTE TempBuff[64]={0};
/* ucLen=pSendBuffer[0]&0x0F;
if(ucLen>8) ucLen=8;
if(ucStandardCAN)
{
pucBuffer[4]=0x00;
pucBuffer[2]=ucLen+5;
}
else
{
pucBuffer[4]=0xFF;
pucBuffer[2]=ucLen+7;
}
*/
memcpy(TempBuff,pSendBuffer,count);
if((TempBuff[0]&0x80)==0x80)
{
izyz = 0;
izyz = ((TempBuff[1]*0x01000000+TempBuff[2]*0x010000+TempBuff[3]*0x0100+TempBuff[4])<<3);
//izyz = (izyz&0x1fffffff);
TempBuff[4] = (BYTE)(izyz&0xff);
TempBuff[3] = (BYTE)((izyz>>8)&0xff);
TempBuff[2] = (BYTE)((izyz>>16)&0xff);
TempBuff[1] = (BYTE)((izyz>>24)&0xff);
}
memcpy(pucBuffer+5,TempBuff,count);
//check check sum
ch=pucBuffer[2];
pucBuffer[pucBuffer[2]+3]=0x00;
for(i=3; i<count+5; i++)
ch^=pucBuffer[i];
pucBuffer[count+5]=ch;
i=SendData(pucBuffer,6+count);
return i;
}
//DEL BOOL CSerial::iAuto()
//DEL {
//DEL
//DEL }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -