📄 serialport.cpp
字号:
return 0;
}
DWORD dwLen = 0;
COMSTAT ComStat;
DWORD dwErrorFlags;
ClearCommError(m_hCom, &dwErrorFlags, &ComStat);
dwLen = min(dwLength, ComStat.cbInQue);
ReadFile(m_hCom, pszBuff, dwLen, &dwLen, &m_osRead);
return dwLen;
}
/********************************************************************/
/** 功能: 向串口写一个字符 */
/** 参数: */
/** chOut--要写的字符 */
/** 返回值: */
/** TRUE--成功 */
/** FALSE--失败 */
/********************************************************************/
BOOL CSerialPort::WriteCom(char chOut)
{
if(!m_bInitComOk)
{
return FALSE;
}
BOOL bState;
DWORD dwLen = 1;
COMSTAT ComStat;
DWORD dwErrorFlags;
char chValue = chOut;
ClearCommError(m_hCom, &dwErrorFlags, &ComStat);
PurgeComm(m_hCom, PURGE_TXCLEAR);
bState = WriteFile(m_hCom, &chValue, dwLen, &dwLen, &m_osWrite);
if(!bState)
{
if(GetLastError() == ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom, &m_osWrite, &dwLen, TRUE);// 等待
}
else
{
dwLen = 0;
}
}
if(dwLen == 1)
{
return TRUE;
}
return FALSE;
}
/********************************************************************/
/** 功能: 向串口写一个字 */
/** 参数: */
/** wOut--要写的字 */
/** 返回值: */
/** TRUE--成功 */
/** FALSE--失败 */
/********************************************************************/
BOOL CSerialPort::WriteCom(WORD wOut)
{
if(!m_bInitComOk)
{
return FALSE;
}
BOOL bState;
DWORD dwLen = 1;
COMSTAT ComStat;
DWORD dwErrorFlags;
WORD wValue = wOut;
ClearCommError(m_hCom, &dwErrorFlags, &ComStat);
PurgeComm(m_hCom, PURGE_TXCLEAR);
bState = WriteFile(m_hCom, &wValue, dwLen, &dwLen, &m_osWrite);
if(!bState)
{
if(GetLastError() == ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom, &m_osWrite, &dwLen, TRUE);// 等待
}
else
{
dwLen = 0;
}
}
if(dwLen == 1)
{
return TRUE;
}
return FALSE;
}
/********************************************************************/
/** 功能: 向串口读取指定长度的字符 */
/** 参数: */
/** szBuff--要写的字符串 */
/** dwLength--要写的字符串的长度 */
/** 返回值: */
/** DWORD型--实际写的长度 */
/********************************************************************/
DWORD CSerialPort::WriteCom(char *pszBuff, DWORD dwLength)
{
if(!m_bInitComOk)
{
return 0;
}
BOOL bState;
DWORD dwLen = dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags;
if(dwLen == -1)
{
dwLen = strlen(pszBuff);
}
ClearCommError(m_hCom, &dwErrorFlags, &ComStat);
PurgeComm(m_hCom, PURGE_TXCLEAR);
bState = WriteFile(m_hCom, pszBuff, dwLen, &dwLen, &m_osWrite);
if(!bState)
{
if(GetLastError() == ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom, &m_osWrite, &dwLen, TRUE);// 等待
}
else
{
dwLen = 0;
}
}
return dwLen;
}
/********************************************************************/
/** 功能: 结束工作者线程,关闭串行口 */
/** 参数: 无 */
/** 返回值: 无 */
/********************************************************************/
void CSerialPort::CloseCom()
{
StopMonitor();
if(m_hCom != NULL)
{
PurgeComm(m_hCom, PURGE_TXCLEAR);
PurgeComm(m_hCom, PURGE_RXCLEAR);
CloseHandle(m_hCom);
m_hCom = NULL;
}
ClearBuff();
}
/********************************************************************/
/** 功能: 配置串行口 */
/** 参数: 无 */
/** TRUE--成功 */
/** FALSE--失败 */
/********************************************************************/
/*BOOL ConfigCom(const int nBaudRate = 115200,
const int nByteSize = 8,
const int nStopBits = 1,
const int nParity = 0
)
{
DCB dcb;
BOOL bRet = FALSE;
if(!GetCommState(m_hCom, &dcb))
{
return FALSE;
}
dcb.fBinary = TRUE;
dcb.BaudRate = nBaudRate; // 波特率
dcb.ByteSize = nByteSize; // 每字节位数
dcb.fParity = TRUE;
switch(nParity)
{//校验设置
case PARITYNONE:
dcb.Parity = NOPARITY;
break;
case PARITYODD:
dcb.Parity = ODDPARITY;
break;
case PARITYEVEN:
dcb.Parity = EVENPARITY;
break;
case PARITYMARK:
dcb.Parity = MARKPARITY;
break;
case PARITYSPACE:
dcb.Parity = SPACEPARITY;
break;
default:
break;
}
switch(nStopBits)
{//停止位
case STOPBITONE:
dcb.StopBits = ONESTOPBIT;
break;
case STOPBITONE5:
dcb.StopBits = ONE5STOPBITS;
break;
case STOPBITTWO:
dcb.StopBits = TWOSTOPBITS;
break;
default:
break;
}
return SetCommState(m_hCom, &dcb);}*/
BOOL CSerialPort::ConfigCom()
{
DCB dcb;
BOOL bRet = FALSE;
if(!GetCommState(m_hCom, &dcb))
{
return FALSE;
}
//////////////////////////////////////////////////////////////
//dcb.BaudRate=115200;
//dcb.ByteSize;
//dcb.DCBlength;
dcb.EofChar=0;
dcb.ErrorChar=0;
dcb.EvtChar=0;
dcb.fAbortOnError=0;
dcb.fBinary=1;
dcb.fDsrSensitivity=0;
dcb.fDtrControl=1;
//dcb.fDummy2=0;
dcb.fErrorChar=0;
dcb.fInX=0;
dcb.fNull=0;
dcb.fOutX=0;
dcb.fOutxCtsFlow=0;
dcb.fOutxDsrFlow=0;
dcb.fParity=0;
dcb.fRtsControl=1;
dcb.fTXContinueOnXoff=0;
dcb.Parity=2;
dcb.StopBits=0;
// //dcb.wReserved=0;
// //dcb.wReserved1=0;
dcb.XoffChar=0x13;
//dcb.XoffLim=13107;
dcb.XonChar=0x11;
//dcb.XonLim=13107;
//////////////////////////////////////////////////////////////
dcb.fBinary = TRUE;
dcb.BaudRate = m_nBaudRate; // 波特率
dcb.ByteSize = m_nByteSize; // 每字节位数
dcb.fParity = TRUE;
switch(m_nParity)
{//校验设置
case PARITYNONE:
dcb.Parity = NOPARITY;
break;
case PARITYODD:
dcb.Parity = ODDPARITY;
break;
case PARITYEVEN:
dcb.Parity = EVENPARITY;
break;
case PARITYMARK:
dcb.Parity = MARKPARITY;
break;
case PARITYSPACE:
dcb.Parity = SPACEPARITY;
break;
default:
break;
}
switch(m_nStopBits)
{//停止位
case STOPBITONE:
dcb.StopBits = ONESTOPBIT;
break;
case STOPBITONE5:
dcb.StopBits = ONE5STOPBITS;
break;
case STOPBITTWO:
dcb.StopBits = TWOSTOPBITS;
break;
default:
break;
}
int sjjstase=SetCommState(m_hCom, &dcb);
SetupComm(m_hCom, 13107, 13107);
PurgeComm(m_hCom, PURGE_TXCLEAR);
PurgeComm(m_hCom, PURGE_RXCLEAR);
EscapeCommFunction(m_hCom,CLRDTR);
EscapeCommFunction(m_hCom,SETDTR);
return sjjstase;
}
/********************************************************************/
/** 功能: 清空缓冲区 */
/** 参数: 无 */
/** 返回值: 无 */
/********************************************************************/
void CSerialPort::ClearBuff()
{
EnterCriticalSection(&m_csComSync);
m_CharList.RemoveAll();
LeaveCriticalSection(&m_csComSync);
}
/********************************************************************/
/** 功能: 读取字符 */
/** 参数: 无 */
/** TRUE--成功 */
/** FALSE--失败 */
/********************************************************************/
BOOL CSerialPort::RecvChar()
{
if(!m_bInitComOk)
{
return FALSE;
}
char *cChb,*cCha;
char cCh;
int nLength,wh,sj,n;
UCHAR TempData[10000];
//zero=0;
if(!m_bMonitoring)
{
//允许读取下一个数据
SetEvent(m_hCanReadEvent);
return FALSE;
}
nLength = ReadCom(&cCh, 1);
////////////////////SELF
COMMTIMEOUTS timeouts = { MAXDWORD, 0, 0, 0, 1102 };
COMMTIMEOUTS timeouts0 = { MAXDWORD, 0, 0, 0, 0 };
cChb=&cCh;
cCha=cChb;
//m_File00.Seek(CFile::begin,CFile::begin);
//m_File00.Read(TempData,16);
for(int sjj=0;sjj<nLength;sjj++)
{
/* for(int n=1;n<2;n++)
{
MessageBox(NULL,"串口","PHILIPS",MB_OK);
for(int x=10;x<1000;x++){
WriteCom((char*)yaya,2);
//if(n>100000)
// n=2;
for(int m=1;m<800000;m++)
{
for(int j=1;j<400000;j++)
;
}
}
}
*/
if((*cCha==0x49)&&(stase==1))
{
WriteCom((char*)yaya,1);
EscapeCommFunction(m_hCom,CLRDTR);
//timeouts = {MAXDWORD, 0, 0, 0, 0 };
SetCommTimeouts( m_hCom, &timeouts0 );
stase=2;
break;
}
else if( ((*cCha==0x14) ||(*cCha==0x54) ||(*cCha==0x10) || (*cCha==0xffffffc6) || (*cCha==0xffffffc4)|| (*cCha==0x0d)|| (*cCha==0xffffffc6)) && stase==2)//&&(stase==1))
{
COMMTIMEOUTS timeouts1 ={MAXDWORD, 0, 0, 0, 3};
SetCommTimeouts( m_hCom, &timeouts1);
//m_File00.Seek(16,CFile::begin);
if(bb==1)
{
for(n=0;n<100;n++)
command[n]=command_Z[n];
}
if(bb==0)
{
for(n=0;n<100;n++)
command[n]=command_O[n];
}
//m_File00.Read(TempData,59);
WriteCom((char*)(command),1);//e0
stase=3;
break;
}
else if((*cCha==0xffffffc0) && stase==3)//0xffffffa0))// && (*(cCha+1)==0x3) && (*(cCha+2)==0x60) && (*(cCha+3)==0xffffffc2) && (*(cCha+4)==0x20) && (*(cCha+5)==0x10) )
{ ////// check return:0xa0 0x03 0x60 0xc2 0x20 0x10
SetCommTimeouts( m_hCom, &timeouts0);
if(band_select==1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -