打印

请教:在MFC的界面里怎样用485通信。

[复制链接]
4016|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuanquan12345|  楼主 | 2012-10-4 16:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
20120703| | 2012-10-4 16:56 | 只看该作者
232通信还可以,有串口控件,可以读出数据。

使用特权

评论回复
板凳
hawksabre| | 2012-10-4 17:34 | 只看该作者
什么意思   不明白   你是说硬件电路还是驱动编写    说详细点    呵呵

使用特权

评论回复
地板
hawksabre| | 2012-10-4 17:38 | 只看该作者
如果是硬件电路   那使用485芯片  MAX3485   照着手册上的推荐电路来   很简单    如果是软件也很简单   先将流程图画出来    初始化端口   定义端口功能    ·设置波特率    选择分频时钟    选择分频系数     这是第一个模块   第二个模块设置标志位   设置中断  设置触发函数  然后主函数调用   基本OK了
   你自己在完善完善   很简单

使用特权

评论回复
5
hawksabre| | 2012-10-4 17:38 | 只看该作者
这是主要的流程   不难   希望能够帮到你   呵呵   自己多多努力

使用特权

评论回复
6
wupingjun315| | 2012-10-4 22:16 | 只看该作者
将485接口转换成232接口,这样在MFC里会很好操作的。

使用特权

评论回复
7
yuanquan12345|  楼主 | 2012-10-5 09:33 | 只看该作者
谢谢大家,学了两年MFC,没学好,现在用485转232,实现通信。
从网上搜了一部分资料,有问题再向大家请教。

使用特权

评论回复
8
与时俱进| | 2012-10-5 09:56 | 只看该作者
485还不是要转成232才能接到电脑?

使用特权

评论回复
9
Ryanhsiung| | 2012-10-5 10:27 | 只看该作者
外面接一个485转232盒子就可以了!
  使用MSCOM控件!

使用特权

评论回复
10
yuanquan12345|  楼主 | 2012-10-5 10:38 | 只看该作者
我现在已经做到这儿了。
程序一:
1.建立项目   
   打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest   
2.在项目中插入MSComm控件   
   选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。 选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX一项选上,重新安装VC6,选上ActiveX就可以了),   
  这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls中出现了电话图标.现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。
3.利用ClassWizard定义CMSComm类控制对象   
   打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES() #i nclude "mscomm.h" //}}AFX_INCLUDES (这时运行程序,如果有错,那就再从头开始)。   
4.在对话框中添加控件
   向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。别忘记了将接收编辑框的Properties->Styles中把Miltiline和Vertical Scroll属性选上,发送编辑框若你想输入多行文字,也可选上Miltiline。   
  再打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类, 为IDC_EDIT_RXDATA添加CString变量m_strRXData, 为IDC_EDIT_TXDATA添加CString变量m_strTXData。说明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。   
5.添加串口事件消息处理函数OnComm()   
   打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。   
  这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。请你在函数中加入如下代码:   
void CSCommTestDlg::OnComm()   
{   
// TODO: Add your control notification handler code here   
VARIANT variant_inp;   
COleSafeArray safearray_inp;   
LONG len,k;   
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.   
CString strtemp;   
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符   
{ ////////以下你可以根据自己的通信协议加入处理代码   
variant_inp=m_ctrlComm.GetInput(); //读缓冲区   
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("%c",bt); //将字符送入临时变量strtemp存放   
m_strRXData+=strtemp; //加入接收编辑框对应字符串   
}   
}   
UpdateData(FALSE); //更新编辑框内容   
}   

  到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运行程序不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开VC6对照着做一步写一行的,运行试试。没错吧?那么做下一步:   
6.打开串口和设置串口参数   
   你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的处理函数中打开串口。现在我们在主对话框的CSCommTestDlg::OnInitDialog()打开串口,加入如下代码:   
// TODO: Add extra initialization here   
if(m_ctrlComm.GetPortOpen())   
m_ctrlComm.SetPortOpen(FALSE);   
m_ctrlComm.SetCommPort(1); //选择com1   
if( !m_ctrlComm.GetPortOpen())   
m_ctrlComm.SetPortOpen(TRUE);//打开串口   
else   
AfxMessageBox("cannot open serial port");   
m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位   
m_ctrlComm.SetInputModel(1); //1:表示以二进制方式检取数据   
m_ctrlComm.SetRThreshold(1);   
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件   
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0   
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据   

现在你可以试试程序了,将串口线接好后,打开串口调试助手 ,并将串口设在com2,选上自动发送,也可以等会手动发送。再执行你编写的程序,接收框里应该有数据显示了。   
7.发送数据   
   先为发送按钮添加一个单击消息即BN_CLICKED处理函数,打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,并在函数中添加如下代码:   
void CSCommTestDlg::OnButtonManualsend()   
{   
// TODO: Add your control notification handler code here   
UpdateData(TRUE); //读取编辑框内容   
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据   
}   
  运行程序,在发送编辑框中随意输入点什么,单击发送按钮,啊!看看,在另一端的 串口调试助手 (或别的调试工具)接收框里出现了什么。   
  最后说明一下,由于用到VC控件,在没有安装VC的计算机上运行时要从VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目录下的System子目录中(win2000为System32)并再进行注册设置.

使用特权

评论回复
11
yuanquan12345|  楼主 | 2012-10-5 10:39 | 只看该作者
现在程序运行正常。
最后说明一下,由于用到VC控件,在没有安装VC的计算机上运行时要从VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目录下的System子目录中(win2000为System32)并再进行注册设置.   
这些从哪里找到,应该怎样做。
串口调试工具。
请指点。
谢谢。

使用特权

评论回复
12
mohanwei| | 2012-10-5 11:15 | 只看该作者
搜“龚建伟 串口调试助手”

使用特权

评论回复
13
mohanwei| | 2012-10-5 11:17 | 只看该作者
串口调试助手V2.3 ++增强版.zip (509.73 KB)

使用特权

评论回复
14
yuanquan12345|  楼主 | 2012-10-5 11:24 | 只看该作者
谢谢,已下载。

使用特权

评论回复
15
dqyubsh| | 2012-10-5 15:30 | 只看该作者
MSCOMM可用,但它的用法比较低级,写代码很麻烦,象个玩具。建议使用更成熟一些的控件。

使用特权

评论回复
16
古道热肠| | 2012-10-6 00:11 | 只看该作者
个人觉得还是龚建伟书中提到的那个MFC的串口类好用吧。其实是简单地封装了一下Windos的API,便于在MFC下快速生成应用程序。

使用特权

评论回复
17
tcc8073| | 2012-10-7 09:21 | 只看该作者
本帖最后由 tcc8073 于 2012-10-7 09:23 编辑

使用SerialPort这个类,比较灵活,具体用法网上可以找到,485通讯只要用一片232转485就可以搞定了,只是485读写需要对脚位控制,选那种硬件实现读写选择的模块就可以直接用了,没有那么复杂

使用特权

评论回复
18
yuanquan12345|  楼主 | 2012-10-7 21:24 | 只看该作者
谢谢大家,望多帮助。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

1155

帖子

3

粉丝