• (转)VC串口小程序(用SerialPort类)


    ×××××××××××××××××××××××××××××××××××××××××××××××××××××

    在MFC里面实现串口通讯有很多方式:

    方案一:使用微软公司提供的 串口类,SerialPort。这是官方的东西   有最大的灵活性和可靠性。  我的主攻选择为这个。

    微软资源地址:https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1

    方案二:MSComm控件  。使用这种控件 就可以了。。。 不过MFC没有自带,需要添加。

    方案三:API函数进行串口编程。  这种方式  也很好  就是难道较大。

    ×××

    有个哥们整理了这些资料:http://www.vc-rs232.com/   我看了下  还是蛮好的。。

    ××××××××××××××××××××××××××××××××××××××××××××××××××××

    先建立一个基于对话框的小程序,做好界面有串口号,打开串口按钮,关闭串口按钮,发送按钮,接收数据区和发送数据区。

    然后给串口号即组合框添加变量 CComboBox m_ctrlComPort;

    给接收数据编辑框添加关联变量 CString m_strRxMsg;

    给发送数据编辑框添加关联变量 CString m_strTxMsg;

    然后将SerialPort类的头文件和C++文件复制到工程中区,然后将它们添加到工程中去,将SerialPort的头文件包含到对话框中文件中去。

    在对话框头文件中定义一个布尔变量,用来表示标志串口是否打开,再定义一个对象用来调用SerialPort类中的函数。

    源码 BOOL m_bPortOpen;  //定义一个布尔变量标志串口是否打开;

    CSerialPort m_SerialPort;  //定义一个串口类的对象。

    然后开始编辑代码,在SerialPort类中有多个串口事件可以响应,在一般串口编程中,只需要处理WM_COMM_RXCHAR消息就可以了,该类所有的消息处理都需要人工添加消息处理函数。

    将处理函数名字定义为OnComm()。首先向对话框头文件中添加串口字符接收消息WM_COMM_RXCHAR(串口接收缓冲区中有一个字符)的消息响应声明: 

    // Generated message map functions
     //{{AFX_MSG(CSmSerialPortDlg)
     afx_msg LONG OnComm(WPARAM ch,LPARAM port);   //串口字符接收消息(WM_ONCOMM_RXCHAR)(串口接收缓冲区内有一个字符)的响应函数

    然后再向对话框CPP文件中添加WM_ONCOMM_RXCHAR的消息映射

    BEGIN_MESSAGE_MAP(CSmSerialPortDlg, CDialog)
     //{{AFX_MSG_MAP(CSmSerialPortDlg)
     ON_MESSAGE(WM_COMM_RXCHAR, OnComm)  //消息映射

    接着,在对话框CPP文件中加入函数OnComm()的实现

    //字符接收消息响应函数
    LONG CSmSerialPortDlg::OnComm(WPARAM ch,LPARAM port)
    {
     m_strRxMsg+=ch; //将接收到的字符存入编辑框对应的变量中
     UpdateData(FALSE);  //将接收到的字符显示在接受编辑框中
     return 0;
    }

    每当串口接收缓冲区中有一个字符时,就会产生一个WM_ONCOMM_RXCHAR消息,触发OnComm()函数,这时就可以在函数中进行数据处理,所以这个消息就是整个程序的发动机。

    在CSmSerialPortDlg::OnInitDialog()初始化函数中将串口默认设置为COM1; m_ctrlComPort.SetCurSel(0); //初始选择串口1

    添加 

    GetDlgItem(IDC_BUTTON_OPENPORT)->EnableWindow(!m_bPortOpen);
     GetDlgItem(IDC_BUTTON_CLOSEPORT)->EnableWindow(m_bPortOpen);

    使能打开串口或关闭串口按钮。

    添加打开串口,关闭串口和发送按钮的消息响应处理函数如下:

    void CSmSerialPortDlg::OnButtonCloseport()   //关闭串口按钮消息响应函数
    {
     // TODO: Add your control notification handler code here
      
     m_bPortOpen=FALSE;

     GetDlgItem(IDC_BUTTON_OPENPORT)->EnableWindow(!m_bPortOpen);
     GetDlgItem(IDC_BUTTON_CLOSEPORT)->EnableWindow(m_bPortOpen);
    }

    void CSmSerialPortDlg::OnButtonOpenport()  //打开串口按钮消息响应函数
    {
     // TODO: Add your control notification handler code here
     
     int nPort=m_ctrlComPort.GetCurSel()+1;   //得到串口号
     if(m_SerialPort.InitPort(this,nPort,9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512))
     {
      m_SerialPort.StartMonitoring();  //启动串口通信检测线程函数
      m_bPortOpen=TRUE;
     }
     else
     {
      AfxMessageBox("没有发现此串口或者被占用");
      m_bPortOpen=FALSE;
     }
     GetDlgItem(IDC_BUTTON_OPENPORT)->EnableWindow(!m_bPortOpen);
     GetDlgItem(IDC_BUTTON_CLOSEPORT)->EnableWindow(m_bPortOpen);
    }

    void CSmSerialPortDlg::OnButtonSend() 
    {
     // TODO: Add your control notification handler code here
     if(!m_bPortOpen)
     return ;      //检测串口是否打开
     UpdateData(TRUE);     //读入编辑框的数据
     m_SerialPort.WriteToPort((LPCTSTR)m_strTxMsg);  //发送数据
    }
    好了,这时此小串口程序就基本上完成了。

  • 相关阅读:
    Tech road one step Dec-5 to Dec-11
    Tech road one step Nov-28 to Dec-4
    Tech road one step 13-Nov to 20-Nov
    Unity 相机花式分屏
    Unity渲染
    Perfect Rectangle(完美矩形)
    Max Points on a Line(直线上最多的点数)
    Unity之CharacterController 碰撞问题总结
    cocos2dx 实现flappybird
    effectiveC++ 内存管理 学习笔记
  • 原文地址:https://www.cnblogs.com/wenluderen/p/4252309.html
Copyright © 2020-2023  润新知