MFC串口操作二:比較串口輸入的信息和配置文件信息是否相等

目錄

一、目的:

1、項目需要獲得某個串口值之後,執行相對應的操作,所以需要比較串口輸入的信息和配置文件信息是否相等

二、參考:

1、MFC串口操作一:顯示串口輸入信息

2、MFC批量讀取.ini文件字符串

3、LPCWSTR或LPWSTR與string相互轉換

三、操作

1、運行效果

1、LPCWSTR轉換爲string:爲了讀取配置文件信息

1、讀取配置文件

①頭文件中:記得包含頭文件

②源文件中:

1、初始化串口

①頭文件中:

1、配置文件:

1、設置MFC發佈的exe位置+保存配置文件位置:(可以把配置和平臺都設置爲這樣,這樣發佈的所有exe都在這個bin文件夾下)

1、比較串口輸入的信息和配置文件信息是否相等

1、添加消息響應事件:模擬按鍵

1、補充修改OnComm函數:



一、目的:

1、項目需要獲得某個串口值之後,執行相對應的操作,所以需要比較串口輸入的信息和配置文件信息是否相等

 

二、參考:

1、MFC串口操作一:顯示串口輸入信息

https://blog.csdn.net/qq_40544338/article/details/106350164

①總結:good:很好,親測有效,自己編寫的,能在MFC中顯示串口輸入信息,我下面的操作是在這個基礎上進行編寫的

 

2、MFC批量讀取.ini文件字符串

https://blog.csdn.net/qq_40544338/article/details/105991980

①總結:good:很好,親測有效,本次操作中使用到了

 

3、LPCWSTR或LPWSTR與string相互轉換

https://blog.csdn.net/qq_40544338/article/details/106024262

①總結:good:很好,親測有效,本次操作中使用到了

 

三、操作

1、運行效果

 

1、LPCWSTR轉換爲string:爲了讀取配置文件信息

//LPCWSTR轉換爲string
string WCharToMByte(LPCWSTR lpcwszStr)
{
	string str;
	DWORD dwMinSize = 0;
	LPSTR lpszStr = NULL;
	dwMinSize = WideCharToMultiByte(CP_OEMCP, NULL, lpcwszStr, -1, NULL, 0, NULL, FALSE);
	if (0 == dwMinSize)
	{
		return FALSE;
	}
	lpszStr = new char[dwMinSize];
	WideCharToMultiByte(CP_OEMCP, NULL, lpcwszStr, -1, lpszStr, dwMinSize, NULL, FALSE);
	str = lpszStr;
	delete[] lpszStr;
	return str;
}

 

1、讀取配置文件

①頭文件中:記得包含頭文件

#include <string>
#include <vector>
#include <string.h>

#include <algorithm>

#include "SerialPort.h"

using namespace std;

	//目的:串口輸入信息和配置文件內容相比較
public:
	void ReadConfig();//讀取配置文件
	vector<string> vec_str_target;//配置文件中串口信息

②源文件中:

初始化對話框中

	ReadConfig();

//讀取配置文件
void CMyComTestDlg:: ReadConfig()
{
	//測試:成功:讀取ini多個字符串
	//第一步:找到配置文件路徑
	TCHAR tchBuffer[MAX_PATH]; 
	LPWSTR curPath; 
	curPath = tchBuffer; 
	GetCurrentDirectory(MAX_PATH,curPath); 
	CString fileName("//config-mfc.ini"); 
	CString path(curPath); 
	path = path + "/../bin/Resource/Config"+fileName; 

	//第二步:準備批量處理讀取配置文件的串口信息
	string str_target;
	TCHAR tc0[MAX_PATH];
	for(int i=0;i<16;i++)
	{
		//char是8位字符類型,最多隻能包含256種字符,許多外文字符集所含的字符數目超過256個,char型無法表示。
		//wchar_t數據類型一般爲16位或32位,但不同的C或C++庫有不同的規定,如GNU Libc規定wchar_t爲32位,總之,wchar_t所能表示的字符數遠超char型。

		//char c_key[MAX_PATH];//失敗,不能使用char,因爲GetPrivateProfileString參數是寬字符
		//sprintf(c_key,"signal%d",i);
		wchar_t c_key[MAX_PATH];
		wsprintf(c_key,L"signal%d",i);
		GetPrivateProfileString(L"Signal",(LPCWSTR)c_key,L"",tc0,MAX_PATH,path); 
		str_target= WCharToMByte(tc0);
		//m_serialPort.vec_str_target.push_back(str_target);
		vec_str_target.push_back(str_target);
	}

	comPortReceive=GetPrivateProfileInt(L"Com",L"comPortReceive",-1,path);
	if(comPortReceive==-1)
	{
		AfxMessageBox(L"讀取配置文件:comPortReceive:失敗");
	}
	comPortSend=GetPrivateProfileInt(L"Com",L"comPortSend",-1,path);
	if(comPortSend==-1)
	{
		AfxMessageBox(L"讀取配置文件:comPortSend:失敗");
	}
	comMessageLength=GetPrivateProfileInt(L"Com",L"comMessageLength",-1,path);
	if(comMessageLength==-1)
	{
		AfxMessageBox(L"讀取配置文件:comMessageLength:失敗");
	}

	int a=0;
}

 

1、初始化串口

①頭文件中:

	void InitCom();//初始化串口

②源文件中:

a、初始化對話框裏面

	InitCom();

void CMyComTestDlg:: InitCom()
{
	if(m_SerialPort.InitPort(this,comPortReceive,19200,'N',8,1,EV_RXFLAG|EV_RXCHAR,512))
	{
		m_SerialPort.StartMonitoring();
		m_bSerialPortOpened=TRUE;
	}
	else
	{
		AfxMessageBox(L"沒有發現接收串口或被佔用!");
		m_bSerialPortOpened=FALSE;
		exit(-1);
	}

	if(m_SerialPortsend.InitPort(this,comPortSend,19200,'N',8,1,EV_RXFLAG|EV_RXCHAR,512))
	{
		m_SerialPortsend.StartMonitoring();
		m_bSerialPortOpenedsend=TRUE;
	}
	else
	{
		AfxMessageBox(L"沒有發現發送串口或被佔用!");
		m_bSerialPortOpenedsend=FALSE;
		exit(-1);
	}

}

 

1、配置文件:

[Com]
comPortReceive=3		//串口接收端口號
comPortSend=4			//串口發送端端口號
comMessageLength=7		//串口信號長度

[Signal]
//廣泛性焦慮 要設置好串口信號長度
signal0=55 AA 07 1E 01 01 01

//神經性厭食
signal1=55 AA 07 1E 02 01 02

//疑病症
signal2=55 AA 07 1E 03 01 03

//恐懼症
signal3=55 AA 07 1E 04 01 04 

//強迫症
signal4=55 AA 07 1E 05 01 05

//抑鬱發作
signal5=55 AA 07 1E 06 01 06

 

1、設置MFC發佈的exe位置+保存配置文件位置:(可以把配置和平臺都設置爲這樣,這樣發佈的所有exe都在這個bin文件夾下)

 

1、比較串口輸入的信息和配置文件信息是否相等

①頭文件:

int CompareSignal_targetAndInput(string);//比較串口輸入的信息和配置文件信息是否相等 返回值:和配置文件中串口信息哪一個相同

②源文件

 

int CMyComTestDlg:: CompareSignal_targetAndInput(string _str_input)
{
	int reselt=-1;
	//將vector中的字符串和輸入的字符串對比,輸出滿足的vector的序列號
	int i=0;
	for (vector<string>::iterator iter=vec_str_target.begin();iter!=vec_str_target.end();iter++)
	{		
		transform(vec_str_target[i].begin(),vec_str_target[i].end(), vec_str_target[i].begin(), toupper);		//全部轉換爲大寫
		if (*iter==_str_input)
		{
			reselt =i;
		}
		i++;
	}
	return reselt;
}

 

1、添加消息響應事件:模擬按鍵

BOOL CMyComTestDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加專用代碼和/或調用基類
	if (pMsg->message==WM_KEYUP)
	{
		switch(pMsg->wParam-48)
		{
		case 0:
			{
				int a=0;
				AfxMessageBox(L"按下了0");
			}
			break;
		case 1:
			{
				int a=0;
				AfxMessageBox(L"按下了1");
			}
			break;
		case 2:
			{
				int a=0;
				AfxMessageBox(L"按下了2");
			}
			break;
		}
	}

	return CDialogEx::PreTranslateMessage(pMsg);
}

 

1、補充修改OnComm函數:

//完成:MFC獲得串口輸入信息
LONG CMyComTestDlg::OnComm(WPARAM ch,LPARAM port)
{
	int length=comMessageLength;

	str += ch;
	if (str.length()>=length)
	{
		int index= str.length() - length;
		//if (str[index] == 0x55 && str[index+1] == ( char )0xaa )//不需要進行判斷
		{
			std::string pp = str.substr(index, length);
			m_SerialPortsend.WriteToPort((char *)pp.c_str(),length);
			char * tempstr = const_cast<char*>(pp.c_str());
			std::string showstr;
			for (unsigned int i = 0; i<length;i++)
			{
				char  buf[10] = {0};
				unsigned char tempchar = tempstr[i];
				sprintf_s(buf, 10,"%02x ",tempchar);
				showstr += buf;
				//	showstr += " ";
			}

			//因爲發現串口輸入的信息和配置文件信息相比最後多了一個空格
			showstr.erase(showstr.length()-1,1);			

			transform(showstr.begin(),showstr.end(), showstr.begin(), toupper);		//全部轉換爲大寫			

			//模擬按鍵+比較串口輸入的信息和配置文件信息是否相等
			//串口信息
			int n_tmp=	CompareSignal_targetAndInput(showstr);
			switch(n_tmp)
			{
			case 0:
				::PostMessage(m_hWnd,WM_KEYUP,48+0,NULL);			
				break;
			case 1:
				::PostMessage(m_hWnd,WM_KEYUP,48+1,NULL);		
				break;
			case 2:
				::PostMessage(m_hWnd,WM_KEYUP,48+2,NULL);		
				break;
			}

			SetDlgItemText(IDC_EDIT1, (CString)showstr.c_str());

			str.clear();
		}
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章