如何在vc6.0中为实现串口通信

如何在vc6.0中为实现串口通信,第1张

首先创建一个VC6.0基于对话框的程序,然后在资源视图中,Project --- >Add To Project --->compoents and controls...,如下图所示

在d出的窗口选择“Registered ActiveX Controls”,双击进入该文件夹,如下图所示

在列表中找到“Microsoft Communications Control, version 6.0”,点击“Insert”按钮,如下图所示

接下来就会在资源视图中看到一个电话图标,如下图所示

右键该电话图标,选择“ClassWizard...”,如下图所示

在Member Variables下为该控件添加一个控件变量,如下图所示

在Message Maps下为该控件添加OnComm消息,如下图所示

在OnInitDialog()函数中,加入窗口控件初始化函数,如下图所示

在OnComm() 函数中,加入串口消息处理函数,处理串口接收的数据,如下图所示

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)

}

你好,希望我的回答能够对你有所帮助。

1.假如你现在正在学习VC串口编程,强烈建议你安装一个“虚拟串口软件vspdxp.exe”,再找个“sscom3.2串口通讯调试工具”。之后就可以完全用软件模拟串口通信来调试你的vc程序,很方便

2.我自己写了个程序实现你的要求,vc6下测试通过,工程下载地址:http://sites.google.com/site/qiujiejia1/Home/BaiDu_Answer_VC_SERIAL_2.zip

3. 萍水e相逢 推荐的 “ 龚建伟的个人主页,www.gjwtech.com ”绝对是学习串口通信的好网站,望有空多上去看看。

4.以下是主要代码,仅供参考。

/****************************************************************************

在OnInitDialog()里初始化

****************************************************************************/

BOOL CCommTest::OnInitDialog()

{

CDialog::OnInitDialog()

SetIcon(m_hIcon, TRUE) // Set big icon

SetIcon(m_hIcon, FALSE) // Set small icon

//Initial COM

m_ctrlComm.SetCommPort(1) //选择com1

m_ctrlComm.SetSettings("9600,n,8,1")//通信参数设置 波特率9600,无校验,8个数据位,1个停止位

m_ctrlComm.SetInBufferSize(1024) //指定接收缓冲区大小

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

m_ctrlComm.SetInputMode(1) //定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。

m_ctrlComm.SetInputLen(0) //设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲 区中的全部内容。

m_ctrlComm.SetInBufferCount(0) //清空接收缓冲区

m_ctrlComm.SetPortOpen(TRUE) //打开串口

return TRUE // return TRUE unless you set the focus to a control

}

/****************************************************************************

接收函数

****************************************************************************/

void CCommTest::OnComm()

{

char Rec_Data_Array[2048] //用于接受数据

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

{

VARIANT ReceiveData = m_ctrlComm.GetInput() //获取数据

int Data_Len = ReceiveData.parray->rgsabound->cElements//取出一维的数据个数

memcpy(Rec_Data_Array, (char*) ReceiveData.parray->pvData, Data_Len)//拷贝出数据

Rec_Data_Array[Data_Len] = 0

}

//将获取的字符串显示在edit框里

::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT_RXDATA),Rec_Data_Array)

}

/****************************************************************************

发送函数

****************************************************************************/

void CCommTest::OnTransmit()

{

char buf[100]={0}

::GetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT_TXDATA),buf,sizeof(buf))

m_ctrlComm.SetOutput(COleVariant(buf))//发送数据

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12095917.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存