目錄
1、項目需要獲得某個串口值之後,執行相對應的操作,所以需要比較串口輸入的信息和配置文件信息是否相等
1、設置MFC發佈的exe位置+保存配置文件位置:(可以把配置和平臺都設置爲這樣,這樣發佈的所有exe都在這個bin文件夾下)
一、目的:
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;
}