📄 serialthread.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 + -