如何用VC进行串口编程

2025-03-10 00:48:35
推荐回答(1个)
回答1:

1、新建MFC对话框工程如下

2、给编辑框控件添加变量,其中Edit Box添加Value变量,Button添加Control变量,ID和变量分别为:

IDC_BTNOPEN()                                  CButton m_cBtnOpen;

IDC_BTNSEND()                                  CButton m_cBtnSend;

IDC_EDIT_RXDATA()                          CString m_sRXDATA;

IDC_EDIT_TXDATA()                           CString m_sTXDATA;

3、右击插入Active X控件:

右击电话图标选择“Class Wirzard”,添加变量m_comm1,添加Function:

双击两个Button按钮;

代码中显示如下:

[cpp] view plain copy print?

  • void CMSCommTestDlg::OnBnClickedBtnopen()  

  • {  

  • // TODO: Add your control notification handler code here  

  • }  

  • void CMSCommTestDlg::OnBnClickedBtnsend()  

  • {  

  • // TODO: Add your control notification handler code here  

  • }  

  • void CMSCommTestDlg::OnOncommMscomm1()  

  • {  

  • // TODO: Add your message handler code here  

  • }  

  • void CMSCommTestDlg::OnBnClickedBtnopen()

  • {

  • // TODO: Add your control notification handler code here

  • }

  • void CMSCommTestDlg::OnBnClickedBtnsend()

  • {

  • // TODO: Add your control notification handler code here

  • }

  • void CMSCommTestDlg::OnOncommMscomm1()

  • {

  • // TODO: Add your message handler code here

  • }


  • 5、将上面代码补全如下:

    [cpp] view plain copy print?

  • void CMSCommTestDlg::OnClickedBtnopen()  

  • {  

  • // TODO: Add your control notification handler code here  

  • //如果端口已经开启,那么先关闭  

  • if (m_comm1.get_PortOpen())  

  • {  

  • m_comm1.put_PortOpen(FALSE);  

  • }  

  • m_comm1.put_CommPort(3);                //选择com3,可以根据具体情况更改  

  • m_comm1.put_InBufferSize(1024);         //设置输入缓冲区的大小,Bytes  

  • m_comm1.put_OutBufferSize(1024);        //设置输出缓冲区的大小,Bytes  

  • m_comm1.put_Settings(_T("9600,n,8,1")); //波特率9600,无校验,8个数据位,停止位1  

  • m_comm1.put_InputMode(1);               //1:表示以二进制方式检索数据  

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

  • m_comm1.put_InputLen(0);                //设置当前接收区长度是0  

  • if (!m_comm1.get_PortOpen())  

  • {  

  • m_comm1.put_PortOpen(TRUE);  

  • }  

  • else  

  • {  

  • AfxMessageBox(_T("Can not open serial port!"));  

  • }  

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

  • UpdateData(FALSE);  

  • }  

  • void CMSCommTestDlg::OnClickedBtnsend()  

  • {  

  • // TODO: Add your control notification handler code here  

  • UpdateData(TRUE);  

  • m_comm1.put_Output(COleVariant(m_sTXDATA));//发送数据  

  • }  

  • void CMSCommTestDlg::OnOncommMscomm1()  

  • {  

  • // TODO: Add your message handler code here  

  • VARIANT variant_inp;  

  • COleSafeArray safearray_inp;  

  • LONG len, k;  

  • BYTE rxdata[2048];  

  • CString strtemp;  

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

  • {  

  • variant_inp = m_comm1.get_Input();  //读缓冲区  

  • safearray_inp = variant_inp;        //VARIANT型变量转换为ColeSafeArray型变量  

  • len = safearray_inp.GetDim();       //得到有效数据长度  

  • 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存放  

  • m_sRXDATA += strtemp;           //接收到的数据放到编辑框对应的变量中  

  • }  

  • }  

  • SetDlgItemText(IDC_EDIT_RXDATA, m_sRXDATA);  

  • }