• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      車機(jī)控制長連接數(shù)據(jù)通信方法

      2022-10-29 04:51:12韋忠杰
      汽車與新動力 2022年5期
      關(guān)鍵詞:發(fā)送數(shù)據(jù)鏈表服務(wù)端

      韋忠杰

      (柳州市華創(chuàng)汽車設(shè)計(jì)有限公司,廣西 柳州 545616)

      0 前言

      車機(jī)端的開發(fā)主要分為主處理器(SOC)與微控制器(MCU)的開發(fā),其中SOC負(fù)責(zé)人機(jī)交互及相關(guān)功能實(shí)現(xiàn)(基于Android系統(tǒng)、Linux系統(tǒng)、WinCE等系統(tǒng)),MCU主要負(fù)責(zé)車機(jī)電源管理與整車控制器域網(wǎng)(CAN)數(shù)據(jù)收發(fā)。MCU為SOC提供車輛信息,SOC對車輛信息處理后提供服務(wù),二者間正常通信是提供服務(wù)的基礎(chǔ),CAN數(shù)據(jù)與整車電源變動的信息是被動獲取的,因此二者間的通信連接需要處于長連接狀態(tài),以保證數(shù)據(jù)的及時(shí)響應(yīng)與處理。

      車機(jī)SOC與MCU一般通過通用異步收發(fā)傳輸器(UART)/串行外設(shè)接口(SPI)進(jìn)行長連接數(shù)據(jù)傳輸,在此過程中數(shù)據(jù)處理不完善、通信中出現(xiàn)異常、不能及時(shí)處理等問題均會導(dǎo)致車機(jī)功能異常,因此良好的通信處理流程和通信鏈路狀態(tài)的檢測及恢復(fù)是非常重要的。

      1 長連接通信

      長連接通信需要對端與端的連接進(jìn)行維護(hù),同時(shí)增加連接的?;顧C(jī)制及異常檢測與處理。以UART為例進(jìn)行長連接通信的數(shù)據(jù)傳輸作為研究對象進(jìn)行解析。

      在SOC與MCU的長連接過程中,存在SOC向MCU主動發(fā)送請求的情況,也存在MCU主動向SOC發(fā)送信息的情況,雙方都需要進(jìn)入通信收發(fā)準(zhǔn)備,并進(jìn)行通信收發(fā)處理及通信狀態(tài)同步。

      1.1 通信準(zhǔn)備

      在SOC與MCU的長連接過程中,通信準(zhǔn)備需要雙方都打開通信接口,共同完成通信參數(shù)設(shè)置。如果二者通過UART進(jìn)行通信,則雙方需要進(jìn)行以下操作:① 打開指定UART端口;② 設(shè)置波特率(需要雙方設(shè)置相同參數(shù));③ 設(shè)置數(shù)據(jù)位(需要雙方設(shè)置相同參數(shù),一般設(shè)為8 bit);④ 設(shè)置停止位(需要雙方設(shè)置相同參數(shù));⑤ 設(shè)置奇偶校驗(yàn)位(需要雙方設(shè)置相同參數(shù))。

      通信參數(shù)設(shè)置完畢后,即可進(jìn)行數(shù)據(jù)通信。通信流程主要分為數(shù)據(jù)發(fā)送與數(shù)據(jù)接收,其中數(shù)據(jù)發(fā)送是主動觸發(fā)的,數(shù)據(jù)接收是被動獲取的,需要分開進(jìn)行處理。數(shù)據(jù)發(fā)送與數(shù)據(jù)接收流程如圖1所示。

      圖1 數(shù)據(jù)發(fā)送與數(shù)據(jù)接收流程

      1.2 通信收發(fā)處理

      由于頻繁的通信交互會產(chǎn)生大量數(shù)據(jù),需要防止通信過程中數(shù)據(jù)遺漏或被覆蓋,因此數(shù)據(jù)收發(fā)后需要及時(shí)處理,數(shù)據(jù)發(fā)送完成后再進(jìn)行刪除。

      通信數(shù)據(jù)的發(fā)送與接收處理流程如圖2所示。

      圖2 數(shù)據(jù)發(fā)送與接收處理流程

      通信數(shù)據(jù)的接收處理考慮到數(shù)據(jù)完整性及主線程響應(yīng)慢的情況,主要分為以下2個(gè)步驟:① 將收到的數(shù)據(jù)拷貝到特定數(shù)組中,并與數(shù)組中已有數(shù)據(jù)進(jìn)行拼接,拼成完整的數(shù)據(jù)幀供后續(xù)處理。由于同一時(shí)間發(fā)送數(shù)據(jù)較多,所以可能會出現(xiàn)數(shù)據(jù)分開多次發(fā)送的情況。② 特定線程對數(shù)組中的數(shù)據(jù)進(jìn)行數(shù)據(jù)幀解析,從數(shù)據(jù)幀解析出有效數(shù)據(jù),并將有效數(shù)據(jù)發(fā)給主線程進(jìn)行處理,同時(shí)從數(shù)組中刪除相應(yīng)的幀數(shù)據(jù)。由于數(shù)據(jù)解析處理耗時(shí),因此需要放到其他線程處理,防止主線程阻塞響應(yīng)慢的情況。

      通信數(shù)據(jù)的發(fā)送處理分為數(shù)據(jù)打包與數(shù)據(jù)發(fā)送,主要分為以下2個(gè)步驟:① 根據(jù)收到的信息將要發(fā)送的數(shù)據(jù)進(jìn)行打包,并將打包好的數(shù)據(jù)幀放入信息鏈表中,防止數(shù)據(jù)遺漏發(fā)送或數(shù)據(jù)覆蓋情況;② 特定線程對信息鏈表進(jìn)行檢測,檢測到有信息時(shí),則從信息鏈表中獲取數(shù)據(jù)幀進(jìn)行發(fā)送,發(fā)送完后將對應(yīng)的數(shù)據(jù)幀從信息鏈表中刪除。因信息鏈表循環(huán)檢測與數(shù)據(jù)的發(fā)送比較耗時(shí),為防止主線程阻塞響應(yīng)慢的情況,需要放到其他線程中進(jìn)行處理。

      1.3 通信狀態(tài)同步

      在進(jìn)行數(shù)據(jù)通信前,需要做好通信準(zhǔn)備并同步連接狀態(tài)后,才能進(jìn)行有效的數(shù)據(jù)傳輸。如果SOC在啟動過程中存在電壓不穩(wěn)的情況,可能會出現(xiàn)干擾數(shù)據(jù)通過鏈路傳輸給MCU端,如果不進(jìn)行狀態(tài)同步,則可能會導(dǎo)致異常情況出現(xiàn)。

      SOC與MCU間的關(guān)系類似于網(wǎng)絡(luò)通信中的客戶端與服務(wù)端。MCU作為服務(wù)端需要確認(rèn)與客戶端的連接情況,決定是否向客戶端發(fā)送數(shù)據(jù)及響應(yīng)客戶端發(fā)送的數(shù)據(jù);SOC作為客戶端,與服務(wù)端進(jìn)行正式的數(shù)據(jù)通信前,需要先發(fā)送一串連接數(shù)據(jù)幀,告知服務(wù)端通信已準(zhǔn)備好并進(jìn)行連接,服務(wù)端收到數(shù)據(jù)并解析出連接數(shù)據(jù)幀后,反饋給客戶端,可以開始進(jìn)行數(shù)據(jù)通信。通信狀態(tài)同步流程如圖3所示。

      圖3 通信狀態(tài)同步流程

      由于SOC與MCU間一直處于連接通信狀態(tài),不需要同步斷開通信的情況,只有在機(jī)器休眠或關(guān)機(jī)的過程中才會斷開,休眠喚醒或重啟后MCU端會將連接狀態(tài)清除,并重新等待SOC的連接數(shù)據(jù)幀,SOC需要重新設(shè)置參數(shù),并發(fā)送數(shù)據(jù)連接幀進(jìn)行通信。

      2 長連接“心跳”機(jī)制

      在整個(gè)通信周期中,可能有較長一段時(shí)間雙方是沒有交互的,在這過程中可以通過“心跳”機(jī)制判斷通信鏈路狀態(tài)。

      “心跳”機(jī)制是指定時(shí)發(fā)送一個(gè)簡短的數(shù)據(jù)包,檢測連接是否正常??蛻舳藨?yīng)用層使用定時(shí)器,定時(shí)向服務(wù)端發(fā)送一個(gè)簡短的數(shù)據(jù)包,然后等待服務(wù)端回應(yīng),如果在一定時(shí)間內(nèi)沒有收到服務(wù)端回應(yīng),則認(rèn)為是連接異常;同時(shí),服務(wù)端在已連接的情況下,收到客戶端的“心跳”數(shù)據(jù)包后,及時(shí)應(yīng)答對應(yīng)數(shù)據(jù)包,如果固定時(shí)間內(nèi)未收到“心跳”數(shù)據(jù)包,則認(rèn)為連接異常。

      如果服務(wù)端和客戶端有頻繁的數(shù)據(jù)通信往來,這些數(shù)據(jù)包本身就可以用于檢測連接情況,無須一直定時(shí)發(fā)送“心跳”數(shù)據(jù)包來增大通信數(shù)據(jù)量,因此可以將“心跳”數(shù)據(jù)包與正常數(shù)據(jù)包結(jié)合起來使用。優(yōu)化后的“心跳”機(jī)制流程如圖4所示。① 客戶端設(shè)置一個(gè)定時(shí)器,用于定時(shí)發(fā)送“心跳”數(shù)據(jù)包;② 客戶端需要判斷信息鏈表中待發(fā)送的數(shù)據(jù)幀是否發(fā)送完畢歸零,發(fā)送完畢后則將計(jì)時(shí)器歸零后并啟動定時(shí)器開始計(jì)時(shí);③ 客戶端如果在定時(shí)器運(yùn)行計(jì)時(shí)過程中有新的數(shù)據(jù)幀要發(fā)送,則將定時(shí)器暫停;④ 客戶端發(fā)送數(shù)據(jù)幀后,一定時(shí)間內(nèi)未收到服務(wù)端反饋的處理信息,計(jì)時(shí)時(shí)間到后則認(rèn)為通信鏈路異常;⑤ 服務(wù)端設(shè)置一個(gè)定時(shí)器,用于確認(rèn)通信鏈路狀況;⑥ 服務(wù)端每次接收到客戶端的數(shù)據(jù)幀后,則將定時(shí)器中的計(jì)時(shí)器重新歸零處理,且將每次處理的結(jié)果反饋給客戶端;⑦ 如果服務(wù)端一定時(shí)間內(nèi)未收到來自客戶端的信息,計(jì)時(shí)時(shí)間到后則認(rèn)為通信鏈路異常,并停止服務(wù),等待服務(wù)端重新連接。

      圖4 優(yōu)化后的長連接“心跳”機(jī)制

      3 長連接糾錯(cuò)與處理

      根據(jù)長連接通信的內(nèi)容已經(jīng)可以讓雙方進(jìn)行數(shù)據(jù)通信,并對數(shù)據(jù)的收發(fā)進(jìn)行處理,而長連接“心跳”機(jī)制則能更進(jìn)一步協(xié)助雙方進(jìn)行通信鏈路狀態(tài)的檢測,從而及時(shí)發(fā)現(xiàn)通信鏈路異常并進(jìn)行簡單的斷開處理。

      但僅靠檢測到異常就進(jìn)行斷開處理并不是最佳處理方法。需要對通信鏈路嘗試修復(fù),從而繼續(xù)提供服務(wù),且在異常出現(xiàn)時(shí),將發(fā)送的數(shù)據(jù)進(jìn)行保存,然后進(jìn)行重發(fā),即要求具有數(shù)據(jù)重發(fā)機(jī)制,防止重要數(shù)據(jù)的遺漏。因此,在上述的長連接通信與“心跳”機(jī)制上增加通信重連功能與數(shù)據(jù)重發(fā)機(jī)制,可讓長連接通信更加可靠。

      3.1 通信重連功能

      通信重連就是將原有的鏈路端口關(guān)閉后重新打開,設(shè)置初始參數(shù)后,重新進(jìn)行狀態(tài)的同步操作。在長連接通信過程中可能會出現(xiàn)異常且不可逆轉(zhuǎn)的情況,需要通過通信重連功能恢復(fù)通信,一般發(fā)生以下情況時(shí)需要通信重連:① 硬件設(shè)計(jì)缺陷導(dǎo)致偶發(fā)的電磁干擾,電磁干擾可能導(dǎo)致正在傳輸?shù)臄?shù)據(jù)遺失或?qū)е骆溌樊惓#绻挥绊懸凰查g則可以通過數(shù)據(jù)重發(fā)機(jī)制解決,否則需要通過通信重連進(jìn)行處理;② 通信客戶端軟件異常,例如數(shù)據(jù)能發(fā)送成功但接收不到服務(wù)端反饋的數(shù)據(jù),一定時(shí)間后則需要重連來恢復(fù)通信狀態(tài),并重新向服務(wù)端發(fā)送數(shù)據(jù);如果進(jìn)程異常,則需要重啟進(jìn)程后再重連,這種情況下會導(dǎo)致短時(shí)間內(nèi)的通信斷開,存在數(shù)據(jù)丟失的情況;③ 通信服務(wù)端軟件異常,如果能收到數(shù)據(jù)但不能發(fā)送數(shù)據(jù),需要服務(wù)端處理異常后重連恢復(fù)通信狀態(tài),然后向客戶端回饋數(shù)據(jù)。

      3.2 數(shù)據(jù)重發(fā)機(jī)制

      長連接過程中出現(xiàn)異常,一般處理后都需要通過數(shù)據(jù)重發(fā)機(jī)制來維持之前通信狀態(tài),確保數(shù)據(jù)完整性并進(jìn)行響應(yīng)。數(shù)據(jù)重發(fā)機(jī)制主要由2個(gè)部分組成,即發(fā)送數(shù)據(jù)幀的保存與刪除,重發(fā)次數(shù)及時(shí)間間隔。

      可對“從信息鏈表中獲取數(shù)據(jù)幀發(fā)送給遠(yuǎn)端后立即刪除數(shù)據(jù)幀”的流程進(jìn)行修改,改為“從信息鏈表中獲取數(shù)據(jù)幀發(fā)送給遠(yuǎn)端,待收到遠(yuǎn)端的相應(yīng)反饋后,再從信息鏈表中刪除相應(yīng)的數(shù)據(jù)幀”。

      重發(fā)次數(shù)可根據(jù)具體功能要求而定,一般設(shè)置3次,如果發(fā)送3次都未收到反饋,則基本可以認(rèn)為通信連接異常。關(guān)閉通信連接并重新設(shè)置連接通信,發(fā)送次數(shù)重新統(tǒng)計(jì)。時(shí)間間隔可設(shè)為固定,也可將重發(fā)時(shí)間間隔逐漸加大,如設(shè)置為200 ms、400 ms、800 ms。

      4 長連接整體流程

      整個(gè)長連接通信的實(shí)現(xiàn)按軟件功能可分為數(shù)據(jù)發(fā)送、數(shù)據(jù)接收、通信狀態(tài)檢測和異常處理4個(gè)部分。由于客戶端與服務(wù)端框架大致相同,再次對客戶端通信流程進(jìn)行分析,如圖5所示。由圖5可知該框架流程的軟件實(shí)現(xiàn)涉及到數(shù)組、鏈表、線程、線程同步與定時(shí)器的使用。各功能大體流程如下:

      圖5 客戶端通信流程

      (1) 主線程。接收應(yīng)用數(shù)據(jù)后將數(shù)據(jù)打包放入待發(fā)送鏈表中,同步通知數(shù)據(jù)發(fā)送線程;監(jiān)聽接收到服務(wù)端數(shù)據(jù),將數(shù)據(jù)放入數(shù)組中進(jìn)行拼接,然后同步通知數(shù)據(jù)接收處理線程。

      (2) 數(shù)據(jù)發(fā)送。線程中判斷發(fā)送鏈表是否有數(shù)據(jù),如果發(fā)送鏈表有數(shù)據(jù),則獲取數(shù)據(jù)進(jìn)行發(fā)送,取消定時(shí)“心跳”機(jī)制,并啟動服務(wù)端返回狀態(tài)檢測機(jī)制,如果一定時(shí)間未檢測到數(shù)據(jù)返回,則進(jìn)入數(shù)據(jù)重發(fā);如果發(fā)送鏈表無數(shù)據(jù),則啟動定時(shí)器進(jìn)入“心跳”模式,定時(shí)發(fā)送數(shù)據(jù)。

      (3) 數(shù)據(jù)接收處理。線程從數(shù)組中解析出數(shù)據(jù)幀,進(jìn)行數(shù)據(jù)解析后,刪除數(shù)組中獲取的數(shù)據(jù)幀并刪除發(fā)送鏈表中的數(shù)據(jù),通知發(fā)送線程繼續(xù)進(jìn)行下一幀數(shù)據(jù)的發(fā)送。

      (4) 通信狀態(tài)檢測。數(shù)據(jù)發(fā)送線程發(fā)送數(shù)據(jù)后,啟動定時(shí)器確認(rèn)一段時(shí)間內(nèi)是否有數(shù)據(jù)反饋。如果數(shù)據(jù)接收處理線程中檢測到有對應(yīng)數(shù)據(jù)返回,則同步取消定時(shí)器;如果沒有對應(yīng)數(shù)據(jù)返回,則認(rèn)為通信異常。

      (5) 異常處理。一定時(shí)間內(nèi)接收不到返回?cái)?shù)據(jù),則觸發(fā)重發(fā)機(jī)制,如果重發(fā)3次都不能接收到數(shù)據(jù),則認(rèn)為通信異常不可恢復(fù),需要重新進(jìn)行通信設(shè)置連接。

      5 結(jié)語

      本文提供了一種車機(jī)內(nèi)部SOC與MCU的長連接通信軟件的實(shí)現(xiàn)方式,在滿足基本通信功能的基礎(chǔ)上,根據(jù)長連接特性增加了通信狀態(tài)檢測、數(shù)據(jù)重發(fā)、通信重連及“心跳”機(jī)制,盡可能地保證長連接通信的有效性。

      猜你喜歡
      發(fā)送數(shù)據(jù)鏈表服務(wù)端
      移動自組網(wǎng)中MAC層協(xié)議研究
      基于二進(jìn)制鏈表的粗糙集屬性約簡
      跟麥咭學(xué)編程
      基于馬爾科夫鏈的LoRaWAN網(wǎng)絡(luò)節(jié)點(diǎn)性能分析
      帶標(biāo)記方式的CRDSA++協(xié)議性能分析*
      云存儲中基于相似性的客戶-服務(wù)端雙端數(shù)據(jù)去重方法
      基于鏈表多分支路徑樹的云存儲數(shù)據(jù)完整性驗(yàn)證機(jī)制
      新時(shí)期《移動Web服務(wù)端開發(fā)》課程教學(xué)改革的研究
      在Windows Server 2008上創(chuàng)建應(yīng)用
      使用IPSec安全傳輸數(shù)據(jù)
      巩留县| 绍兴县| 洪江市| 应城市| 嘉定区| 阜宁县| 应城市| 太原市| 灌南县| 密山市| 巴楚县| 西盟| 海盐县| 祁东县| 内丘县| 浦城县| 镇宁| 象山县| 石棉县| 夹江县| 九龙县| 张家港市| 临城县| 都江堰市| 富平县| 淮北市| 望城县| 新田县| 定日县| 南通市| 苏尼特左旗| 盐津县| 婺源县| 永靖县| 洪雅县| 合水县| 盐山县| 颍上县| 民权县| 云霄县| 潼关县|