简易串口助手通信(齐全) 可实现ASII和十六进制发送指令 并显示

1 打开MFC端口COM3 与调试助手COM5 点击连接数据库。

在这里插入图片描述

2 连接成功

在这里插入图片描述

3给仪器发送16进制指令 01 02 01 01 00 56 58 03 FF 仪器进行自检

在这里插入图片描述

4仪器运行返回16进制并同步到指定数据库

在这里插入图片描述

5数据上传成功

在这里插入图片描述

注:以下是串口通信部分代码

BOOL CSerialTestDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
m_comboCom.AddString(_T("COM1")); // 为组合框控件的列表框添加列表项

m_comboCom.AddString(_T("COM2")); 

m_comboCom.AddString(_T("COM3")); 

m_comboCom.AddString(_T("COM4")); 

m_comboCom.AddString(_T("COM5")); 

m_comboCom.AddString(_T("COM6")); 

m_comboCom.AddString(_T("COM7")); 

m_comboCom.AddString(_T("COM8")); 

m_comboCom.AddString(_T("COM9")); 

m_comboCom.AddString(_T("COM10")); 

CC1.AddString(_T("600")); 

CC1.AddString(_T("1200")); 

CC1.AddString(_T("2400")); 

CC1.AddString(_T("4800")); 

CC1.AddString(_T("9600")); 

CC1.AddString(_T("19200")); 

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CSerialTestDlg::OnCbnSelchangeComboCom()
	{
	// TODO: 在此添加控件通知处理程序代码
	int nSel;

	CString str;
	CC1.GetWindowTextW(str);




nSel = m_comboCom.GetCurSel();//获取组合框控件的列表框中选中项的索引

m_ctrlComm.put_CommPort(nSel+1);//选择串口号(这里因为列表框的索引号是从0开始,所以(nSel+1)对应的才是我们所选的串口号)

m_ctrlComm.put_PortOpen(TRUE);//打开串口

m_ctrlComm.put_RThreshold(2);//收到两个字节引发OnComm事件 

m_ctrlComm.put_InputMode(1);//输入模式选为二进制 

m_ctrlComm.put_Settings(str+",n,8,1");

m_ctrlComm.put_InputMode(1); // 以二进制方式检取数据 

m_ctrlComm.put_RThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 

m_ctrlComm.put_InputLen(0); //设置当前接收区数据长度为0 

m_ctrlComm.get_Input();//先预读缓冲区以清除残留数据 



m_setOk = true; //标记串口设置OK

	}
void CSerialTestDlg::OnComm()
	{
	// TODO: 在此处添加消息处理程序代码
	VARIANT variant_inp; //Variant 是一种特殊的数据类型,除了定长String数据及用户定义类型外,可以包含任何种类的数据。

COleSafeArray safearray_inp; 

LONG len,k; 

BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integer that is not signed. 

CString strtemp; 

if(m_ctrlComm.get_CommEvent() == 2) //事件值为2表示接收缓冲区内有字符 

{ 

以下你可以根据自己的通信协议加入处理代码 

variant_inp=m_ctrlComm.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存放 
strtemp.Format(_T("%02X"),bt);

m_strRXData+=strtemp+_T(" "); //加入接收编辑框对应字符串 

}

} 

UpdateData(FALSE); //更新编辑框内容 
UpdateData(TRUE);
/*MessageBox(m_strRXData);*/
CString Sql;
Sql .Format(_T("insert into [test].[dbo].[test] values('%s')"),m_strRXData);
//OnInitDialog();
if (!ExcuteCmd(Sql))
	AfxMessageBox(_T("添加失败!"));
else
	AfxMessageBox(_T("添加成功!"));

	}
完整源代码:https://download.csdn.net/download/qq_42740377/12728746
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值