📄 operateserial.cpp
字号:
// OperateSerial.cpp: implementation of the COperateSerial class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "QZSerialServer.h"
#include "OperateSerial.h"
#include <Afxtempl.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern HANDLE m_hWriteSerialEvent ;
extern bool writethreadmutex;
HANDLE hComPort = INVALID_HANDLE_VALUE;
HANDLE m_hWriteEndEvent = NULL ;
//INT nSpeed = CBR_38400;//CBR_4800;//CBR_19200;
DWORD WINAPI ReadSerialtThread(LPVOID lp);
DWORD dwReadThreadID;
BOOL fReadContinue = TRUE;
//HANDLE m_hInitEvent = NULL
//extern HWND m_hwnd = NULL;
CString m_AtCommand("");
DWORD dwProcessRecieveDataThreadID;
BOOL analyseReceiveDataMutex = TRUE ;
HANDLE hAnaRecieveDateEvent = NULL ;
CList<CString,CString&>List_strReceiveInfo;
void AddRetInfoToList(CString RetInfo);
BOOL AnalyseReceieveDataInfo(CString RetInfo);
int AnalyseUnsolicitedInfoFromCom(CString RetInfo);
COperateSerial::COperateSerial()
{
}
COperateSerial::~COperateSerial()
{
}
//////////////////////////////////////////////////////////////////////////////////////
BOOL COperateSerial::OpenSerial(TCHAR *Port, int Baud_rate)
{
DCB dcb;
COMMTIMEOUTS cto;
hComPort = CreateFile (L"COM3:", GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
if (hComPort != INVALID_HANDLE_VALUE)
{
// Configure port.
//if(!InitDCB(Baud_rate))
//return FALSE;
GetCommState (hComPort, &dcb);
dcb.BaudRate = CBR_38400; //波特率
dcb.fParity = NOPARITY; //不启用奇偶校验
dcb.ByteSize = 8; //每字节的位数
dcb.Parity = NOPARITY;//无奇偶校验
dcb.StopBits = ONESTOPBIT; //每字节一位停止位
dcb.EvtChar = 0x02 ; //标志事件的字符个数
dcb.fOutxCtsFlow = 0 ; //串行端口的输出由CTS线控制
dcb.fDtrControl = 0 ; //启用DTR线
dcb.fRtsControl = RTS_CONTROL_ENABLE ;//2 ; //启用RTS线 RTS_CONTROL_DISABLE
dcb.EofChar = 26 ;
SetCommState (hComPort, &dcb);
// Set the timeouts. Set infinite read timeout.
//if(!InitSerialTimes())
//return FALSE;
cto.ReadIntervalTimeout = 2;
cto.ReadTotalTimeoutMultiplier = 100;
cto.ReadTotalTimeoutConstant = 1000;
cto.WriteTotalTimeoutMultiplier = 0;
cto.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts (hComPort, &cto);
}else
{
#ifdef QZ_MY_SERVICE_DEBUG
printf("Open Serial fail!\n");
CString strError;
strError.Format(_T("Can't open %s, Error No.=%d"),
hComPort, GetLastError());
MessageBox (NULL, strError,TEXT("Error!"), MB_OK);
#endif
return FALSE;
}
//分配设备缓冲区
SetupComm(hComPort,512,512);
//初始化缓冲区中的信息
PurgeComm(hComPort,PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_RXABORT|PURGE_TXABORT);
//设置端口上指定信号的状态
// SETDTR: 发送DTR (data terminal ready)信号
// SETRTS: 发送RTS (request to send)信号
EscapeCommFunction(hComPort,SETDTR);
EscapeCommFunction(hComPort,SETRTS);
Sleep(1000);
if (hReadThread = CreateThread( NULL, 0, ReadSerialtThread, 0, 0,&dwReadThreadID ) )
{//创建一个从串口读取数据的线程
//CloseHandle(hReadThread);
}
else
{//不能创建线程
#ifdef QZ_MY_SERVICE_DEBUG
MessageBox (NULL, TEXT("Can't create thread!"),
TEXT("Error!"), MB_OK);
DWORD dwError = GetLastError ();
printf("deError=%d\n",dwError);
#endif
return FALSE;
}
if (hAnaRecieveDataThread = CreateThread( NULL, 0, ProcessRecieveDataInfoThread, 0, 0,&dwProcessRecieveDataThreadID))
{//创建一个从串口读取数据的线程
//CloseHandle(hReadThread);
}
else
{//不能创建线程
#ifdef QZ_MY_SERVICE_DEBUG
MessageBox (NULL, TEXT("Can't create thread!"),
TEXT("Error!"), MB_OK);
DWORD dwError = GetLastError ();
printf("deError=%d\n",dwError);
#endif
return FALSE;
}
hAnaRecieveDateEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
m_hWriteEndEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
return TRUE;
}
BOOL COperateSerial::InitDCB(int Baud_rate)
{
DCB dcb;
GetCommState (hComPort, &dcb);
dcb.BaudRate = CBR_38400;
dcb.fParity = FALSE;
dcb.fNull = FALSE;
dcb.StopBits = ONESTOPBIT;
dcb.Parity = NOPARITY;
dcb.ByteSize = 8;
SetCommState (hComPort, &dcb);
return TRUE;
}
BOOL COperateSerial::InitSerialTimes()
{
COMMTIMEOUTS cto;
cto.ReadIntervalTimeout = 0;
cto.ReadTotalTimeoutMultiplier = 0;
cto.ReadTotalTimeoutConstant = 0;
cto.WriteTotalTimeoutMultiplier = 0;
cto.WriteTotalTimeoutConstant = 0;
SetCommTimeouts (hComPort, &cto);
return TRUE;
}
BOOL COperateSerial::WriteSerial(CString strIn)
{
unsigned long cBytes;
CString strTemp;
LPWSTR pCommand = strIn.GetBuffer(strIn.GetLength()) ;
int len = wcslen(pCommand) ;
char *tp = new char[len] ;
if(strIn.Find(_T("AT")) != -1)
{
m_AtCommand = strIn ;//Save current AT command string
m_AtCommand.Remove('\r') ;
}
memset(tp,0,len) ;
wcstombs(tp,pCommand,len) ;
PurgeComm(hComPort,PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_RXABORT|PURGE_TXABORT);
#ifdef QZ_MY_SERVICE_DEBUG
printf("writein=%s\n",tp);
#endif
WriteFile (hComPort, tp,len,&cBytes, 0);
SetEvent(m_hWriteEndEvent);
return TRUE;
}
BOOL COperateSerial::CloseSerial()
{
fReadContinue=FALSE;
Sleep(1000);
CloseHandle(hComPort);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////
HANDLE hFile;
DWORD WINAPI ReadSerialtThread(LPVOID lpvoid)
{
//读取串口信息的线程
DWORD ComStatus ; //串口状态,以判断是否有事件发生
DWORD dwErrorFlags;//读串口状态的标志
COMSTAT ComStat;//串口状态的详细情况表
DWORD dwLength;//读入信息的长度
BOOL fReadState = FALSE ;//读入信息时返回值,若为TRUE就是正确读入
// TCHAR *fbuf=new TCHAR[256],*pbuf=fbuf;//设置缓冲区,并多定义一个指针以方便移动
BYTE byte ;
// char byte[50];
char receivechar[1024] ;
memset(receivechar,0,1024) ;
/// memset(byte, 0, 50);
int count = 0 ;
//程序在串口有效的状态下,无限循环
while (hComPort != INVALID_HANDLE_VALUE)
{
//等待串口的事件发生,当dwCommModemStatus值为1时表示接收到数据
WaitCommEvent(hComPort, &ComStatus, 0);
SetCommMask(hComPort, EV_RXCHAR);//重新设置程序响应的事件,但这个只是保证程序的安全性
//一般并不起作用
if( ComStatus & EV_RXCHAR ) //检测收到的事件是否为"接收字符"的事件
{
ClearCommError(hComPort,&dwErrorFlags,&ComStat);//清除串口状态标志,并返回当前状态
//cbInQue返回在串行驱动程序输入队列中的字符数
dwLength=ComStat.cbInQue;
if(dwLength>0)//防止无故产生事件
{//从串口读取数据
do
{
fReadState=ReadFile(hComPort,&byte,1,&dwLength,NULL);//&READ_OS);
//读入数据,并返回数据长度,采用同步方式
if(dwLength == 1)
{
receivechar[count++] = byte ;
// strcat(receivechar, byte);
// count += dwLength;
}
if(!fReadState)
{//不能从串口读取数据
MessageBox(NULL,TEXT("Can't fetch the data!"),TEXT("Reading Error!"),MB_OK);
}
}while((dwLength == 1) && (NULL == strstr(receivechar, "ring")) && (NULL == strstr(receivechar, "RING")));
}
else
{//dwLength = 0
continue;
}
//读取串口信息完毕
////在ProcessData函数中处理数据.
receivechar[count++] = '\0' ;
printf("%s\n",receivechar) ;
//Process Information from serial port
CString temp = receivechar;
List_strReceiveInfo.AddHead(temp) ;
AddRetInfoToList(temp);
if(analyseReceiveDataMutex)
{
analyseReceiveDataMutex=FALSE;
SetEvent(hAnaRecieveDateEvent);
}
count = 0;
}
//返回while循环
}//结束while循环
return 0;
}
void AddRetInfoToList(CString RetInfo)
{//Add String to Info_List whitch returned from serial
CString temp(""),temp_left(""),temp_right("") ;
if(RetInfo.Find(TEXT("+CMTI:")) != -1)
{
temp_left = RetInfo.Left(RetInfo.Find(TEXT("+CMTI:"))) ;
temp = RetInfo.Right(RetInfo.GetLength() - RetInfo.Find(TEXT("+CMTI:"))) ;
temp = temp.Left(temp.Find(TEXT("\r"))) ;
temp_right = RetInfo.Right(RetInfo.GetLength() - RetInfo.Find(TEXT("+CMTI:")) - temp.GetLength()) ;
temp_left.Remove('\r') ;
temp_left.Remove('\n') ;
temp_right.Remove('\r') ;
temp_right.Remove('\n') ;
if((temp_left.Compare(TEXT("")) == 0)&&(temp_right.Compare(TEXT("")) == 0))
return ;
List_strReceiveInfo.AddHead(temp) ;
}
if(RetInfo.Find(TEXT("NO CARRIER")) != -1)
{
temp_left = RetInfo.Left(RetInfo.Find(TEXT("NO CARRIER"))) ;
temp = RetInfo.Right(RetInfo.GetLength() - RetInfo.Find(TEXT("NO CARRIER"))) ;
temp = temp.Left(temp.Find(TEXT("\r"))) ;
temp_right = RetInfo.Right(RetInfo.GetLength() - RetInfo.Find(TEXT("NO CARRIER")) - temp.GetLength()) ;
temp_left.Remove('\r') ;
temp_left.Remove('\n') ;
temp_right.Remove('\r') ;
temp_right.Remove('\n') ;
if((temp_left.Compare(TEXT("")) == 0)&&(temp_right.Compare(TEXT("")) == 0))
return ;
List_strReceiveInfo.AddHead(temp) ;
}
if(RetInfo.Find(_T("BUSY")) != -1)
{
temp_left = RetInfo.Left(RetInfo.Find(TEXT("BUSY"))) ;
temp = RetInfo.Right(RetInfo.GetLength() - RetInfo.Find(TEXT("BUSY"))) ;
temp = temp.Left(temp.Find(TEXT("\r"))) ;
temp_right = RetInfo.Right(RetInfo.GetLength() - RetInfo.Find(TEXT("BUSY")) - temp.GetLength()) ;
temp_left.Remove('\r') ;
temp_left.Remove('\n') ;
temp_right.Remove('\r') ;
temp_right.Remove('\n') ;
if((temp_left.Compare(TEXT("")) == 0)&&(temp_right.Compare(TEXT("")) == 0))
return ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -