您的位置:首页 > 编程语言

MFC 串口编程

2015-06-11 17:09 323 查看
 vc版串口调试助手(不断完善中) 2011-12-17
19:03:14

分类: C/C++

开发环境:vs 2005
代码如下:
// test1Dlg.cpp : 实现文件
#include "stdafx.h"

#include "test1.h"

#include "test1Dlg.h"

//#include  

#ifdef _DEBUG

#define new DEBUG_NEW

#endif
//CEdit test1=(CEdit *)GetDlgItem(IDC_)
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog

{

public:

 CAboutDlg();
// 对话框数据

 enum { IDD = IDD_ABOUTBOX };
 protected:

 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
// 实现

protected:

 DECLARE_MESSAGE_MAP()

};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

 CDialog::DoDataExchange(pDX);

}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

END_MESSAGE_MAP()

// Ctest1Dlg 对话框
 

Ctest1Dlg::Ctest1Dlg(CWnd* pParent /*=NULL*/)

 : CDialog(Ctest1Dlg::IDD, pParent)

 , DD(_T(""))

 , kk(0)

 , cc(FALSE)

 , s(false)

 , d2(FALSE)

 , ss(false)

 , m_combo1(0)

 , cedit(0)

 , text_rx(_T(""))

 , text_tx(_T(""))

{

 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}
void Ctest1Dlg::DoDataExchange(CDataExchange* pDX)

{

 CDialog::DoDataExchange(pDX);

 DDX_Text(pDX, IDC_EDIT1, DD);

 DDX_Text(pDX, IDC_EDIT2, kk);

 DDX_Control(pDX, IDC_CHECK1, check);

 DDX_Check(pDX, IDC_CHECK1, cc);

 DDX_Check(pDX, IDC_CHECK2, d2);

 DDX_Control(pDX, IDC_SLIDER1, slider);

 DDX_Control(pDX, IDC_BUTTON1, s3);

 DDX_Control(pDX, IDC_COMBO1, combo1);

 DDX_CBIndex(pDX, IDC_COMBO1, m_combo1);

 DDX_Text(pDX, IDC_EDIT3, cedit);

 DDX_Control(pDX, IDC_MSCOMM1, m_ctrlcomm);

 DDX_Text(pDX, IDC_EDIT4, text_rx);

 DDX_Text(pDX, IDC_EDIT5, text_tx);

 DDX_Control(pDX, IDC_COMBO2, combo2);

 DDX_Control(pDX, IDC_COMBO3, combo3);

 DDX_Control(pDX, IDC_COMBO4, combo4);

 DDX_Control(pDX, IDC_COMBO5, combo5);

 DDX_Control(pDX, IDC_BUTTON5, b_open_com);

 DDX_Control(pDX, IDC_CHECK4, tx_mode_hex);

}
BEGIN_MESSAGE_MAP(Ctest1Dlg, CDialog)

 ON_WM_SYSCOMMAND()

 ON_WM_PAINT()

 ON_WM_QUERYDRAGICON()
 //}}AFX_MSG_MAP

 ON_BN_CLICKED(IDC_RADIO1, &Ctest1Dlg::OnBnClickedRadio1)

 ON_BN_CLICKED(IDC_BUTTON1, &Ctest1Dlg::OnBnClickedButton1)

 ON_EN_CHANGE(IDC_EDIT4, &Ctest1Dlg::OnEnChangeEdit4)

 ON_BN_CLICKED(IDC_BUTTON2, &Ctest1Dlg::OnBnClickedButton2)

 ON_BN_CLICKED(IDC_BUTTON3, &Ctest1Dlg::OnBnClickedButton3)

 ON_BN_CLICKED(IDC_BUTTON4, &Ctest1Dlg::OnBnClickedButton4)

 ON_BN_CLICKED(IDC_BUTTON5, &Ctest1Dlg::OnBnClickedButton5)

 //ON_MESSAGE(ON_WM_TIMER,&Ctest1Dlg::SetTimer(1,1000,NULL);
 ON_BN_CLICKED(IDC_BUTTON6, &Ctest1Dlg::OnBnClickedButton6)

END_MESSAGE_MAP()

// Ctest1Dlg 消息处理程序
BOOL Ctest1Dlg::OnInitDialog()

{

 CDialog::OnInitDialog();
 // 将“关于...”菜单项添加到系统菜单中。
 // IDM_ABOUTBOX 必须在系统命令范围内。

 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

 ASSERT(IDM_ABOUTBOX < 0xF000);
 CMenu* pSysMenu = GetSystemMenu(FALSE);

 if (pSysMenu != NULL)

 {

  CString strAboutMenu;

  strAboutMenu.LoadString(IDS_ABOUTBOX);

  if (!strAboutMenu.IsEmpty())

  {

   pSysMenu->AppendMenu(MF_SEPARATOR);

   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

  }

 }
 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

 //  执行此操作

 SetIcon(m_hIcon, TRUE);   // 设置大图标

 SetIcon(m_hIcon, FALSE);  // 设置小图标
 ShowWindow(SW_MINIMIZE);

 // TODO: 在此添加额外的初始化代码
//黄色代码为测试控件用
 cc = TRUE;

 d2=true;

 s=FALSE;

 ss=true;

 int x=100;

 ((CButton *)GetDlgItem ( IDC_RADIO1))->SetCheck( TRUE );

 slider.SetRange(0,100);//设置滑动范围

 slider.SetTicFreq(10);//设置滑动的刻度(步进值)

 //slider.SetPos(23);//设置当前滑度
 
 //初始化串口选择下拉框

    combo2.InsertString(0,_T("COM1"));

 combo2.InsertString(1,_T("COM2"));

 combo2.InsertString(2,_T("COM3"));

 combo2.InsertString(3,_T("COM4"));

 combo2.InsertString(4,_T("COM5"));

 combo2.InsertString(5,_T("COM6"));

 combo2.InsertString(6,_T("COM7"));

 combo2.InsertString(7,_T("COM8"));

 combo2.InsertString(8,_T("COM9"));

    ((CComboBox*)GetDlgItem(IDC_COMBO2))->SetCurSel(0);//设置第0行内容为显示的内容

    //初始化波特率选择下拉框

 combo1.InsertString(0,_T("9600"));

 combo1.InsertString(1,_T("4800"));

 combo1.InsertString(2,_T("1200"));

 combo1.InsertString(3,_T("115200"));

 //combo1.SetCurSel(2);

 ((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(2);//设置第2行内容为显示的内容

 //初始化校验位下拉框

 combo3.InsertString(0,_T("E"));

    combo3.InsertString(1,_T("O"));

 combo3.InsertString(2,_T("N"));

 combo3.SetCurSel(2);

 //初始化数据位下拉框

 combo4.InsertString(0,_T("8"));

 combo4.InsertString(1,_T("7"));

 combo4.InsertString(2,_T("6"));

    combo4.SetCurSel(0);//设置第0行内容为显示内容

 //初始化停止位下拉框

 combo5.InsertString(0,_T("2"));

 combo5.InsertString(1,_T("1"));

 combo5.SetCurSel(1);//设置第1行内容为显示内容

 m_ctrlcomm.put_InBufferSize(1024);//设定串口发送数据缓冲区大小   

 m_ctrlcomm.put_OutBufferSize(1024);//设定串口接收数据缓冲区大小   

 m_ctrlcomm.put_InputLen(0);//设置当前接收区数据为0表示全部读取   

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

 m_ctrlcomm.put_RThreshold(1);//当接收缓冲区有1个或以上数据时读取  
 CString x1,x2,x3,x4,x5,com_setings;

 UINT8 n_com;

 combo2.GetWindowText(x2);//获取当前选择串口号

 x2=x2.Mid(3,1);

 n_com=_ttoi((x2));

 m_ctrlcomm.put__CommPort(n_com);//设定使用串口1
 combo1.GetWindowText(x1);//获取当前波特率

 combo3.GetWindowText(x3);//获取当期奇偶校验位

 combo4.GetWindowText(x4);//获取当前数据位

    combo5.GetWindowText(x5);//获取当前停止位

 com_setings=x1+','+x3+','+x4+','+x5;

 //m_ctrlcomm.put_Settings(_T("9600,N,8,1"));//设定波特率9600无检验位,8个数据位,1个停止位   
 m_ctrlcomm.put_Settings((com_setings));
 text_tx="Text ok!\r\n";
 if (m_ctrlcomm.get_PortOpen())//如果串口是打开的

 {  

  m_ctrlcomm.put_PortOpen(FALSE);//关闭串口  

 }  

 else//如法打开则提示错误   

 {  

  

 }  

 //m_ctrlcomm.get_Input();  

 //Sleep(3000);  

    UpdateData(FALSE);//更新输出

 

 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE

}
void Ctest1Dlg::OnSysCommand(UINT nID, LPARAM lParam)

{

 if ((nID & 0xFFF0) == IDM_ABOUTBOX)

 {

  CAboutDlg dlgAbout;

  dlgAbout.DoModal();

 }

 else

 {

  CDialog::OnSysCommand(nID, lParam);

 }

}
// 如果向对话框添加最小化按钮,则需要下面的代码

//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,

//  这将由框架自动完成。
void Ctest1Dlg::OnPaint()

{

 if (IsIconic())

 {

  CPaintDC dc(this); // 用于绘制的设备上下文
  SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  // 使图标在工作矩形中居中

  int cxIcon = GetSystemMetrics(SM_CXICON);

  int cyIcon = GetSystemMetrics(
c947
SM_CYICON);

  CRect rect;

  GetClientRect(&rect);

  int x = (rect.Width() - cxIcon + 1) / 2;

  int y = (rect.Height() - cyIcon + 1) / 2;
  // 绘制图标

  dc.DrawIcon(x, y, m_hIcon);

 }

 else

 {

  CDialog::OnPaint();

 }

}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。

//

HCURSOR Ctest1Dlg::OnQueryDragIcon()

{

 return static_cast<HCURSOR>(m_hIcon);

}

void Ctest1Dlg::OnBnClickedRadio1()

{

 // TODO: 在此添加控件通知处理程序代码

}
void Ctest1Dlg::OnBnClickedButton1()

{

 

 UpdateData(TRUE);

 // TODO: 在此添加控件通知处理程序代码

 UpdateData(FALSE);//更新输出

}

BEGIN_EVENTSINK_MAP(Ctest1Dlg, CDialog)

 ON_EVENT(Ctest1Dlg, IDC_MSCOMM1, 1, Ctest1Dlg::OnCommMscomm1, VTS_NONE)

END_EVENTSINK_MAP()
//串口接收处理事件
void Ctest1Dlg::OnCommMscomm1()

{

 // TODO: 在此处添加消息处理程序代码

 // TODO: Add your control notification handler code here
 VARIANT  variant_input;
 COleSafeArray safearray_input;
 LONG len,k;
 BYTE rxdata[2048];

 CString m_strEditRXData;
 CString strtemp;

    

 if(m_ctrlcomm.get_CommEvent()==2)

 {

  variant_input=m_ctrlcomm.get_Input();

  safearray_input=variant_input;

  len=safearray_input.GetOneDimSize();

  m_strEditRXData+=strtemp;

  for(k=0;k<len;k++)

  safearray_input.GetElement(&k,rxdata+k);

  for(k=0;k<len;k++)

  {

   BYTE bt=*(char *)(rxdata+k);

   strtemp.Format(_T("%c"),bt);

   m_strEditRXData+=strtemp;

   text_rx+=strtemp;

  }

 }
 UpdateData(FALSE);//更新输出

}

//串口发送按钮
void Ctest1Dlg::OnBnClickedButton2()

{
 // TODO: 在此添加控件通知处理程序代码
 UpdateData(true);//更新输入
 if (tx_mode_hex.GetCheck())

 {

  //text_tx="yes";

  //复选框被选上

 }

 else

 {

  //text_tx="no";

  //复选框没被选上

 }
 if (!m_ctrlcomm.get_PortOpen())

 {

  AfxMessageBox(_T("串口尚未打开!"),MB_OK,0);

 } 

 else

 {

  m_ctrlcomm.put_Output(COleVariant(text_tx));//发送数据   

  //m_ctrlcomm.put_Output(COleVariant(s_x));

 }

 UpdateData(FALSE);//更新输出
}
 
//清空发送区按钮
void Ctest1Dlg::OnBnClickedButton3()

{

 // TODO: 在此添加控件通知处理程序代码

 text_tx="";//text_tx是文本框的  型变量

 UpdateData(FALSE);//更新输出

}
//清空接收区按钮
void Ctest1Dlg::OnBnClickedButton4()

{

 // TODO: 在此添加控件通知处理程序代码

 text_rx="";

 UpdateData(FALSE);//更新输出

}
//打开串口按钮
void Ctest1Dlg::OnBnClickedButton5()

{

 // TODO: 在此添加控件通知处理程序代码
 UpdateData(true);//更新输入
 CString caption;

 b_open_com.GetWindowText(caption);

 UINT8 flag;

 if (caption==_T("打开串口"))

 {

  flag=1;

  b_open_com.SetWindowText(_T("关闭串口"));

 }  

 else if(caption==_T("关闭串口"))

 {

  flag=0;

  b_open_com.SetWindowText(_T("打开串口"));

 }
 if (flag==1)//打开按钮操作

 {

  if (!m_ctrlcomm.get_PortOpen())//如果串口是关闭的,打开串口   

  {  

   m_ctrlcomm.put_PortOpen(TRUE);  

   AfxMessageBox(_T("Open Serial Port success!"),MB_OK,0);

   //b_open_com.SetWindowText(_T("关闭串口"));

  }

  else

  {

   AfxMessageBox(_T("串口已经打开!"),MB_OK,0);

   //b_open_com.SetWindowText(_T("打开串口"));

   //flag=0;

  }
 } 

 else if(flag==0)//关闭串口操作

 {

  if(m_ctrlcomm.get_PortOpen()==TRUE)//如果串口是打开的

  {

   AfxMessageBox(_T("close Serial Port success!"),MB_OK,0);  

   m_ctrlcomm.put_PortOpen(FALSE);//关闭串口

  }

  else

  {

   AfxMessageBox(_T("串口尚未打开!"),MB_OK,0);

   //m_ctrlcomm

  }
 }
 UpdateData(FALSE);//更新输出
}
//将串口接收区的内容保存成txt文档
void Ctest1Dlg::OnBnClickedButton6()

{

 // TODO: 在此添加控件通知处理程序代码

 UpdateData(true);
 //获取系统时间

 SYSTEMTIME st;

 CString strDate,strTime,text_temp;

 GetLocalTime(&st);

 strDate.Format(_T("DATE:%4d-%2d-%2d "),st.wYear,st.wMonth,st.wDay);

 strTime.Format(_T("TIME:%2d:%2d:%2d"),st.wHour,st.wMinute,st.wSecond);
 //创建text文件(此种方式不支持中文)

 CStdioFile   file(_T( "C:\\Test.txt "),   CFile::modeCreate   |   CFile::modeWrite); 

 text_temp=text_rx;

 text_temp=text_temp+strDate+strTime;

 file.WriteString(text_temp); 

 file.WriteString(_T( "\r\n ")); 

 file.Flush(); 

 file.Close(); 
 UpdateData(FALSE);//更新输出
}

软件界面如下:
 





 
对c++不熟悉,功能还有待完善.........
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MFC串口编程