新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 淺談遠(yuǎn)程診斷技術(shù)在電控發(fā)動機方面的應(yīng)用

        淺談遠(yuǎn)程診斷技術(shù)在電控發(fā)動機方面的應(yīng)用

        作者: 時間:2016-12-20 來源:網(wǎng)絡(luò) 收藏

        int pascal far listen( socket s, int backlog );

        參 數(shù): s:需要建立監(jiān)聽的socket;

        backlog:最大連接個數(shù);

        服務(wù)器端的socket調(diào)用完listen()后,如果此時客戶端調(diào)用connect()函數(shù)提出連接申請的話,server 端必須再調(diào)用accept() 函數(shù),這樣服務(wù)器端和客戶端才算正式完成通信程序的連接動作。為了知道什么時候客戶端提出連接要求,從而服務(wù)器端的socket在恰當(dāng)?shù)臅r候調(diào)用accept()函數(shù)完成連接的建立,我們就要使用wsaasyncse-lect()函數(shù),讓系統(tǒng)主動來通知我們有客戶端提出連接請求了。該函數(shù)調(diào)用成功返回0,否則返回socket_error。

        int pascal far wsaasyncse-lect( socket s, hwnd hwnd,unsigned int wmsg, long levent );

        參數(shù): s:socket 對象;

        hwnd :接收消息的窗口句柄;

        wmsg:傳給窗口的消息;

        levent:被注冊的網(wǎng)絡(luò)事件,也即是應(yīng)用程序向窗口發(fā)送消息的網(wǎng)路事件,該值為下列值fd_read、fd_write、fd_oob、fd_accept、fd_connect、fd_close的組合,各個值的具體含意為fd_read:希望在套接字s收到數(shù)據(jù)時收到消息;fd_write:希望在套接字s上可以發(fā)送數(shù)據(jù)時收到消息;fd_accept:希望在套接字s上收到連接請求時收到消息;fd_connect:希望在套接字s上連接成功時收到消息;fd_close:希望在套接字s上連接關(guān)閉時收到消息;fd_oob:希望在套接字s上收到帶外數(shù)據(jù)時收到消息。

        具體應(yīng)用時,wmsg應(yīng)是在應(yīng)用程序中定義的消息名稱,而消息結(jié)構(gòu)中的lparam則為以上各種網(wǎng)絡(luò)事件名稱。所以,可以在窗口處理自定義消息函數(shù)中使用以下結(jié)構(gòu)來響應(yīng)socket的不同事件:  

        switch(lparam) 
        {
        case fd_read:
             …  
          break;
        case fd_write、
            …
          break;
            …
        }

        電控單元(ECU)的通信協(xié)議主要就封裝在該消息響應(yīng)函數(shù)當(dāng)中。

        (5)服務(wù)器端接受客戶端的連接請求

        當(dāng)client提出連接請求時,server 端hwnd視窗會收到winsock stack送來我們自定義的一個消息,這時,我們可以分析lparam,然后調(diào)用相關(guān)的函數(shù)來處理此事件。為了使服務(wù)器端接受客戶端的連接請求,就要使用accept() 函數(shù),該函數(shù)新建一socket與客戶端的socket相通,原先監(jiān)聽之socket繼續(xù)進入監(jiān)聽狀態(tài),等待他人的連接要求。該函數(shù)調(diào)用成功返回一個新產(chǎn)生的socket對象,否則返回invalid_socket。

        socket pascal far accept( scoket s, struct sockaddr far *addr,int far *addrlen );
        參數(shù):s:socket的識別碼;
        addr:存放來連接的客戶端的地址;
        addrlen:addr的長度

        (6)結(jié)束 socket 連接

        結(jié)束服務(wù)器和客戶端的通信連接是很簡單的,這一過程可以由服務(wù)器或客戶機的任一端啟動,只要調(diào)用closesocket()就可以了,而要關(guān)閉server端監(jiān)聽狀態(tài)的socket,同樣也是利用此函數(shù)。另外,與程序啟動時調(diào)用wsastartup()憨數(shù)相對應(yīng),程式結(jié)束前,需要調(diào)用 wsacleanup() 來通知winsock stack釋放socket所占用的資源。這兩個函數(shù)都是調(diào)用成功返回0,否則返回socket_error。

        int pascal far closesocket( socket s );
        參 數(shù):s:socket 的識別碼;
        int pascal far wsacleanup( void );
        參 數(shù): 無

        3.系統(tǒng)實現(xiàn)與應(yīng)用

        遠(yuǎn)程故障診斷系統(tǒng)要完成數(shù)據(jù)的傳輸需要建立一套完整的數(shù)據(jù)傳輸系統(tǒng)。系統(tǒng)中包括:DTU,電控單元(ECU)、移動網(wǎng)絡(luò)、后臺中心。

        3.1網(wǎng)絡(luò)拓?fù)鋱D:

        圖2 網(wǎng)絡(luò)結(jié)構(gòu)

        3.2系統(tǒng)實現(xiàn)方式

        (1)終端設(shè)備,GPRS模塊(DTU)

        首先通過AT命令對GPRS模塊進行設(shè)置,設(shè)置要連接的中心IP和端口及其它必要性的設(shè)置,設(shè)置好之后電控單元(ECU)通過RS232接口和GPRS模塊相連,GPRS模塊上電之后根據(jù)事先設(shè)置好的中心IP和端口進行連接,成功連接到服務(wù)中心后即可雙向傳輸數(shù)據(jù)。即可實現(xiàn)在線遠(yuǎn)程監(jiān)控電控單元(ECU)狀態(tài)與下載電控單元(ECU)程序。



        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 宁波市| 宁明县| 交城县| 常熟市| 阿尔山市| 文化| 杭锦旗| 农安县| 弥勒县| 葵青区| 张家口市| 华蓥市| 石嘴山市| 宕昌县| 肃南| 佛教| 宜宾市| 广昌县| 翁源县| 桐乡市| 廊坊市| 乐东| 阳东县| 嫩江县| 元阳县| 仁寿县| 淄博市| 前郭尔| 萍乡市| 盈江县| 海门市| 马尔康县| 原平市| 钦州市| 延边| 军事| 安泽县| 无极县| 和林格尔县| 保山市| 高台县|