沈健,潘進
(1.蘇州健雄職業(yè)技術(shù)學院,江蘇太倉,215411;2.浩科機器人(蘇州)有限公司,江蘇太倉,215400)
集線器(HUB)屬于數(shù)據(jù)通信系統(tǒng)中的基礎設備,具有流量監(jiān)控、數(shù)據(jù)交換功能,是一種不需任何軟件支持或只需很少管理軟件管理的硬件設備,它被廣泛應用到各種場合。大多數(shù)集線器屬于純硬件網(wǎng)絡底層設備,不具有類似于交換機的"智能記憶"能力和"學習"能力。發(fā)送數(shù)據(jù)時都是沒有針對性的,而是采用廣播方式發(fā)送。也就是說當它要向某節(jié)點發(fā)送數(shù)據(jù)時,不是直接把數(shù)據(jù)發(fā)送到目的節(jié)點,而是把數(shù)據(jù)包發(fā)送到與集線器相連的所有節(jié)點。這種設備的廣播發(fā)送數(shù)據(jù)方式有三方面不足:(1)用戶數(shù)據(jù)包向所有節(jié)點發(fā)送,帶來不安全因素,很容易就能非法截獲他人的數(shù)據(jù)包。(2)由于所有數(shù)據(jù)包都是向所有節(jié)點同時發(fā)送,數(shù)據(jù)傳送過程中容易堵塞,降低了執(zhí)行效率。(3)雙向接口只需要3根線制作,非平衡電路使得RS-232非常的容易受兩設備間基點電壓偏移的影響很容易發(fā)生串話的問題。
本設計利用嵌入式系統(tǒng)設計的一款智能集線器,當節(jié)點提出交換數(shù)據(jù)信息的請求時,數(shù)據(jù)包發(fā)送給對應節(jié)點,其他沒有需求的節(jié)點將不會接收數(shù)據(jù)包,如圖1所示。
圖1 集線器
本集線器是由一個從端口和兩個主端口組成,系統(tǒng)在通電之前,通過對波特率設置開關(guān)的設置,確定主從端口數(shù)據(jù)的波特率。集線器上電后通過嵌入式系統(tǒng)檢測串口通信主端口是否有請求信號發(fā)出,請求信號包含連接主端口的設備需要采集的數(shù)據(jù)協(xié)議,當集線器接收到相應主端口發(fā)送過來的數(shù)據(jù)包后,保存對應主端口號,并將接收過來的數(shù)據(jù)包完整發(fā)送給從端口。連接在從斷口上的設備接收到發(fā)送過來的數(shù)據(jù)包,進行解析,根據(jù)通信協(xié)議,發(fā)送對應數(shù)據(jù)包所需要的數(shù)據(jù)包給集線器,集線器收到從端口發(fā)送過來的數(shù)據(jù)包后,根據(jù)保存的主端口號,有選擇的將從端口號的發(fā)送過來的數(shù)據(jù)包發(fā)送給對應的從端口設備,完成一次數(shù)據(jù)請求發(fā)送的通信。本集線器系統(tǒng)結(jié)構(gòu)圖設計如圖2所示。
圖2 系統(tǒng)結(jié)構(gòu)圖
本集線器系統(tǒng)大致分為5個電路模塊,分別是:嵌入式控制核心模塊、多路串口通信模塊、電源電路模塊、串行E2PROM存儲單元模塊、波特率設置開關(guān)控制模塊。電源電路模塊給集線器提供3.3V電源,外接電源12~24V電源模塊。波特率設置開關(guān)電路通過三路撥碼開關(guān)設置8種波特率,確保主從端口接收發(fā)送數(shù)據(jù)波特率一致,波特率設置對應分別是:
STM32F103RBT6內(nèi)置了3個通用同步/異步收發(fā)器,多路串口通信模塊采用SP232EEN芯片,本次串口通信采用三線標準制RXD、TXD和GND,由于本集線器使用在本地設備中而且是點對點,傳輸距離近,所以采用RS232異步串行通信模式。這種通信模式是以字符為傳輸單位,相鄰兩個字符間隔時間不定,接收和發(fā)送的波特率是由三位開關(guān)設置。由于主口設備數(shù)據(jù)包格式不一致,我們在編程時不考慮數(shù)據(jù)格式,接收數(shù)據(jù)時采用查詢方式確定數(shù)據(jù)包的字節(jié)數(shù),并將數(shù)據(jù)包以字符形式存儲在E2PROM隊列里,發(fā)送數(shù)據(jù)時根據(jù)字節(jié)數(shù)到E2PROM隊列里讀取數(shù)據(jù)發(fā)送確保數(shù)據(jù)傳輸不丟包。
串行E2PROM存儲單元模塊采用FM24V02芯片保存讀取端口號及對應傳遞的數(shù)據(jù)包,F(xiàn)M24V02是一款256Kb的3V串行F-RAM存儲器,使用雙線協(xié)議。該FM24V02執(zhí)行寫操作時,沒有寫入延遲發(fā)生,速度快等特點。下一個數(shù)據(jù)循環(huán)可立即開始,而不需要數(shù)據(jù)輪詢。串口通信模塊及存儲模塊如圖3所示。
圖3 串口通信模塊及存儲模塊
程序設計要求有:(1)確保接收的數(shù)據(jù)和發(fā)送的數(shù)據(jù)一致;(2)哪個主端口提出數(shù)據(jù)請求,從設備收到數(shù)據(jù)后解析把結(jié)果發(fā)送給對應的端口。由于STM32單片機帶IDLE中斷,所以利用這個中斷,可以接收不定長字節(jié)的數(shù)據(jù)。我們在做數(shù)據(jù)通信的時候通過命令開啟通信,通信要求實時且準確不丟幀。開始是定義了一個大數(shù)組,將該緩存數(shù)組定義成接收的長度,然后每次接收后清除該buff,而且要確保系統(tǒng)發(fā)送的數(shù)組長度要一定時才不會出錯,但順序會變化,并每次在接收到數(shù)據(jù)后都通過指令memcpy(d,s,strlen(s))復制到隊列中,確保數(shù)據(jù)不丟失。
程序開始運行后,先配置硬件,硬件配置主要是對串口異步通行和E2PROM隊列清零進行配置,然后進入接收數(shù)據(jù)模塊,判斷各路串口是否有數(shù)據(jù)包接收,如果有,則將該數(shù)據(jù)包保存在E2PROM存儲單元隊列中;如果沒有則巡回檢測各路端口是否有數(shù)據(jù)包接收,詳情見圖4;當系統(tǒng)發(fā)現(xiàn)E2PROM隊列中有新的數(shù)據(jù)包后,就讀取該數(shù)據(jù)包,并清零該隊列,然后將該數(shù)據(jù)包發(fā)送給指定的端口,詳情見圖5。
我們采用一個相同硬件的線路板作為測試板,通過串口調(diào)試助手軟件讀取主端口接收發(fā)送的數(shù)據(jù)包,讓測試板從口接到待測線路板的從口上,待測線路板上的2路主口通過RS232串口線接到PC的串口上,我們在做測試程序的時候,讓測試版上從口接收的數(shù)據(jù)原路發(fā)送,這樣我們就可以通過對待測線路板上主口發(fā)送任意字節(jié)(不超過1000個字節(jié))數(shù)的數(shù)據(jù),查看是否有同樣字節(jié)的數(shù)接收,這樣就能確定發(fā)送接收不丟包點對點的測試,完成客戶要求。圖6是我們測試的一個樣圖。
圖4 發(fā)送數(shù)據(jù)程序框圖
圖6 系統(tǒng)調(diào)試圖
本集線器工作過程很簡單,很實用,性價比高。集線器種類很多,客戶需求也各不一樣,這就要求我們集線器要不斷調(diào)整功能,滿足客戶的需求。