国产精品无码无卡无需播放器,日韩AV无码午夜免费福利制服,世界上面积最大的国家,黑森林福利视频导航

談HID的開關(guān)控制系統(tǒng)設(shè)計(jì)

前言:尋找寫作靈感?中文期刊網(wǎng)用心挑選的談HID的開關(guān)控制系統(tǒng)設(shè)計(jì),希望能為您的閱讀和創(chuàng)作帶來靈感,歡迎大家閱讀并分享。

談HID的開關(guān)控制系統(tǒng)設(shè)計(jì)

【摘要】信號(hào)源系統(tǒng)在廣播電視發(fā)射系統(tǒng)中十分重要,為保證安全播出,應(yīng)向自動(dòng)化無人臺(tái)站方向改進(jìn)提升。本文著重研究通過hid控制開關(guān)控制信號(hào)源設(shè)備,從反匯編入手,學(xué)習(xí)現(xiàn)有的上位機(jī)軟件,研讀HID協(xié)議再進(jìn)行上位機(jī)、固件開發(fā)。實(shí)踐中,可通過讀取臺(tái)站主控電腦數(shù)據(jù)庫數(shù)據(jù),判斷信號(hào)源設(shè)備狀態(tài),實(shí)現(xiàn)自動(dòng)控制。

【關(guān)鍵詞】c/c++;反匯編;HID協(xié)議;SQL;74HC595

一、概述

廣播電視發(fā)射系統(tǒng)中信號(hào)源子系統(tǒng)設(shè)備繁多,有衛(wèi)星信號(hào)接收機(jī)、光纖信號(hào)解碼器、信號(hào)源切換器等重要設(shè)備。若這些設(shè)備發(fā)生故障,很可能致使廣播電視節(jié)目信號(hào)中斷,導(dǎo)致頻點(diǎn)靜音靜幀等現(xiàn)象,造成停播事故。臺(tái)站原有的電源復(fù)位器功能單一,自動(dòng)化程度低,通道數(shù)量少,很多設(shè)備電源接入到同一通道上。若某個(gè)設(shè)備故障需要復(fù)位重啟,對(duì)該設(shè)備接入的通道復(fù)位時(shí),整個(gè)通道的設(shè)備都會(huì)被復(fù)位重啟,這樣就有可能導(dǎo)致其他設(shè)備工作異常,造成停播現(xiàn)象。因此,可以采用一個(gè)新的解決方案,即采用USB-HID控制信號(hào)源系統(tǒng)設(shè)備電源。USB-HID是基于USB通信的,與電源復(fù)位器通信方式不同,后者采用網(wǎng)絡(luò)通信,兩者互不影響,因此還可以串聯(lián)組合運(yùn)行。USB-HID是UniversalSerialBus-HumanInterfaceDevice的縮寫,HID設(shè)備通常是鼠標(biāo)、鍵盤、游戲手柄等,不過HID設(shè)備并不一定要有人機(jī)接口,只要符合HID類別規(guī)范的設(shè)備都是HID設(shè)備。HID通信相對(duì)簡(jiǎn)單,響應(yīng)快,所以比較適合用作控制設(shè)備。交換的數(shù)據(jù)需要存儲(chǔ)在稱為報(bào)表(report)的結(jié)構(gòu)內(nèi),設(shè)備固件必須支持HID報(bào)表格式。相對(duì)其他USB設(shè)備,HID主要由控制傳輸和中斷傳輸來傳送與接收數(shù)據(jù)。報(bào)表的格式非常有彈性,可以處理任何類別的數(shù)據(jù)。HID類別設(shè)備的規(guī)范是DeviceClassDefinitionforHumanInterfaceDe-vices①。另外還有一份文件HIDUsageTables②,用來定義讓主機(jī)了解以及使用HID數(shù)據(jù)的數(shù)值。

二、HID底層通信

現(xiàn)有資源為一塊HID繼電器控制板,配套資料是一份DLL及其頭文件,沒有源碼,根據(jù)現(xiàn)有資源進(jìn)行反匯編學(xué)習(xí)HID通信原理。使用OllyDbg對(duì)該DLL進(jìn)行調(diào)試。圖1是OllyDbg調(diào)試界面,區(qū)域1是反匯編指令窗口,第一列是地址欄,第二列是機(jī)器碼,第三列是匯編代碼,第四列是注釋,匯編指令眾多但是常用的很少,這點(diǎn)服從二八定律,少量的指令完成大部分功能。區(qū)域2是CPU寄存器窗口,最重要的是前面9個(gè)寄存器,這9個(gè)寄存器保存著當(dāng)前程序段的運(yùn)行參數(shù)、結(jié)果等重要信息,各個(gè)寄存器的說明詳見參考文獻(xiàn)③。區(qū)域3是數(shù)據(jù)窗口,在這里查看內(nèi)存數(shù)據(jù),常量數(shù)據(jù)一般都存放在此處,例如常用數(shù)值、字符串等。在區(qū)域1和2中,右鍵一個(gè)地址指針即可跟隨轉(zhuǎn)存到這里查看該地址的內(nèi)存數(shù)據(jù)。區(qū)域4是棧窗口,棧通常用于保存臨時(shí)變量,棧操作push是將目標(biāo)壓棧,pop將棧頂彈出到目標(biāo)。除了這兩個(gè)操作還有棧對(duì)齊,保證棧頂指針為某字節(jié)的整數(shù)倍;升棧,分配局部變量空間;降棧,刪除棧部分?jǐn)?shù)據(jù)。根據(jù)頭文件分析DLL的導(dǎo)出函數(shù)及其傳入?yún)?shù)類型和返回參數(shù)類型。調(diào)試過程中DLL所用到的Win32Api會(huì)被OllyDbg標(biāo)示出來,可以從注釋中看到是什么Api,而所用到的HIDDLL的Api沒有標(biāo)記,要手動(dòng)添加注釋信息。整個(gè)通信的建立過程都是基于Win32Api和HIDDLL的Api完成的。經(jīng)過耐心的跟蹤調(diào)試得到如圖2的通信流程圖。其中SetupDiGetDeviceInterfaceDetailA函數(shù)連續(xù)調(diào)用兩次,第一次獲得required_size參數(shù),第二次將re-quired_size傳入獲得設(shè)備詳細(xì)信息。CreateFile函數(shù)也是連續(xù)調(diào)用兩次,第一次ShareMode參數(shù)為空,如果是鼠標(biāo)、鍵盤等獨(dú)占設(shè)備是不能通過CreateFile打開的,將會(huì)在此返回失敗,相當(dāng)于在此過濾鼠標(biāo)、鍵盤等獨(dú)占設(shè)備;第二次ShareMode參數(shù)為3,函數(shù)成功返回HID設(shè)備句柄,設(shè)備句柄是與設(shè)備通信的唯一標(biāo)識(shí)。通信階段使用DeviceIoControl函數(shù)向HID設(shè)備發(fā)起查詢請(qǐng)求,獲得特征報(bào)告(FeatureReport),該設(shè)備自定義的序列號(hào)就在特征報(bào)告里面,繼電器狀態(tài)也包含在特征報(bào)告里。HidD_SetFeature函數(shù)用于發(fā)送特征報(bào)告,設(shè)置繼電器狀態(tài)。

三、固件

固件開發(fā)過程需要用到BusHound。BusHound是一個(gè)USB通用的強(qiáng)大的調(diào)試工具,類似于網(wǎng)絡(luò)抓包工具,用于抓取電腦總線數(shù)據(jù),還可以模擬發(fā)送請(qǐng)求數(shù)據(jù)。圖3是BusHound調(diào)試界面。21.0表示21號(hào)設(shè)備端點(diǎn)0,CTL表示主機(jī)發(fā)送控制請(qǐng)求,請(qǐng)求內(nèi)容為其后的Da-ta,GETDESCRIPTOR表示該請(qǐng)求為獲取描述符。IN表示設(shè)備發(fā)送數(shù)據(jù)到主機(jī)。圖中的數(shù)據(jù)是設(shè)備上電枚舉階段發(fā)生的數(shù)據(jù)交換。共四條GETDESCRIPTOR,第一條描述符為設(shè)備描述符,第二條獲取配置描述符長度,第三條根據(jù)長度再次請(qǐng)求配置描述符,第四條獲取報(bào)告描述符。設(shè)備描述符和配置描述符為USB通用,報(bào)告描述符為HID傳輸?shù)臄?shù)據(jù)用途(usage)上的說明。至此,獲得了HID固件關(guān)鍵的三個(gè)描述符。報(bào)告描述符的用法和修改參照HIDUsageTables。官網(wǎng)還有報(bào)告描述符工具提供使用。MCU采用stm32f407vet6,從stc官網(wǎng)獲取HID固件庫④。使用固件庫參照HID協(xié)議進(jìn)行修改調(diào)試。這里的主要問題是我們沿用舊設(shè)備的數(shù)據(jù)交換方式,即特征報(bào)告(FeatureReport),上位機(jī)發(fā)送請(qǐng)求特征報(bào)告失敗返回0xC0000004,查詢HID協(xié)議找到7.2Class-SpecificRe-quests(特殊請(qǐng)求),7.2.2Set_ReportRequest有說明“AdevicemightchoosetoignoreinputSet_Reportrequestsasmeaningless.”,由此得知固件默認(rèn)不處理特征報(bào)告。因此要添加對(duì)特征報(bào)告的處理,7.2Class-SpecificRequests查找發(fā)現(xiàn)7.2.4Set_IdleRequest這一請(qǐng)求是處理成功的。于是在固件庫找到Set_IdleRequest的處理,在其同級(jí)增加條件分支完成添加特征報(bào)告的處理,使用端點(diǎn)0收發(fā)特征報(bào)告數(shù)據(jù)。

四、數(shù)據(jù)庫

臺(tái)站主控電腦使用SQLServer處理數(shù)據(jù),各個(gè)設(shè)備狀態(tài)被相應(yīng)的上位機(jī)實(shí)時(shí)更新到數(shù)據(jù)庫,通過查詢數(shù)據(jù)庫獲取設(shè)備狀態(tài),相當(dāng)于借助數(shù)據(jù)庫與其他上位機(jī)進(jìn)行進(jìn)程間通信。為模擬相關(guān)環(huán)境在自己電腦上安裝SQLServer和SSMS。添加數(shù)據(jù)庫和數(shù)據(jù)表,添加數(shù)據(jù)元組示例。客戶端對(duì)數(shù)據(jù)庫的操作只有讀取,因此采用sqlcmd命令行獲取數(shù)據(jù)比較簡(jiǎn)便,使用popen函數(shù)執(zhí)行命令行獲取返回的數(shù)據(jù)。sqlcmd的使用比較簡(jiǎn)單,需要的參數(shù)有-S服務(wù)器、-U用戶名、-P密碼、-d使用數(shù)據(jù)庫名稱、-Q查詢命令(sql查詢語句)。圖4為在我的電腦的模擬環(huán)境中進(jìn)行查詢得到的結(jié)果。

五、端口拓展

為了獲得更多的控制通道,以及預(yù)留IO口做其他用途,使用74HC595進(jìn)行端口拓展。74HC595是8位串行輸入/輸出或者并行輸出移位寄存器,具有高阻、關(guān)、斷狀態(tài)。圖5是其真值表。通過將串行數(shù)據(jù)輸出管腳SQH級(jí)聯(lián)到下一個(gè)74HC595的SI輸入管腳達(dá)到加長拓展。OE拉低SCLR拉高,需要控制的有時(shí)鐘輸入SCK、鎖存信號(hào)RCK和數(shù)據(jù)源SI,只需要三個(gè)MCUIO口即可控制數(shù)位寄存器狀態(tài)。最后通過ULN2803驅(qū)動(dòng)繼電器。

六、客戶端

客戶端工作流程如圖6所示,實(shí)現(xiàn)自動(dòng)控制和接管控制。綜合考慮數(shù)據(jù)庫查詢壓力和信號(hào)快速恢復(fù),設(shè)定每秒查詢一次設(shè)備狀態(tài)。使用MFC對(duì)話框設(shè)計(jì)一個(gè)簡(jiǎn)單的界面,添加接管按鈕、各個(gè)設(shè)備開關(guān)按鈕,在初始化函數(shù)中鏈接底層通信DLL,完成客戶端的開發(fā)工作。

七、總結(jié)

自動(dòng)控制只開發(fā)了信號(hào)源部分,實(shí)現(xiàn)發(fā)現(xiàn)切換器故障無輸出關(guān)閉切換器電源,發(fā)現(xiàn)設(shè)備通信異常重啟復(fù)位恢復(fù)通信等功能。手動(dòng)控制支持更多端口,可以控制其他設(shè)備,例如,鄉(xiāng)鎮(zhèn)熊貓數(shù)字電視發(fā)射機(jī)無輸出,控制其復(fù)位。

作者:譚汝浩 韋紅錄 黃冬梅 單位:廣西廣播電視技術(shù)中心梧州分中心 廣西廣播電視技術(shù)中心南寧分中心

主站蜘蛛池模板: 班玛县| 那坡县| 邹平县| 巫溪县| 海淀区| 香河县| 东宁县| 崇明县| 莲花县| 拜泉县| 绥德县| 伊宁县| 马关县| 航空| 木兰县| 社旗县| 萨嘎县| 永宁县| 塔河县| 北京市| 洛浦县| 吴旗县| 海原县| 嵩明县| 云南省| 江安县| 金寨县| 贵定县| 高雄县| 澄江县| 麻江县| 察雅县| 伊金霍洛旗| 城步| 湛江市| 广德县| 澄城县| 阳高县| 黎川县| 喜德县| 资阳市|