⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 operateserial.cpp

📁 wince中 我自己的流驱动实现 注册表和bib文件 修改在QZSerialServerARMV4IRel目录下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -