全天五分彩计划网址欢迎您的到來!

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)就是在這種背景下產生的。
 在最近幾年來,現場總線的快速發展以及其技術的日益成熟使其成為國際自動控制領域關注的焦點?刂破骶植烤W(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?梢詫Σ杉降臄祿M行快速保存。
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編程?萍即髮W出版社。第4章
康博創作室。 Visual C++ 6.0程序設計自學教程 。清華大學出版社  。
《帶CAN控制器的單片8位微控制器—P8XC591》 周立功單片機網站
《P8XC591微控制器在CAN中的應用》 周立功單片機網站
《MAX232芯片介紹》《串行通信接口電路》天極網網站
(責任編輯:admin)
頂一下
(2)
66.7%
踩一下
(1)
33.3%
------分隔線----------------------------
特別說明

暫無

◎ 廣告贊助

◎最新評論
      談談您對該文章的看
      表  情:
      評論內容:
      * 請注意用語文明且合法,謝謝合作 審核后才會顯示! Ctrl+回車 可以直接發表

      ◎ 版權說明COPY RIGHT

      ☉任何個人及媒體在轉載或引用本站文章作品時請遵守以下版權要求:
      ☉未經本站和原作者同意,不得擅自將轉載本站的文章做任何修改。
      ☉轉載務必注明本站網址 (http://www.qggyq.site),或所轉文章在本站的文章網址。
      ☉轉載或引用本站的文章作品時,須同時注明原作者姓名。
      ☉本站的文章若附有單獨的版權聲明,則除上述各條外,還須遵守文章所附的版權聲明
      ☉(兩者矛盾的部分以文章所附的版權聲明為準)。
      ☉本站最終解釋權歸《教育界》雜志官方所有。

      全天五分彩计划网址 新浪分分彩计划 5分快3计划开奖网 腾讯分分彩单双计划 重庆欢乐生肖官网