📄 serial.cpp
字号:
// Serial.cpp: implementation of the CSerial class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "A39cmd.h"
//#include "CMD_COLLECTION.h"
#include "Serial.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$全局变量$$$$$$$$$$$$$$$$$$$$$$$$$$
HANDLE hport;
unsigned char recv_buf[1024] ;
DWORD m_recv_index=0;
DWORD old_index_I=0,old_index_E=0;
DWORD judge_success_cnt=0;
COMSTAT comstate;
DWORD FLG_bt_into_talking,FLG_bt_release;
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void Judge()
{
CString str,str1;
TCHAR temp;
str1= recv_buf;
if( str1.Find('I')>0)
{
FLG_bt_into_talking=1;
}
}
//////////////////////////////////////////////////////////////////////////////
DWORD WINAPI ReadPortThread(LPVOID lpvoid)
{
CString str;
char BUF;
DWORD dwComEvent,dwlength=0;
BOOL recv_flg;
BOOL new_flg=FALSE;
unsigned int temp_i=0;
DWORD err;
//DWORD err =CE_RXOVER |CE_OVERRUN |CE_BREAK |CE_FRAME |CE_IOE ;
// COMSTAT comstate;
while(hport!=INVALID_HANDLE_VALUE)
{
::SetCommMask(hport,EV_RXCHAR );
recv_flg=WaitCommEvent(hport,&dwComEvent,NULL);
::SetCommMask(hport,EV_RXCHAR );
if((dwComEvent&EV_RXCHAR)==EV_RXCHAR)
{
ClearCommError(hport,
&err,
&comstate
);
do
{
::ReadFile(hport,&BUF,1,&dwlength,NULL);
if(dwlength==1)
{
recv_buf[m_recv_index++]=(unsigned char)BUF;
if(m_recv_index==1023)
{
memset(&recv_buf,NULL,1024);
m_recv_index=old_index_E=old_index_I=0;
}
}
Judge();
}while(dwlength==1);
}
//退出wait后要从新进行设置
::SetCommMask(hport,EV_RXCHAR );
}
// ::AfxMessageBox(_T("hport failed"));
return 1;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSerial::CSerial()
{
}
CSerial::~CSerial()
{
cy_ClosePort();
}
///////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CSerial::cy_initDCB()
{
CString str;
if(!GetCommState(hport, &m_dcb))
{
CloseHandle(hport);
return FALSE;
}
memset(&m_dcb ,0 ,sizeof(DCB));
m_dcb.DCBlength=sizeof(m_dcb);
m_dcb.BaudRate =CBR_19200;
m_dcb.ByteSize = 8;
m_dcb.Parity =NOPARITY ;
m_dcb.StopBits =ONESTOPBIT;
m_dcb.fBinary=TRUE;
m_dcb.fDsrSensitivity=false;
m_dcb.fParity=NOPARITY;
m_dcb.fOutX=false;
m_dcb.fInX=false;
m_dcb.fNull=false;
m_dcb.fAbortOnError=TRUE;
m_dcb.fOutxCtsFlow=FALSE;
m_dcb.fOutxDsrFlow=false;
m_dcb.fDtrControl=DTR_CONTROL_DISABLE;
m_dcb.fDsrSensitivity=false;
m_dcb.fRtsControl=RTS_CONTROL_DISABLE;
m_dcb.fOutxCtsFlow=false;
m_dcb.fOutxCtsFlow=false;
// m_dcb.XonChar = 0xff;
// m_dcb.XoffChar =0xfe;
// m_dcb.XonLim = 20;
// m_dcb.XoffLim =20;
//根据bcd配置端口
if(!SetCommState(hport,&m_dcb))
{
CloseHandle(hport);
return FALSE;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CSerial::cy_SetTimeOut()
{
DWORD err;
CString str;
//等到指定元器件的指定超时设置
if(!GetCommTimeouts(hport,&m_timeout))
{
return FALSE;
}
//在通讯线上到达的两个字符之间的时间间隔
m_timeout.ReadIntervalTimeout = MAXDWORD;
//指定乘数,用于计算在读数据期间的timeout总数,被乘数是请求要接收的字节数,
m_timeout.ReadTotalTimeoutMultiplier=0;
//指定一个定量,在乘完后就加上
m_timeout.ReadTotalTimeoutConstant=0;
m_timeout.WriteTotalTimeoutConstant=1000;
m_timeout.WriteTotalTimeoutMultiplier=0;
if(!SetCommTimeouts(hport,&m_timeout))
{
err=::GetLastError();
return FALSE;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CSerial::cy_OpenPort()
{
CString str;
//==========================
hport=CreateFile(TEXT("COM5:"),GENERIC_READ|GENERIC_WRITE,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hport==INVALID_HANDLE_VALUE)
{
DWORD err;
err=::GetLastError();
// str="create file failed";
// ::AfxMessageBox(str);
}
cy_initDCB();
if(!cy_SetTimeOut())
{
return FALSE;
}
//指定端口监控事件----接收字符
::SetCommMask(hport,EV_RXCHAR);
//指定内部buffer
if(!SetupComm(hport,1024,1024))
{ }
//初始化缓冲区数据,这个函数还能中止读写操作
PurgeComm(hport, PURGE_TXABORT |
PURGE_RXABORT |
PURGE_TXCLEAR |
PURGE_RXCLEAR );
return TRUE;
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
BOOL CSerial::cy_write( BYTE *pcmd,unsigned int num)
{
DWORD iBytesWritten;
CString str;
//BYTE ZCMD_DIAIL_NUMBER[]={ 0x20,0x28,0x31,0x33,0x36,0x33,0x32,0x36,0x39,0x37,0x34,0x31,0x33,0x29};
if(!WriteFile(hport,pcmd, num, &iBytesWritten, NULL) )
{
str="failed to write to the port";
// ::AfxMessageBox(str);
return FALSE;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
BOOL CSerial::cy_ClosePort()
{
CString str;
if(!CloseHandle(hport))
{
return FALSE;
}
else
{
hport = INVALID_HANDLE_VALUE;
return TRUE;
}
}
///////////////////////////////////////////////////////////////////
BOOL CSerial::cy_Read()
{
HANDLE hReadThrd;
hReadThrd=::CreateThread(NULL,0,
ReadPortThread,
0, //不需要这个参数,所以设成0
0, //The thread runs immediately after creation.
NULL);
if(hReadThrd==INVALID_HANDLE_VALUE)
{
CString str;
// str="thread failed";
// ::AfxMessageBox(str);
return FALSE;
}
else
{
m_connected=TRUE;
return FALSE;
}
}
/////////////////////////////////////////////////////////////////////
////////////////读指定字节的数据///////////////////////////
DWORD CSerial::ReadFromA(TCHAR Buf[], DWORD Count)
{
DWORD dwBytesTransferred;
ReadFile (hport, recv_buf, Count, &dwBytesTransferred, 0);
return dwBytesTransferred;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -