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