Banner1
教育界在线编辑
热门职业教育论文发表文章推荐

特别合作伙伴

首页 > 论文发表 > 职业教育论文发表 > INTRODUCE

基于VC++的can总线通信上位机的设计

2012-06-27 10:17 作者:ysahsx 来源:本站 浏览: 我要评论 (条) 字号:

摘要: 【摘要】介绍CAN总线以及CAN总线控制器与PC机之间接口电路。以及基于VC++的基础对CAN控制器采集的数据所进行处理的程序设计。

作者:王  宇 广西机电工程学校,广西  南宁

摘要介绍CAN总线以及CAN总线控制器与PC机之间接口电路。以及基于VC++的基础对CAN控制器采集的数据所进行处理的程序设计。
关键词CAN总线,PC机,RS-232,MAX232,串行通信
作者简介:王宇(1977—),男,广西南宁人,广西机电工程学校讲师,研究方向:机电应用。
 
1.前言
计算机的数据传送领域内,使用RS-232和CCITTV2.4通信标准是长期以来人们所惯用的,尽管这些标准被广泛使用,但确实是一种低速率及一对一的数据传输标准,并没有能力支持更高等级的与计算机之间的功能和操作。同时在相对更复杂以及大规模应用(如生产自动化领域或工业现场控制)中需使用非常多的执行器、控制器、和传感器等等,它们通常都分布在非常之广的范围,如果在最底层采用较传统的星型结构,虽可以减少一定的电缆长度,但增加的LAN介质以及相关软件和硬件又使其造价相当之高。所以现场总线(Field bus)就是在这种背景下产生的。
 在最近几年来,现场总线的快速发展以及其技术的日益成熟使其成为国际自动控制领域关注的焦点。控制器局部网(CAN—Controller Area Network)隶属于现场总线的范围,它是一种有效的支持实时控制或者支持分布式控制的串行通信网络。它在如今自动化的电子领域汽车发动机控制部件,传感器及其他系统中有着广泛的应用。
本论文着重介绍的是PC机与CAN总线控制器之间的通信,以及数据的处理与窗口界面的设计。
2.系统及软件设计(PC机软件)
2.1CAN总线系统的组成原理
本系统是以CAN总线控制器P87C591为核心控制器,该CAN控制器自身包含有十位的A/D转换器,并且有八路通道可供用户选择。在这里我们通过P1.2~P1.4外接4路A/D转换电路,对外部的模拟信号进行捕捉采集,也可以通过CAN总线接口芯片TJA1050利用串行工作方式对CAN总线上各网络节点上的数据进行采集。同时本系统有具有I2C总线结构的24LC256外部RAM。可以对采集到的数据进行快速保存。
2.2软件总体简介
本系统的软件总体设计分为两部分,对P87C591总线控制器进行编程的单片机软件(下位机软件)和PC机软件部分(上位机软件)。本论文主要介绍的是上位机软件。既对P87C591CAN总线控制器发出来的数据进行接收,及接收后的后续工作。实现的图形化直观显示给用户的功能和人机对话功能。
软件的编写使用是VC++语言,总体思路如图所示。


图2设计思路
2.3接口电路
在本系统中使用比较经典的RS-232通信电路,如下图,笔者不再多述。
 
以上接法,设计程序时,可直接进行数据的接收和发送,不需对信号线状态进行判断和设置。
3.通信协议
本系统的通信波特率为9600bps,串行通信无校验位,共10位,即:1启始位(0),8数据(低位在前),1停止位(1).
在本系统中,下位机设计了8个模块即:读写24LC256模块、对CAN总线节点读写控制命令模块、采集A/D模拟信号模块、选定某A/D通道采集信号模块、初始化模块、纠错模块、产生错误信息模块、从发命令字模块。
PC机与CAN控制器以报文形式接收发送数据,一帧报文包含以下几个数据块:
地址 数据长度 命令字 数据 校验字
规定地址为上位机地址为0x01,下位机地址为0x00
规定上位机发送命令字如下表
0x10 0x20 0x30 0x40 0x50 0x60 0x70 其它
选择通道进行A/D转换 采集转换数据 发送数据到24LC256 从24LC256读取数据 CAN初始化 发送数据到CAN总线 接收CAN总线上的数据 错误码
4.软件设计
本设计使用MSComm控件进行串行通信编程
VC++ 6.0提供的MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信功能,使用非常方便.步骤如下:
 4.1在当前工作中插入MSComm控件:
点击Project菜单——打开Add to Project——
打开Components and Controls——打开Registered ActiveX Controls——
选择Components: Microsoft Communications Control——
 version 6.0 插入到当前的Workspace中。
 结果添加了类CMSComm(及相应文件:mscomm.h和mscomm.cpp )。
4.2 建立dialog对话框。
添加控件到对话框中,在dialog对话框中建立静态文本框,用于对P87C591所进行数据采集的通道号以及所采集的数据的显示。在CMyDialog类中可以建立OnInitDialog()函数在其中添加
GetDlgItem(IDC_DISP)—>GetWindowRect(&m_pRect);
ScreenToClient(&m_pRect);
得到静态文本框的指针,则可以实现采集数据的波形显示。这里文本框1显示A/D转换的通道号,文本框2显示模拟量。复杂的数据则在静态文本框中显示。
在ClassWizard中为新创建的通信控件定义成员对象(CMSComm ,m_Serial),通过该对象可以对串口属性进行设置,MSComm 控件共有27个属性。
4.3.在MainFrm.h中加入MSComm控件。
protected: CMSComm m_Comm;
在Mainfrm.cpp::OnCreare()中:
DWORD style=WS_VISIBLE|WS_CHILD;
 if       (!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL))
{
 TRACE0("Failed to create OLE Communications Control\n");
return -1;  
}
4.4.初始化串口
初始化可对MSComm控件有关的通信参数和输入输出属性进行设置,包括设置串口号,设置字节有效位书、奇偶性、停止位、波特率等。
m_Comm.SetCommPort(2);  //选择COM?     
m_ComPort. SetInBufferSize(1024); //设置输入缓冲区的大小
Bytes m_Comm. SetOutBufferSize(512); //设置输入缓冲区的大小 if(!m_Comm.GetPortOpen()); //打开串口
m_Comm.SetInputMode(1); //设置输入方式为二进制方式 m_Comm.SetSettings("9600,n,8,1"); //设置波特率等参数 m_Comm.SetRThreshold(1); //为1表示有一个字符引发一个事件
 4.5.捕捉串口事件。
MSComm控件可以采用事件驱动或查询方法从串口获取数据。本项目使用事件驱动方法:有事件(如接收到数据)时通知程序,在程序中捕获并处理这些事件。
在MainFrm.h中:
protected:
afx_msg void OnCommMscomm();
DECLARE_EVENTSINK_MAP()
   在MainFrm.cpp中:
BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )         ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE) //映射ActiveX控件事件
END_EVENTSINK_MAP()
4.6.串口读写。
   接受到串口数据后,使用ClassWizard(类向导)添加MSComm控件的OnComm()事件的响应函数,每次CAN总线控制器P87C591 发送了数据,都会响应OnComm()事件,进入该函数。本文将读到的数据存储到字符串变量vReceive中。打开串口后,需考虑串口通信时机。在接收和发送数据过程中,需要监视并响应一些事件和错误。使用  OnComm() 事件和 CommEvent() 属性捕捉并检查通讯事件和错误的值。当发生通讯事件或错误时,将触发 OnComm()。编写发送、接收函数时,还有InBufferCount属性返回接收缓冲区中已收到字节数,查询方法可利用该属性,看是否收到了规定数目的字节。对于OnComm()事件处理如下:
以下是PC机向CAN总线控制器P87C591发送数据的源代码:
void CMainFrame::OnCommSend()
{
UpDateData(true); // 准备需要发送的命令,放在TxData[]中
TxData[]=m_Edit2;
UpDateData(false);
ByteArray array;
array.RemoveAll();
array.SetSize(Count);
for(i=0;i<Count;i++)
array.SetAt(i, TxData[i]);
m_Comm.SetOutput(COleVariant(array)); // 发送数据
 
在文本框2中输入需要发送的控制字,发送出去,然后等下位机发送执行命令后动作。
以下是接收PC机接收CAN总线控制器P87C591发送出去的数据源代码:
VARIANT vReceive;
           int k;
           CString m_Receive;
          Switch (m_comm.GetCommEvent())
{
case 2://接收到字符事件
{//读取CAN总线控制器发送过来的数据,并存放到数组中去
k=m_comm.GetInBufferCount();
m_comm.SetInputLen(k);
vReceive=m_comm.GetInput();
CString str;
Str=vReceive.bstrVal;
m_Receive=m_Receive+str;
UpdateData(false);
if(vRecive=0x0ff)
Break;
}
          default:break;
        } // 接收到字符,MSComm控件发送事件 }
。。。。。 // 处理其他MSComm控
                                }
          
 


参考文献:

邬宽明。CAN总线原理和应用系统设计。北航出版社。第1、2章
陈奇。面向对象程序设计高级教程高等教育出版社。第5、6、7章
李存军.朱鑫.梁世庆。Visual C++6.0编程。科技大学出版社。第4章
康博创作室。 Visual C++ 6.0程序设计自学教程 。清华大学出版社  。
《带CAN控制器的单片8位微控制器—P8XC591》 周立功单片机网站
《P8XC591微控制器在CAN中的应用》 周立功单片机网站
《MAX232芯片介绍》《串行通信接口电路》天极网网站
(责任编辑:admin)
顶一下
(2)
66.7%
踩一下
(1)
33.3%
------分隔线----------------------------
特别说明

暂无

◎ 广告赞助

◎最新评论
      谈谈您对该文章的看
      表  情:
      评论内容:
      * 请注意用语文明且合法,谢谢合作 审核后才会显示! Ctrl+回车 可以直接发表

      ◎ 版权说明COPY RIGHT

      ☉任何个人及媒体在转载或引用本站文章作品时请遵守以下版权要求:
      ☉未经本站和原作者同意,不得擅自将转载本站的文章做任何修改。
      ☉转载务必注明本站网址 (http://www.jyjzzs.com),或所转文章在本站的文章网址。
      ☉转载或引用本站的文章作品时,须同时注明原作者姓名。
      ☉本站的文章若附有单独的版权声明,则除上述各条外,还须遵守文章所附的版权声明
      ☉(两者矛盾的部分以文章所附的版权声明为准)。
      ☉本站最终解释权归《教育界》杂志官方所有。