MFC使用SerialPort类发送十六进制

这里使用的是SerialPort 4.3版本的,其他的流程详见这位大佬

CSerialPort教程4.3.x (2) - CSerialPort源码简介 - 知乎 (zhihu.com)

如果想要以十六进制发送数据,转换代码如下:

std::vector<unsigned char> MyclassDlg::HexStringToBytes(const CString& hexString)
{
	std::vector<unsigned char> bytes;
	CString temp = hexString;
	temp.Remove(' '); // 移除空格

	// 检查字符串长度,必须是偶数
	if (temp.GetLength() % 2 != 0)
	{
		AfxMessageBox(_T("十六进制字符串的长度必须为偶数"));
		return bytes;
	}

	for (int i = 0; i < temp.GetLength(); i += 2)
	{
		unsigned int byte;
		CString byteString = temp.Mid(i, 2);
		if (_stscanf_s(byteString, _T("%02x"), &byte) == 1)
		{
			bytes.push_back(static_cast<unsigned char>(byte));
		}
		else
		{
			AfxMessageBox(_T("无效的十六进制字符"));
			return std::vector<unsigned char>(); // 返回空数组表示出错
		}
	}

	return bytes;
}

发送代码如下:

void MyClassDlg::OnBnClickedButtonSend()
{
	// TODO: 在此添加控件通知处理程序代码
	GetDlgItem(IDC_SendEdit)->SetFocus();
	if (!m_SerialPort.isOpen()) ///没有打开串口
	{
		AfxMessageBox(_T("请首先打开串口"));
		return;
	}

	CString temp;
	m_Send.GetWindowText(temp);

	if (BST_CHECKED == ((CButton*)GetDlgItem(IDC_CHECK_HEXSEND))->GetCheck())
	{
		// 转换十六进制字符串到字节数组
		std::vector<unsigned char> data = HexStringToBytes(temp);

		if (!data.empty())
		{
			m_SerialPort.writeData(data.data(), data.size());
			tx += data.size();

			CString str2;
			str2.Format(_T("%d"), tx);
			m_sendCountCtrl.SetWindowText(str2);
		}
		else
		{
			AfxMessageBox(_T("请输入有效的十六进制字符串"));
		}

	}
	else {

			int len = 0;
			char* m_str = NULL;
		#ifdef UNICODE
			// 兼容中文
			CStringA strA(temp);
			len = strA.GetLength();
			m_str = strA.GetBuffer();
		#else
			len = temp.GetLength();
			m_str = temp.GetBuffer(0);
		#endif

			m_SerialPort.writeData(m_str, len);

			tx += len;

			CString str2;
			str2.Format(_T("%d"), tx);
			m_sendCountCtrl.SetWindowText(str2);
	}
	
}

代码解释

  1. HexStringToBytes 函数:这是一个辅助函数,将十六进制字符串转换为字节数组。它首先移除字符串中的空格,然后检查长度是否为偶数,最后将每两个字符转换为一个字节。

  2. 错误检查:如果输入不是有效的十六进制字符串,该函数会返回一个空的字节数组并弹出错误消息。

  3. 发送逻辑更新:在按钮点击事件中,调用 HexStringToBytes 函数将输入字符串转换为字节数组,再通过 writeData 方法发送。

注意事项

  • 输入格式:确保用户输入的是有效的十六进制字符串,每个字节由两个字符表示。例如,"A1 B2 C3" 或 "A1B2C3"。
  • 错误处理:在转换过程中增加了错误处理,确保无效输入不会导致程序崩溃。
  • 字节数组发送:修改后的代码将字节数组直接传递给 writeData 函数。
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Classes)是一种用于Windows操作系统的库,能够简化Windows应用程序的开发。在MFC中,串口通信是通过SerialPort来实现的。 SerialPort封装了与串口设备进行通信的功能,包括打开和关闭串口、发送和接收数据等操作。通过SerialPort,开发者可以方便地进行串口通信的编程。 首先,我们需要创建一个SerialPort对象,并指定要操作的串口编号或串口名称。然后,可以通过Open方法打开串口,设定波特率、数据位、停止位和校验位等串口参数。接下来,就可以使用Write方法发送数据到串口,或使用Read方法从串口接收数据。 在进行串口通信时,我们可以使用事件驱动的方式,以确保及时响应串口收发数据。SerialPort提供了异步读取数据的功能,即当串口有数据到达时会触发一个数据接收事件,我们可以在事件处理函数中处理接收到的数据。 另外,为了避免界面冻结或阻塞现象,我们可以将串口通信的操作放在独立的线程中执行。通过在新线程中创建SerialPort对象,并在该线程中监听串口事件和处理数据,可以保证串口通信的稳定性。 总而言之,MFCSerialPort提供了方便、高效的串口通信功能,开发者可以利用该轻松地实现与串口设备的数据交互。无论是控制硬件设备、采集传感器数据还是与外部设备通信,都可以通过SerialPort来完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值