VS2017串口收发MFC程序,十六进制和字符发送,字符串显示与hex显示(二)-代码(附链接)

运行界面:

VS2017串口收发MFC程序,十六进制和字符发送,字符串显示与hex显示(二)-代码(附链接)_第1张图片
VS2017串口收发MFC程序,十六进制和字符发送,字符串显示与hex显示(二)-代码(附链接)_第2张图片
VS2017串口收发MFC程序,十六进制和字符发送,字符串显示与hex显示(二)-代码(附链接)_第3张图片
VS2017串口收发MFC程序,十六进制和字符发送,字符串显示与hex显示(二)-代码(附链接)_第4张图片

步骤

这里是双击控件后生成的所有函数,以及我们为Active控件添加的事件处理函数,定时函数等
VS2017串口收发MFC程序,十六进制和字符发送,字符串显示与hex显示(二)-代码(附链接)_第5张图片
在这里也可以看到我们创建的变量
VS2017串口收发MFC程序,十六进制和字符发送,字符串显示与hex显示(二)-代码(附链接)_第6张图片
首先是串口

void CMFCcktestDlg::OnCommMscomm3()
{
	// TODO: 在此处添加消息处理程序代码
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	long len, k;
	byte rxdata[2048]; //设置BYTE 数组
	CString strtemp, buffer;

	if (m_mscomm.get_CommEvent() == 2) //值为2表示接收缓冲区内有字符
	{
		if (BST_UNCHECKED == ((CButton*)GetDlgItem(IDC_CHECK16RECEIVE))->GetCheck())
		{
			//以下是正常显示效果处理代码,十六进制显示 
			variant_inp = m_mscomm.get_Input(); //读缓冲区  
			safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
			len = safearray_inp.GetOneDimSize(); //得到有效数据长度        
			for (k = 0; k < len; k++)
				safearray_inp.GetElement(&k, rxdata + k);//转换为BYTE型数组         
			for (k = 0; k < len; k++)                    //将数组转换为Cstring型变量    
			{
				BYTE bt = *(char*)(rxdata + k);//字符型      
				strtemp.Format(_T("%c"), bt); //将字符送入临时变量strtemp存放   
				if (strtemp == '\n' || strtemp == '\r')
				{
					strtemp = "\r\n";
				}
				//此处编译有错误,可在项目属性->配置属性->常规里将“字符集”改为使用多字节字符集即可
				m_EditReceive += strtemp; //加入接收编辑框对应字符串      
			}

			//UpdateData(FALSE); //更新编辑框内容
			SetDlgItemText(IDC_EDIT2, m_EditReceive);
			/*IDC_RECEIVE_EDIT1->ReplaceSel(m_strRXDATA, FALSE);*/
			//m_mscomm.LineScroll(m_mscomm.GetLineCount());//clw注释
		}
		else//字符串显示
		{
			variant_inp = m_mscomm.get_Input(); //读缓冲区  
			safearray_inp = variant_inp; //VARIA NT型变量转换为ColeSafeArray型变量
			len = safearray_inp.GetOneDimSize(); //得到有效数据长度        
			for (k = 0; k < len; k++)
			{
				safearray_inp.GetElement(&k, rxdata + k);//转换为BYTE型数组 
		/*		strtemp.Format(_T("%02X"), *(rxdata + k));
				buffer += strtemp;*/
			}
			//buffer.TrimLeft();
			//buffer.TrimRight();
			//CByteArray receivedata;
			//int receivedatalen;
			//receivedatalen = Str2Hex(buffer, receivedata);
			for (k = 0; k < len; k++)
			{
				switch (rxdata[k] / 16)
				{
				case 0:  m_EditReceive += '0'; break;
				case 1:  m_EditReceive += '1'; break;
				case 2:  m_EditReceive += '2'; break;
				case 3:  m_EditReceive += '3'; break;
				case 4:  m_EditReceive += '4'; break;
				case 5:  m_EditReceive += '5'; break;
				case 6:  m_EditReceive += '6'; break;
				case 7:  m_EditReceive += '7'; break;
				case 8:  m_EditReceive += '8'; break;
				case 9:  m_EditReceive += '9'; break;
				case 10:  m_EditReceive += 'A'; break;
				case 11:  m_EditReceive += 'B'; break;
				case 12:  m_EditReceive += 'C'; break;
				case 13:  m_EditReceive += 'D'; break;
				case 14:  m_EditReceive += 'E'; break;
				case 15:  m_EditReceive += 'F'; break;

				}
				switch (rxdata[k] % 16)
				{
				case 0:  m_EditReceive += '0'; break;
				case 1:  m_EditReceive += '1'; break;
				case 2:  m_EditReceive += '2'; break;
				case 3:  m_EditReceive += '3'; break;
				case 4:  m_EditReceive += '4'; break;
				case 5:  m_EditReceive += '5'; break;
				case 6:  m_EditReceive += '6'; break;
				case 7:  m_EditReceive += '7'; break;
				case 8:  m_EditReceive += '8'; break;
				case 9:  m_EditReceive += '9'; break;
				case 10:  m_EditReceive += 'A'; break;
				case 11:  m_EditReceive += 'B'; break;
				case 12:  m_EditReceive += 'C'; break;
				case 13:  m_EditReceive += 'D'; break;
				case 14:  m_EditReceive += 'E'; break;
				case 15:  m_EditReceive += 'F'; break;
				}
				m_EditReceive += ' ';
			}

			UpdateData(FALSE); //更新编辑框内容
			//m_mscomm.LineScroll(m_recvshw.GetLineCount());//clw注释
		}
	}
}

然后是字符发送按钮

//字符发送
void CMFCcktestDlg::OnBnClickedButtonSend()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true); //读取编辑框内容
	m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据
	//m_EditSend.Empty(); //发送后清空输入框
	//SetDlgItemText(IDC_EDIT2,m_EditSend);//更新发送编辑框内容 //更新编辑框内容

}

然后是清发送缓冲区按钮

void CMFCcktestDlg::OnBnClickedButtonCsend()
{
	// TODO: 在此添加控件通知处理程序代码
	m_EditSend.Empty(); //发送后清空输入框
	SetDlgItemText(IDC_EDIT1, m_EditSend);//更新发送编辑框内容
}

然后添加两个函数分别是十六进制转字符和字符串转十六进制的

char HexChar(char c)
{

	if ((c >= '0') && (c <= '9'))
		return c - '0';//16进制中的,字符0-9转化成10进制,还是0-9
	else if ((c >= 'A') && (c <= 'F'))
		return c - 'A' + 10;//16进制中的A-F,分别对应着11-16
	else if ((c >= 'a') && (c <= 'f'))
		return c - 'a' + 10;//16进制中的a-f,分别对应也是11-16,不区分大小写
	else
		return 0x20; // 其他返回0x10
}

void StringtoHex(BYTE *GB, int glen, BYTE* SB, int* slen)
{
	int i; //遍历输入的字符串
	int a = 0;
	char temp; //接收字符,用来判断是否为空格,若是则跳过
	char temp1, temp2; //接收一个字节的两个字符 例如EB,则temp1='E',temp2 = 'B'
	*slen = 0; //输出的16进制字符串长度
	for (i = 0; i < glen; i++)
	{
		temp = GB[i];
		if (temp == ' ')
			continue;

		if (a == 0)
			temp1 = GB[i];
		if (a == 1)
			temp2 = GB[i];
		a++;

		if (a == 2)
		{
			a = 0;
			temp1 = HexChar(temp1);
			//temp1 = temp1 - '0';
			//if (temp1>10)
		   // temp1 = temp1 -7;
			temp2 = HexChar(temp2);
			//temp2 = temp2 - '0';
			//if (temp2>10)
			//temp2 = temp2 -7;

			SB[*slen] = temp1 * 16 + temp2;
			(*slen)++;
		}
	}

}

然后添加16进制发送按钮的代码

void CMFCcktestDlg::OnBnClickedButtonSixteen()
{
	// TODO: 在此添加控件通知处理程序代码
	CByteArray HexDataBuf;
	int i = 0;
	BYTE SendBuf[128] = { 0 };
	BYTE GetData[256] = { 0 };
	int SendLen = 0;
	int GetLen = 0;

	UpdateData(TRUE);//获取编辑框内容
	if (m_EditSend.IsEmpty())
	{
		AfxMessageBox(_T("发送数据为空!"));
		return;
	}
	HexDataBuf.RemoveAll();    //清空数组 

	GetLen = m_EditSend.GetLength();
	for (i = 0; i < GetLen; i++)
	{
		GetData[i] = (BYTE)m_EditSend.GetBuffer()[i];
	}
	StringtoHex(GetData, GetLen, SendBuf, &SendLen);//将字符串转化为字节数据

	HexDataBuf.SetSize(SendLen);   //设置数组大小为帧长度 
	for (i = 0; i < SendLen; i++)
	{
		HexDataBuf.SetAt(i, SendBuf[i]);
	}
	m_mscomm.put_Output(COleVariant(HexDataBuf)); //发送十六进制数据

	UpdateData(false); //更新编辑框内容
}

然后添加打开串口按钮的程序,可以选择串口,波特率

void CMFCcktestDlg::OnBnClickedButtonOpen()
{
	// TODO: 在此添加控件通知处理程序代码
	if (m_mscomm.get_PortOpen()) //如果串口是打开的,则行关闭串口
	{
		m_mscomm.put_PortOpen(FALSE);
	}
	m_mscomm.put_CommPort(5); //选择COM1
	m_mscomm.put_InBufferSize(1024); //接收缓冲区
	m_mscomm.put_OutBufferSize(1024);//发送缓冲区
	m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
	m_mscomm.put_InputMode(1);//以二进制方式读写数据
	m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接
	//收数据的OnComm事件
	m_mscomm.put_Settings(_T("9600,n,8,1"));//波特率9600无检验位,8个数据位,
	//1个停止位
	if (!m_mscomm.get_PortOpen())//如果串口没有打开则打开
	{
		m_mscomm.put_PortOpen(TRUE);//打开串口
		AfxMessageBox(_T("串口5打开成功"));
	}
	else
	{
		m_mscomm.put_OutBufferCount(0);
		AfxMessageBox(_T("串口5打开失败"));
	}
}

关闭串口按钮

void CMFCcktestDlg::OnBnClickedButtonClose()
{
	// TODO: 在此添加控件通知处理程序代码
	m_mscomm.put_PortOpen(FALSE);//关闭串口
	AfxMessageBox(_T("串口5已关闭"));
}

清接收缓冲区

void CMFCcktestDlg::OnBnClickedButtonClear()
{
	// TODO: 在此添加控件通知处理程序代码
	m_EditReceive = _T("");
	SetDlgItemText(IDC_EDIT2, m_EditReceive);
}

为添加的定时器添加程序

void CMFCcktestDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CDialogEx::OnTimer(nIDEvent);

	CByteArray HexDataBuf;
	int i = 0;
	BYTE SendBuf[128] = { 0 };
	BYTE GetData[256] = { 0 };
	int SendLen = 0;
	int GetLen = 0;

	UpdateData(TRUE);//获取编辑框内容
	if (m_EditSend.IsEmpty())
	{
		AfxMessageBox(_T("发送数据为空!"));
		return;
	}
	HexDataBuf.RemoveAll();    //清空数组 

	GetLen = m_EditSend.GetLength();
	for (i = 0; i < GetLen; i++)
	{
		GetData[i] = (BYTE)m_EditSend.GetBuffer()[i];
	}
	StringtoHex(GetData, GetLen, SendBuf, &SendLen);//将字符串转化为字节数据

	HexDataBuf.SetSize(SendLen);   //设置数组大小为帧长度 
	for (i = 0; i < SendLen; i++)
	{
		HexDataBuf.SetAt(i, SendBuf[i]);
	}
	m_mscomm.put_Output(COleVariant(HexDataBuf)); //发送十六进制数据

	UpdateData(false); //更新编辑框内容
}

自动发送和停止发送按钮

void CMFCcktestDlg::OnBnClickedButtonStart()
{
	// TODO: 在此添加控件通知处理程序代码
	SetTimer(1, 2000, NULL);//启动定时器1,定时时间是1秒
}


void CMFCcktestDlg::OnBnClickedButtonStop()
{
	// TODO: 在此添加控件通知处理程序代码
	KillTimer(1);//关闭定时器1。
}

你可能感兴趣的:(MFC,c++)