<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    "新捷達"型汽車組合儀表的串行通訊的實現

    發布時間:2010-7-1 14:39    發布者:vinda
    關鍵詞: 串行通訊 , 新捷達 , 組合儀表
    1 引 言

    在開發汽車儀表檢測設備的過程中,非常重要的工作就是實現工控機與汽車儀表的串行通訊。通過串行通訊可以實現對儀表軟、硬件版本的檢測、儀表里程清零及儀表調校等一系列儀表出廠前重要的檢測項目及參數設定。對應于"新捷達"型汽車組合儀表(西門子VDO公司產品),為實現技術安全性,故其串行口采用非標準串行通訊協議,是用一般的串口通訊控件所難以實現的,必須由熟悉儀表軟件結構的人員從底層編寫通訊程序。

    本文采用C++Builder開發平臺,在Windows 98操作系統下,成功實現了與"新捷達"型汽車組合儀表的通訊,并具有美觀簡潔的用戶操作界面。

    2 New Jetta型儀表串行通訊要求簡述

    2.1 硬件連接

    文中工控機與儀表的硬件連接是從儀表的K-line經過電平轉換器連接工控機的RS-232串行口,采用半雙工串行異步通訊方式。如圖1所示。


    2.2 軟件規范

    軟件規范關于串口數據通訊協議中包括了通信握手、多重校驗、出錯重發、超時處理等。

    2.2.1 通訊初始化

    當儀表點火信號端起動約2s后可以建立通訊響應。首先以5b通訊速率發送信息,該信息包含1個起始位,7個數據位,1個奇偶校驗位和1個停止位(向儀表發送* * H)。

    儀表收到該信息后大約要等待一個約5 ms的循環時間,然后通訊模塊起動。從此時起所有的通訊字節將以10 400b/s的波特率來收發(此波特率為非標準波特率)。

    經過100ms儀表送出同步字節(1個起始位,8個數據位,1個停止位,為* * H),再經過loms儀表送出密碼的低字節,10ms后儀表送出密碼的高字節(1個起始位,7個數據位,1個奇偶校驗位,1個停止位,密碼值為* * * *H)。

    此后,儀表等待工控機送回倒序的密碼高字節。這種回送方式是本串行通訊的防錯處理機制。如果此字節儀表沒有接收到,那么儀表將再次發送同步字節和密碼字節。

    當儀表接收到回送字節后,標準模塊通訊以10 400b/s的波特率起動(每字節包含1個起始位,8個數據位,1個停止位)。此時,儀表開始發送儀表ID模塊,為4個模塊,分別包括16,16,15,9個字節。在這4個模塊的發送過程中,儀表與工控機之間又有很多的信息應答要求,如有差錯則通訊中止。

    2.2.2 正常通訊過程

    經過通訊初始化后,正常通訊以10 400b/s的波特率開始建立,此時工控機可以發送命令字節流給儀表,來實現對儀表的控制及參數設置。每隔特定的時間間隔,儀表與工控機間仍須互送握手信號,否則通訊中止。

    3 軟件程序設計

    本通訊方式屬于零Modem串行異步通訊。在異步通訊中,字符格式和波特率是2個重要指標。本文中通訊過程既有波特率的變化,也有幀格式的變化,對通訊的響應時間也有嚴格要求。

    在C++Builder可視化編程格式下不再支持直接對寄存器操作的函數,故首先用嵌入匯編的辦法實現Inporb和Outporb函數。本通訊的數據流是以字節為發送單位的,故編寫字節收發函數,為查詢方式,如清單1所示:

    清單1:

    byte TForml∷bytReceiveByte(void)
    {

    byte bytTemp; //Dim bytTemp As Byte

    int intTemp; //Dim intTemp As Integer

    byte bytResult;

    bytTemp=InportB(intLSR);//intLSR=0x3fd

    intTemp=0;

    blnBeyond WaitTime=False;
    while((bytTemp&0x1)!=0x1)

    {

    bytTemp=InportB(intLSR);

    intTemp=intTemp+1;

    S1eep(1);
    //檢查接收的數據是否準備好,為1表示接收移位寄存器已收到一個完整的數據,并送到接收緩沖器中

    if(intTemp>intWaitTime)

    {Error();}
    }
    if(!blnBeyondWaitTime)

    bytResult=InportB(intDRR);//intDRR=0x3f8

    return bytResult;
    }
    VOld TForml∷subSendByte(byte bytSend)
    {
    byte bytTemp;

    bytTemp=InportB(intLSR);

    //檢查發送緩沖器是否為空,1為空

    while((bytTemp&0x20)!=0x20)

    bytTemp=InportB(intLSR);

    OutportB(0x3F8,bytSend); //發送緩沖器為空

    bytTemp=InportB(intLSR);
    //檢查發送移位寄存器是否為空,即發送緩沖器的數據是否送完

    while((bytTemp&0x40)!=0x40)

    bytTemp=InportB(intLSR);

    bytTemp=InportB(intLSR);

    //檢查接收的數據是否準備好,為1表示接收移位寄存器已收到一個完整的數據,并送到接收緩沖器中

    while((bytTemp & 0x1)!=0x1)

    bytTemp=InportB(intLSR);

    bytTemp=InportB(intDRR);

    //清空接收緩沖區中的發送數據
    }

    在此基礎上建立本通訊初始化的主函數,如清單2所示:
    清單2:
    void TForml∷InitRS232(void)
    {

    String strTemp;//Dim strTemp As String

    byte bytTemp; //Dim bytTemp As Byte

    int intTemp; //Dim intTemp As Integer

    int i; //Dim I As Integer

    //Stepl:

    OutportB (intLCR,0x80);

    //輸出控制字,下面輸出波特串

    OutportB(intLSB,0x0); //低位
    OutportB(intMSB,0x5A); //高位
    OutportB(intLCR,0xA);
    //5 bit,l起始位,1奇偶位和1停止位

    OutportB(intIER,0); //抑制中斷

    strTemp="";

    subSendByte (0x * *) //發送建立通訊密碼

    //Step2:

    OutportB(intLCR,0x80);
    //輸出控制字,下面輸出波特率

    OutportB(intLSB,0xB);

    OutportB(intMSB,0x0);

    OutportB(intLCR,0x3);//10400,8,N

    strTemp=strTemp+""+IntToHex(bytReceiveByte(),2);

    //Step3:

    Receive the Low byte Of Key Word

    strTemp=strTemp+""+IntToHex(bytReceiveByte(),2);

    //Step4:

    Receive the High byte Of Key Word

    bytTemp=bytReceiveByte();

    strTemp=strTemp+""+IntToHex(bytTemp,2);

    //Step5:
    下面PC送高位字節的取反

    if(! blnBeyondWaitTime)

    subSendByte(byte(~bytTemp)); //byte
    else

    {Error();}

    //Step 6 Receive the block data
    if (! blnReceiveIDBlock(16)) //接收第1個ID塊,為16B

    {Error();}
    if (! blnReceiveIDBlock(16)) //接收第2個ID塊,為16B

    {Error();}
    if (! blnReceiveIDBlock(15)) //接收第3個ID塊,為15B

    {Error();}
    if (! blnReceiveIDBlock(9)) //接收第4個ID塊,為9B

    {Error();}

    //Cluster)> >;PC

    subReceiveTheFifthBlock();

    String ResOfFT=strTestDataStream(strEnableFT);

    //儀表Epprom可讀寫命令

    if(ResOfFT==EmptyStr)

    {Error();}

    blnInitRS232=True;

    4 結 語

    本文采用C++Builder軟件平臺成功開發了儀表特殊串行口通訊程序,該系統在西門子VDO(蕪湖)公司生產線投入使用一年多,與采用快速通訊方式相比通訊傳輸性能穩定,并具有了方便美觀的用戶界面,為實現儀表檢測設備奠定了基礎,具有重要的應用價值。
    本文地址:http://www.portaltwn.com/thread-14269-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區
    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷