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

📄 serialthread.cpp

📁 tc35i(GSM模块)的控制程序VC源码
💻 CPP
字号:
// SerialThread.cpp: implementation of the SerialThread class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
//#include "ArmFlash.h"
#include "SerialThread.h"
//#include "ArmFlashDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


//unsigned char com_status;
//////////////////////////////////////////////////////// //////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(SerialThread,CWinThread)
SerialThread::SerialThread()
{
InitializeCriticalSection(&m_csSend);
	InitializeCriticalSection(&m_csRecv);
}

SerialThread::~SerialThread()
{
DeleteCriticalSection(&m_csSend);
	DeleteCriticalSection(&m_csRecv);
}
BOOL SerialThread::InitInstance()
{
  return TRUE;
}
int SerialThread::Run()
{
	COMMTIMEOUTS Timeouts;
	CString str;
    while(1){
      // enter if there is command of openning and port has be closed before.
      if ((SCC::serialCtl().getStatusPort() == FALSE) &&(m_commStatus == COMM_STATUS_OPEN))
      {
        // 打开串口
        if (SCC::serialCtl().openPort(m_dcb,m_commName) == TRUE){
            SCC::serialCtl().SetCommLen(2000,200);//设置串口缓冲区长度
			SCC::serialCtl().GetCommTimeOut(Timeouts);
            Timeouts.WriteTotalTimeoutMultiplier = 0;
            Timeouts.WriteTotalTimeoutConstant = 0;
            Timeouts.ReadIntervalTimeout = 200;
            //Timeouts.ReadTotalTimeoutConstant = 0;
            //Timeouts.ReadTotalTimeoutMultiplier = 0;
            SCC::serialCtl().SetCommTimeOut(Timeouts);//设置超时时间
			AfxGetMainWnd()->PostMessage(MSG_UPDATA,UPDATAMSG_TYPE_COMM_OPEN,0L);
        }
        else{
			m_commStatus = COMM_STATUS_CLOSE;
            AfxGetMainWnd()->PostMessage(MSG_UPDATA,UPDATAMSG_TYPE_COMM_OPEN_FAILED,0L);
			SuspendThread();
        }
      }// Check status and signal controlling to close serial communication.
      else if ((m_commStatus == COMM_STATUS_CLOSE) && (SCC::serialCtl().getStatusPort() == TRUE))
      {
        if (SCC::serialCtl().closePort() == TRUE){
            AfxGetMainWnd()->SendMessage(MSG_UPDATA,UPDATAMSG_TYPE_COMM_CLOSE,0L);
        }else{
			m_commStatus = COMM_STATUS_OPEN;
		    AfxGetMainWnd()->SendMessage(MSG_UPDATA,UPDATAMSG_TYPE_COMM_CLOSE_FAILED,0L);
		}
      }else if (SCC::serialCtl().getStatusPort() == TRUE)
      {
        unsigned long r_len,s_len;  
		//EnterCriticalSection(&m_csRecv);
		
        if (SCC::serialCtl().read_scc(r_buf.b_data,read_buffer_length,r_buf.b_len) == TRUE){
		  if (r_buf.b_len > 0){
              //发送消息通知主线程串口接收到数据,主线程调用ReadRpns()函数读取数据
            AfxGetMainWnd()->SendMessage(MSG_UPDATA,UPDATAMSG_TYPE_COMM_DATA_ARRIVE,0L);
          }
		 
        }
		//LeaveCriticalSection(&m_csRecv);
		//EnterCriticalSection(&m_csSend);
        if (s_buf.pHead!=s_buf.pTail){
// 			AfxGetMainWnd()->SendMessage(MSG_UPDATA,UPDATAMSG_TYPE_COMM_DATA_SEND,0L);
			EnterCriticalSection(&m_csSend);
		    while(s_buf.pHead!=s_buf.pTail){
               SCC::serialCtl().write_scc(s_buf.pHead,1,s_len);
			   s_buf.pHead+=1;
			   if(s_buf.pHead==(s_buf.b_data+send_buffer_length))
				   s_buf.pHead=s_buf.b_data;
			   s_buf.b_len -- ;
			}
		    LeaveCriticalSection(&m_csSend);
		}
		Sleep(500);
		//LeaveCriticalSection(&m_csSend);
      }
	}
    return 0;
}
//请求本线程打开或关闭串口
void SerialThread::SetCommStatus(UCHAR status){
	switch(status){
	case COMM_STATUS_OPEN:
		m_commStatus = COMM_STATUS_OPEN;
		break;
	case COMM_STATUS_CLOSE:
        m_commStatus = COMM_STATUS_CLOSE;
		break;
	}
}
BOOL SerialThread::GetCommStatus(){
    return SCC::serialCtl().getStatusPort();
}
void SerialThread::InitCommConf(DCB dcb,CString commName){
    //初始化收发缓冲区
	s_buf.pHead=s_buf.b_data;
	s_buf.pTail=s_buf.b_data;
	s_buf.b_len=0;
	
    r_buf.pHead=r_buf.b_data;
	r_buf.pTail=r_buf.b_data;
	r_buf.b_len=0;

	//m_commStatus = COMM_STATUS_CLOSE;
	m_dcb = dcb;
	m_commName = commName;
}
void SerialThread::WriteCmd(PTBYTE pByte, UINT len) //向串口写命令
{
    EnterCriticalSection(&m_csSend);
    for(UINT i = 0 ; i < len ; i++){
	    *s_buf.pTail++ = pByte[i];
	    s_buf.b_len++;
	    if(s_buf.pTail==(s_buf.b_data+send_buffer_length))
		    s_buf.pTail=s_buf.b_data;
	}
	LeaveCriticalSection(&m_csSend);
}
CString SerialThread::GetMsgStr(UINT type){
	CString tempStr;
    switch(type){
	case UPDATAMSG_TYPE_COMM_OPEN:
		switch(m_dcb.BaudRate){
		case CBR_2400: 
			tempStr.Format(" Connected %d, N, 8, 1",2400);
			m_msgStr = m_commName + tempStr;
			break;
		case CBR_4800:
			tempStr.Format(" Connected %d, N, 8, 1",4800);
			m_msgStr = m_commName + tempStr;
			break;
		case CBR_9600:
			tempStr.Format(" Connected %d, N, 8, 1",9600);
			m_msgStr = m_commName + tempStr;
			break;
		case CBR_19200:
			tempStr.Format(" Connected %d, N, 8, 1",19200);
			m_msgStr = m_commName + tempStr;
			break;
		case CBR_38400:
			tempStr.Format(" Connected %d, N, 8, 1",38400);
			m_msgStr = m_commName + tempStr;
			break;
		case CBR_57600:
			tempStr.Format(" Connected %d, N, 8, 1",57600);
			m_msgStr = m_commName + tempStr;
			break;
		case CBR_115200:
			tempStr.Format(" Connected %d, N, 8, 1",115200);
			m_msgStr = m_commName + tempStr;
			break;
		}
		break;
	case UPDATAMSG_TYPE_COMM_OPEN_FAILED:
		m_msgStr = " fail to open " + m_commName + "!";
		break;
	case UPDATAMSG_TYPE_COMM_CLOSE:
		m_msgStr = m_commName + " Closed !";
		break;
	case UPDATAMSG_TYPE_COMM_CLOSE_FAILED:
		m_msgStr = "fail to close " + m_commName + "!";
		break;

	}
	return m_msgStr;
}
void SerialThread::ReadRpns(PTBYTE pByte, PUINT pLen)//读串口应答,用于显示和解析
{
	//EnterCriticalSection(&m_csRecv);
	*pLen = r_buf.b_len;
	for (UINT i = 0 ; i < r_buf.b_len ; i++)
	{
		pByte[i] = r_buf.b_data[i];
	}
	//LeaveCriticalSection(&m_csRecv);
		
}
//void SerialThread::ReadSdct(PTBYTE pByte, PUINT pLen)//读发送缓冲区内容用于显示
//{
//	//EnterCriticalSection(&m_csSend);
//    BYTE *pTemp;
//	UINT lenTemp = 0;
//	pTemp = s_buf.pHead;
//	//*pLen = s_buf.s_len;
//	while(pTemp!=s_buf.pTail){
//		pByte[lenTemp++] = *pTemp++;
//		if(pTemp==(s_buf.b_data+send_buffer_length))
//			pTemp=s_buf.b_data;
//	}
//    *pLen = lenTemp;
//	//LeaveCriticalSection(&m_csSend);
//}
/****************************End of file**************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -