📄 scom.cpp
字号:
// SCom.cpp: implementation of the CSCom class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MDF.h"
#include "SCom.h"
#include "MDFDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern CMDFApp theApp ;
//##ModelId=44B6F8840014
CSerialComm::CSerialComm()
{
m_bOpen = FALSE ;
m_bGsm = FALSE ;
m_strPort = "COM1" ;
hWrite = CreateEvent ( NULL , FALSE , TRUE , NULL ) ; //建立信号状态
m_hEvent = CreateEvent ( NULL, FALSE , TRUE , NULL ) ; //建立信号状态
}
//##ModelId=44B6F8840015
CSerialComm::~CSerialComm()
{
CloseHandle(hWrite) ;
CloseHandle(m_hEvent) ;
CloseHandle(m_hCom) ;
}
//##ModelId=44B6F8840011
UINT CSerialComm::SCThd(LPVOID pPara)
{
UCHAR buf[4096] ;
int nRLen ;
CString ss,strTip ;
memset(buf,0,sizeof(buf)) ;
COMSTAT ComStat;
DWORD dwLength ;
DWORD dwErrorFlags;
CSerialComm* pSCom ;
//数据库嵌入对象初始化
if( pPara == NULL )
return -1;
pSCom = (CSerialComm*)pPara ;
while( pSCom->m_bOpen )
{
ClearCommError(pSCom->m_hCom , &dwErrorFlags , &ComStat);
if( ComStat.cbInQue > 0 )
{
Sleep(pSCom->m_ulTime) ;//GSM需等待200ms以保证通讯正确
ClearCommError(pSCom->m_hCom , &dwErrorFlags , &ComStat);
dwLength = ComStat.cbInQue ;
if( dwLength )
{
nRLen = ReadFile(pSCom->m_hCom , buf , dwLength , &dwLength , NULL ) ;
if( dwLength > 0 )
{
buf[dwLength] = '\0' ;
pSCom->DataProcess(buf,dwLength) ; //对接受数据进行处理
memset(buf,0,sizeof(buf)) ;
}
}
}
Sleep(1) ;//提高程序的效率
}
pSCom->m_pReadThread = NULL ;
strTip.Format("系统:通讯串口 %s 关闭",pSCom->GetPort()) ; //设置通讯串口
theApp.Show(strTip) ;
return 0 ;
}
//##ModelId=44B6F8840010
void CSerialComm::Connfig()
{
DCB dcb;
COMMTIMEOUTS TimeOuts = { // 串口超时控制参数
100, // 读字符间隔超时时间: 100 ms
1, // 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
500, // 基本的(额外的)读超时时间: 500 ms
1, // 写操作时每字符的时间: 1 ms (n个字符总共为n ms)
100}; // 基本的(额外的)写超时时间: 100 ms
SetupComm(m_hCom,4096,4096);
SetCommTimeouts(m_hCom, &TimeOuts);
GetCommState(m_hCom, &dcb) ;
dcb.fBinary = TRUE ; //传输二进制
dcb.BaudRate = m_ulRate ; //数据传输速率
dcb.ByteSize = 8 ; // 每字节位数
dcb.fParity = TRUE ; //校验
dcb.Parity = NOPARITY ; //为无校验
dcb.StopBits = ONESTOPBIT ; //1停止位
SetCommState(m_hCom, &dcb);
}
//##ModelId=44B6F8840007
BOOL CSerialComm::OpenCom(CString strPort)
{
CString strTip ;
iRecvLen = 0 ;
memset( ucRecvBuf , 0 , sizeof(ucRecvBuf)) ;
m_pReadThread = NULL ;
m_ulRate = 9600 ;
m_ulTime = 0 ;
m_bThread = TRUE ;//设读取线程为真
m_bOpen = FALSE ;//端口未打开
m_strPort = strPort ; //端口赋值
if(m_strPort.IsEmpty())
return m_bOpen = FALSE ;
m_hCom = CreateFile(
strPort, // 串口名称或设备路径
GENERIC_READ | GENERIC_WRITE, // 读写方式
0, // 共享方式:独占
NULL, // 默认的安全描述符
OPEN_EXISTING, // 创建方式
0, // 不需设置文件属性
NULL // 不需参照模板文件
);
if( m_hCom == INVALID_HANDLE_VALUE )
{
strTip.Format("异常:通讯串口 %s 开启失败",strPort) ;
theApp.Show(strTip) ;
theApp.OutPut(strTip) ;
strTip = "* " + strTip ;
return m_bOpen = FALSE ;
}
Connfig() ; //设置串口参数
strTip.Format("系统:通讯串口 %s 开启",strPort) ;
theApp.Show(strTip) ;
theApp.OutPut(strTip) ;
strTip = "* " + strTip ;
theApp.DebugShow(strTip) ;
return m_bOpen = TRUE ;
}
//##ModelId=44B6F8840005
void CSerialComm::CloseCom()
{
CString strTip ;
m_bOpen = FALSE ;
m_bThread = FALSE ;
CloseHandle(m_hCom) ;
}
//##ModelId=44B6F88303DF
void CSerialComm::DataProcess(UCHAR *buf, DWORD len)
{
theApp.m_pComm->RecvData(buf,len,ucRecvBuf,&iRecvLen,m_strPort) ;
}
//##ModelId=44B6F88303D8
int CSerialComm::Write(CString strBUF)
{
//int iRet ;
CString strTip ;
DWORD dwLength = strBUF.GetLength() ;
//iRet = WaitForSingleObject( hWrite , 1500 ) ;
//if ( iRet != WAIT_OBJECT_0 )
//{
//SetEvent(hWrite) ;
//return -1 ;
//}
if( m_bOpen )
WriteFile(m_hCom,strBUF.GetBuffer(0),dwLength,&dwLength,NULL);
else
dwLength = 0 ;
//Sleep(300) ;
//SetEvent(hWrite) ;
return (int)dwLength ;
}
//##ModelId=44B6F88303AD
int CSerialComm::Write(char *buf, int len)
{
int iRet ;
CString strTip,strSend ;
DWORD dwLength = len ;
strSend = buf ;
iRet = WaitForSingleObject( hWrite , 1500 ) ;
if ( iRet != WAIT_OBJECT_0 )
{
SetEvent(hWrite) ;
return -1 ;
}
if( m_bOpen )
WriteFile(m_hCom,buf,dwLength,&dwLength,NULL);
Sleep(300) ;
SetEvent(hWrite) ;
return (int)dwLength ;
}
//##ModelId=44B6F8840002
BOOL CSerialComm::InitCom(CString strPort)
{
if( OpenCom(strPort) )
{
m_pReadThread=::AfxBeginThread(SCThd, this); //启动读串口线程
return TRUE ;
}
else
return FALSE ;
}
//##ModelId=44B6F88303DB
int CSerialComm::Read(CString &strRead , int nLength)
{
DWORD dwNumRead; // 串口收到的数据长度
UCHAR buf[4096] ;
ReadFile(m_hCom, buf, (DWORD)nLength, &dwNumRead, NULL);
buf[dwNumRead] = '\0' ;
strRead = buf ;
return (int)dwNumRead;
}
//##ModelId=44B6F88303AA
int CSerialComm::Read(char *buf, int len)
{
DWORD dwNumRead; // 串口收到的数据长度
ReadFile(m_hCom, buf, (DWORD)len, &dwNumRead, NULL);
*(buf+dwNumRead) = '\0' ;
return (int)dwNumRead;
}
//##ModelId=44B6F88303A9
CString CSerialComm::GetPort()
{
return m_strPort ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -