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

📄 serielldlg.cpp

📁 简单的 RS232 串口通信测试程序,可以做到资料的传送与接收
💻 CPP
字号:
// seriellDlg.cpp : Implementierungsdatei
//

#include "stdafx.h"
#include "seriell.h"
#include "seriellDlg.h"
#include "RS232.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSeriellDlg Dialogfeld

CSeriellDlg::CSeriellDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSeriellDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSeriellDlg)
		// HINWEIS: Der Klassenassistent f黦t hier Member-Initialisierung ein
	//}}AFX_DATA_INIT
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

CSeriellDlg::~CSeriellDlg()
{
	delete m_rs232;
}

void CSeriellDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSeriellDlg)
		DDX_Control(pDX, IDC_LIST, m_list);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSeriellDlg, CDialog)
	//{{AFX_MSG_MAP(CSeriellDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_OPEN,		OnOpen)
	ON_BN_CLICKED(IDC_CLOSE,	OnClose)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_ENABLE,	OnEnableorDisable)
	ON_NOTIFY(UDN_DELTAPOS, IDC_TIME, OnDeltaposTime)
	ON_BN_CLICKED(IDC_SENDBTN,	OnSendbtn)
	ON_BN_CLICKED(IDC_FILE,		OnFile)
	ON_BN_CLICKED(IDC_DISABLE,	OnEnableorDisable)
	ON_MESSAGE(WM_DROPFILES,	OnDropFile)
	ON_BN_CLICKED(IDC_SAVE, OnSave)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSeriellDlg Nachrichten-Handler
//Ereignisse aus RS232.h
void CSeriellDlg::TriggerOnSignal(DWORD Signal)
{
	if (Signal&EV_BREAK)
		{SetText(ERROR_SUCCESS,"a BREAK received");};
	if (Signal&EV_CTS)
		{SetText(ERROR_SUCCESS,"CTS changed state");};
	if (Signal&EV_DSR)
		{SetText(ERROR_SUCCESS,"DSR changed state");};
	if (Signal&EV_RING)
		{SetText(ERROR_SUCCESS,"Ring signal detected");};
	if (Signal&EV_RLSD)
		{SetText(ERROR_SUCCESS,"RLSD changed state");};
	if (Signal&EV_TXEMPTY)
		{SetText(ERROR_SUCCESS,"Transmitt Queue Empty");};
    if (Signal&EV_RXCHAR)
		{/*NOP*/ };
	if (Signal&EV_RXFLAG)
		{/*NOP*/ };
	m_rs232->GetModemState(m_rs232->m_Handles.hHandle);
}

void _stdcall OnSignal(
						HANDLE	hHandle,
						DWORD	dwErrorCode,	//Fehlercode sollte immer "0" sein
						DWORD	InQueCount,
						DWORD	Event
)
{
	CSeriellDlg* dlg = (CSeriellDlg*)AfxGetMainWnd();
	if (dlg)
	{
		switch(dwErrorCode)
		{
		case 0:;
			break;
		default:
			{
				char* Msg = new char[MAX_PATH];
				memset(Msg,0x00,MAX_PATH);
				sprintf(Msg,"Fehler auf Schnittstellen %s [Code = %d; Handle = %d; Buffer = %d]",
						dlg->m_rs232->m_Handles.name,dwErrorCode,hHandle,InQueCount);
				dlg->SetText(1,Msg);
				delete Msg;
			};
		};
	};
	dlg->TriggerOnSignal(Event);
}

void _stdcall OnError(
						HANDLE	hHandle,
						DWORD	dwErrorCode,	//Fehlercode sollte immer "0" sein
						char*	ErrorMessage
					)
{
	char Msg[MAX_PATH] = {0};
	char Err[MAX_PATH] = {0};
	strcpy(Msg,ErrorMessage);
	sprintf(Msg,"%s [Handle = %d] ",Msg,hHandle);
	
	
	CSeriellDlg* dlg = (CSeriellDlg*)AfxGetMainWnd();
	if (dlg)
	{
		switch(dwErrorCode)
		{
		case 0: dlg->SetText(ERROR_SUCCESS,ErrorMessage);
			break;
		default:
			{
				dlg->m_rs232->ReturnLastErrorMsg(dwErrorCode,Err);
				strcat(Msg,Err);
				dlg->SetText(1,Msg);
			};
		};
	}
	else MessageBox(0,ErrorMessage,NULL,MB_OK);
}

BOOL CSeriellDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	char*	Namen	= new char [MAX_PATH];
	char*	out		= new char [MAX_PATH];
	BOOL	IsName	= false;
	
	memset(Namen,0x00,MAX_PATH);
	memset(out,0x00,MAX_PATH);

	LoadString(0,IDS_RIGHTS,out,MAX_PATH);
	SetText(ERROR_SUCCESS,out);
	LoadString(0,IDS_VERSION,out,MAX_PATH);
	SetText(ERROR_SUCCESS,out);
	
	LoadString(0,IDS_COMMENT,out,MAX_PATH);
	SetText(ERROR_SUCCESS,out);
	
	memset(out,0x00,MAX_PATH);
	
	CComboBox*	cb			= (CComboBox*)GetDlgItem(IDC_NAMEN);
	m_rs232 = new C_RS232(&m_DeviceCount, Namen,OnSignal, OnError);
	//Anzeigen welche Schnittstellen verf黦bar sind
	SetText(ERROR_SUCCESS,Namen);
	for (WORD i = 1; i < strlen(Namen); i++)
	{	
		if ((/*"["*/0x5b == Namen[i-1])
			||(IsName))
		{
			strncat(out,&Namen[i],1);
			IsName = (/*"]"*/0x5d != Namen[i+1]);
			if (!IsName)
			{
				cb->AddString(out);
				memset(out,0x00,sizeof(out));
			};
		};
	};
	
	//Angabe der Einstellungen, die zur Auswahl stehen
	cb = (CComboBox*)GetDlgItem(IDC_BAUD);
	for (i = 1; i <= 128; i *= 2)
	{
		sprintf(out,"%d",i*300);
		cb->AddString(out);
	};
	
	cb = (CComboBox*)GetDlgItem(IDC_DATA);
	for (i = 4; i <= 8; i++)
	{
		sprintf(out,"%d",i);
		cb->AddString(out);
	};

	cb = (CComboBox*)GetDlgItem(IDC_STPB);
	for (i = 10; i <= 20; i += 5)
	{
		sprintf(out,"%.1f",(float)i/10);
		cb->AddString(out);
	};
	
	cb = (CComboBox*)GetDlgItem(IDC_PARITY);
	for (i = 0; i < 5; i++)
		cb->AddString(tagPARITYSTR[i]);
	
	
	SetIcon(m_hIcon, TRUE);			
	SetIcon(m_hIcon, FALSE);		
	EnableWindow();
	
	m_img.Create(IDB_IMG,16,1,RGB(255,0,255));
	m_list.InsertColumn(0,"Meldungen",LVCFMT_LEFT,800);
	m_list.SetImageList(&m_img, LVSIL_SMALL);
	delete out;
	delete Namen;
	return TRUE;  
}


void CSeriellDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // Ger鋞ekontext f黵 Zeichnen

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Symbol in Client-Rechteck zentrieren
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Symbol zeichnen
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

HCURSOR CSeriellDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CSeriellDlg::SetText(int Index, char* Text)
{
	int nCnt	= m_list.GetItemCount();
	int i		= m_list.InsertItem(nCnt,Text,Index);
	m_list.EnsureVisible(i,FALSE);
	m_list.SetHotItem(nCnt);
	return;
}

void CSeriellDlg::OnOpen() 
{

	CString str;
	GetDlgItem(IDC_NAMEN)->GetWindowText(str);

	char device[MAX_PATH] = {0};
	strcpy(device,(const char*)str);

	BYTE settings[4];
	for (int i = IDC_BAUD; i <= IDC_PARITY; i++)
	{
		CComboBox* cb		= (CComboBox*)GetDlgItem(i);
		settings[i-IDC_BAUD]= (BYTE)cb->GetCurSel();
	};
	//TODO
	m_rs232->m_dcb.XoffLim	= MAX_BUFFERSIZE;
	m_rs232->m_dcb.XonLim	= MAX_BUFFERSIZE;

	m_rs232->m_SignalEvents	= true;
	CSpinButtonCtrl* spin = (CSpinButtonCtrl*)GetDlgItem(IDC_TIME);
	if (m_rs232->UpdateDataControlBlock(
										m_rs232->CreateHandle(device, false,(spin->GetPos())*1000),
										settings[0],
										settings[1],
										settings[2],
										settings[3]
										))
	{
		sprintf(device,"%s ge鰂fnet",m_rs232->m_Handles.name);
		SetText(ERROR_SUCCESS,device);
		int Index = (int)m_rs232->m_Handles.hHandle;
		SetTimer(Index,m_rs232->m_Timeout/10,NULL);
		CProgressCtrl*	prog = (CProgressCtrl*)GetDlgItem(IDC_PROG1);
		prog->SetStep(1);
	};
	EnableWindow();
}

void CSeriellDlg::OnClose() 
{
	if (m_rs232->DestroyHandle(&m_rs232->m_Handles.hHandle))
	{
		CProgressCtrl*	prog	= (CProgressCtrl*)GetDlgItem(IDC_PROG1);
		int Index				= (int)m_rs232->m_Handles.hHandle;
		char* Msg				= new char[MAX_PATH];
		memset(&Msg[0],0x00,MAX_PATH);
		
		KillTimer(Index);
		prog->SetPos(0);
		EnableWindow();
		sprintf(Msg,"%s geschlossen",m_rs232->m_Handles.name);
		SetText(ERROR_SUCCESS,Msg);
		return;
	};
	SetText(ERROR_INVALID_FUNCTION,"Schnittstelle konnte nicht geschlossen werden.");
}

void CSeriellDlg::OnTimer(UINT nIDEvent) 
{
	if (nIDEvent == (UINT)m_rs232->m_Handles.hHandle)
	{
		CProgressCtrl*	prog = (CProgressCtrl*)GetDlgItem(IDC_PROG1);
		prog->StepIt();
	};
		
	CDialog::OnTimer(nIDEvent);
}

void CSeriellDlg::OnEnableorDisable() 
{
	UINT Index = (UINT)m_rs232->m_Handles.hHandle;
	switch(m_rs232->m_SignalEvents)
	{
	case true: 
		{
			m_rs232->DisableOnSignal();
			KillTimer(Index);
			break;
		};
	case false: 
		{
			m_rs232->EnableOnSignal();
			SetTimer(Index,m_rs232->m_Timeout/10,NULL);
			break;
		};
	};
	EnableWindow();
}

void CSeriellDlg::OnDeltaposTime(NMHDR* pNMHDR, LRESULT* pResult) 
{
	CSpinButtonCtrl* spin = (CSpinButtonCtrl*)GetDlgItem(IDC_TIME);
	m_rs232->m_Timeout = (1000*(spin->GetPos()));	
	*pResult = 0;
}


void CSeriellDlg::EnableWindow()
{
	BOOL en = (	(0 != m_rs232->m_Handles.hHandle)
			&&	(INVALID_HANDLE_VALUE != m_rs232->m_Handles.hHandle));
	
	GetDlgItem(IDC_OPEN)->EnableWindow(!en);
	GetDlgItem(IDC_CLOSE)->EnableWindow(en);
	
	en = m_rs232->m_SignalEvents;
		
	GetDlgItem(IDC_ENABLE)->EnableWindow(!en);
	GetDlgItem(IDC_DISABLE)->EnableWindow(en);
}

void CSeriellDlg::OnSendbtn() 
{
	CString text;
	GetDlgItem(IDC_SEND)->GetWindowText(text);
	DWORD Size = text.GetLength();
	if (0 >= Size)
	{
		SetText(ERROR_SUCCESS,"no value to send");
		return;
	};
	char* buffer = new char[Size];
	memcpy(&buffer[0],text,Size);
	if (!m_rs232->ComWrite(&buffer[0],Size))
		SetText(ERROR_INVALID_FUNCTION,"value was not written");
	delete buffer;
}

void CSeriellDlg::OnFile() 
{
	CString Filter;
	CString Default;
	Filter.LoadString(IDS_FILTER);
	Default.LoadString(IDS_DEFAULT);
	CFileDialog* fdlg = new	CFileDialog(true, Default, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, Filter, AfxGetMainWnd());
	if (IDOK == fdlg->DoModal())
		OpenSettingFile(fdlg->GetPathName());
	delete fdlg;

}


void CSeriellDlg::OnSave() 
{
	CString Filter;
	CString Default;
	Filter.LoadString(IDS_FILTER);
	Default.LoadString(IDS_DEFAULT);
	CFileDialog* fdlg = new	CFileDialog(false, Default, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, Filter, AfxGetMainWnd());
	if (IDOK == fdlg->DoModal())
		SaveSettingFile(fdlg->GetPathName());
	delete fdlg;
}

void CSeriellDlg::OpenSettingFile(CString filename)
{
	FILE*	file;
	char	Text[MAX_PATH];
	if (NULL != (file = fopen((const char*)filename,"r+t")))
	{
		for (int i = IDC_NAMEN; i <= IDC_PARITY; i++)
		{
			if (fscanf(file,"%s",Text))
			{
				CComboBox*	cb = (CComboBox*)GetDlgItem(i);
				int Index = cb->FindStringExact(0, Text);
				if (CB_ERR != Index)
					cb->SetCurSel(Index);
				else
				{
					sprintf(Text,"falsche Einstellung in Zeile %d",(i-IDC_NAMEN)+1);
					SetText(1,Text);
				};
			};
		};
		if (fscanf(file,"%s",Text))
		{
			int Pos = atoi(Text);
			CSpinButtonCtrl* spin = (CSpinButtonCtrl*)GetDlgItem(IDC_TIME);
			spin->SetPos(Pos);
		}
		filename += " wurde geladen.";
		char msg[MAX_PATH];
		strcpy(&msg[0],(const char*)filename);
		SetText(0,msg);
		fclose(file);
	};

}

void CSeriellDlg::SaveSettingFile(CString filename)
{
	FILE*	file;
	CString	Text;
	if (NULL != (file = fopen((const char*)filename,"w+t")))
	{
		for (int i = IDC_NAMEN; i <= IDC_PARITY; i++)
		{
			GetDlgItem(i)->GetWindowText(Text);
			fwrite(Text,sizeof(char),Text.GetLength(),file);
			fwrite("\r\n",sizeof(char),2,file);
		};
		CSpinButtonCtrl* spin = (CSpinButtonCtrl*)GetDlgItem(IDC_TIME);
		int Pos = spin->GetPos();
		char msg[MAX_PATH];
		sprintf(msg,"%d\r\n",Pos);
		fwrite(msg,sizeof(char),strlen(msg),file);
		
		filename += " wurde geschrieben.";
		strcpy(&msg[0],(const char*)filename);
		SetText(0,msg);
		fclose(file);
	};

}

LRESULT CSeriellDlg::OnDropFile(HDROP hDropInfo)
{
	//Eine oder mehrere Dateien sind aus einenm Explorer
	//in dieses Fenster gezogen worden
	TCHAR szFileName[_MAX_PATH];
	TCHAR szFileOut[2*_MAX_PATH];
	
	UINT nFileCount = ::DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
	ASSERT(nFileCount != 0);
	
	for (UINT i = 0; i < nFileCount; i++)
	{
		::DragQueryFile(hDropInfo, i, szFileName, _MAX_PATH);
		sprintf(szFileOut,"%s wurde gew鋒lt.",szFileName);
		SetText(0,szFileName);
	};
	::DragQueryFile(hDropInfo, 0, szFileName, _MAX_PATH);
	OpenSettingFile(szFileName);
	::DragFinish(hDropInfo);
	return 0;
}

⌨️ 快捷键说明

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