樊高有++王勇++楊振國(guó)
摘 要:USB3.0接口速度快、簡(jiǎn)單、占用資源少,在實(shí)際設(shè)計(jì)工作中應(yīng)用廣泛。設(shè)計(jì)一種基于USB3.0接口的上位機(jī)軟件,在C#.NET平臺(tái)下實(shí)現(xiàn)USB3.0設(shè)備的讀寫、數(shù)據(jù)接收和發(fā)送、數(shù)據(jù)傳輸動(dòng)態(tài)顯示以及數(shù)據(jù)存儲(chǔ)。實(shí)驗(yàn)結(jié)果表明,采用該程序可以提高程序開發(fā)效率,各方面功能都能得到很好的實(shí)現(xiàn)。
關(guān)鍵詞關(guān)鍵詞:C#;USB3.0;上位機(jī);數(shù)據(jù)傳輸
DOIDOI:10.11907/rjdk.162031
中圖分類號(hào):TP319
文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào)文章編號(hào):16727800(2016)011011103
0 引言
USB(Universal Serial Bus)是一種新型的計(jì)算機(jī)總線接口技術(shù)。目前,在電子消費(fèi)產(chǎn)品以及智能測(cè)控等領(lǐng)域應(yīng)用越來越廣泛,在設(shè)計(jì)工作中也被越來越多采用。新的USB3.0總線技術(shù)提供了5.0Gb/s的傳輸速率,并向下兼容低速1.5Mb/s、全速12Mb/s和高速480Mb/s傳輸速率。Cypress公司提供的Cypress Suite USB開發(fā)包包含.NET平臺(tái)的動(dòng)態(tài)鏈接庫(kù)CyUSB.dll[1]。本文探討如何在Windows平臺(tái)的.NET開發(fā)環(huán)境中,采用C#開發(fā)了USB3.0對(duì)接的上位機(jī)軟件設(shè)備。
1 軟件總體設(shè)計(jì)
(1)從程序架構(gòu)角度考慮,數(shù)據(jù)傳輸功能、顯示功能以及數(shù)據(jù)存儲(chǔ)功能分為獨(dú)立的3個(gè)部分,分別由相應(yīng)的類實(shí)現(xiàn)。
(2)使用事件傳遞內(nèi)容,減小數(shù)據(jù)傳輸部分、顯示部分以及數(shù)據(jù)存儲(chǔ)部分的耦合度。
(3)程序功能相對(duì)復(fù)雜,分步實(shí)現(xiàn):先完成USB設(shè)備檢測(cè),實(shí)現(xiàn)設(shè)備連接功能;然后傳輸數(shù)據(jù),數(shù)據(jù)接收,實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)功能;最后實(shí)現(xiàn)界面數(shù)據(jù)實(shí)時(shí)更新[2]。
上位機(jī)窗體界面主要有3個(gè)部分組成,即設(shè)置、運(yùn)行狀態(tài)以及接收與發(fā)送數(shù)據(jù)緩沖區(qū),如圖1所示。程序總體工作流程如圖2所示。
2 程序功能實(shí)現(xiàn)
2.1 設(shè)備自動(dòng)檢測(cè)
當(dāng)USB設(shè)備連接到計(jì)算機(jī)時(shí),能夠自動(dòng)獲取USB設(shè)備列表、傳輸端點(diǎn);當(dāng)USB設(shè)備被移除后,能夠自動(dòng)識(shí)別USB設(shè)備已被斷開,重新設(shè)置和獲取USB設(shè)備。其部分程序如下:
2.2 數(shù)據(jù)傳輸
數(shù)據(jù)傳輸分為兩類,一是PC( personal computer )向USB設(shè)備寫數(shù)據(jù),二是PC從USB設(shè)備讀取數(shù)據(jù)。主要使用BeginDataXfer函數(shù)通過端點(diǎn)進(jìn)行異步數(shù)據(jù)傳輸,使用FinishDataXfer函數(shù)執(zhí)行異步I/O數(shù)據(jù)傳輸,獲取并保存?zhèn)鬏數(shù)臄?shù)據(jù)以及傳輸結(jié)果。本文主要探討PC從USB設(shè)備讀取數(shù)據(jù),并把數(shù)據(jù)保存到指定文件。由于USB3.0的傳輸速度非???,最大速度可以達(dá)到5.0Gb/s,為實(shí)現(xiàn)更快的接收速率,本文在程序設(shè)計(jì)中開起兩個(gè)線程[3]。其中,一個(gè)線程用于接收USB設(shè)備傳來的數(shù)據(jù),稱為讀線程;另一個(gè)線程用于把接收到的數(shù)據(jù)存盤,稱為寫線程,而且考慮到傳輸數(shù)據(jù)的完整性和一致性,還需要建立一個(gè)線程安全隊(duì)列。此外,考慮錯(cuò)誤處理、程序異常等情況,本文程序開啟了一個(gè)監(jiān)視隊(duì)列線程,用于監(jiān)視隊(duì)列中元素的變化,保證讀線程和寫線程能夠更好地同步執(zhí)行,如圖3所示。
程序中,借助AutoResetEvent類從一個(gè)線程向另一個(gè)線程發(fā)送通知[4]。
Static AutoResetEvent m_Write = new AutoResetEvent(false);//從監(jiān)視隊(duì)列線程向?qū)懢€程發(fā)信號(hào)
static AutoResetEvent m_WriteMonitor = new AutoResetEvent(false);//從寫線程向監(jiān)視隊(duì)列線程發(fā)送信號(hào)
ConcurrentQueue
Private static ConcurrentQueue
首先,定義一個(gè)被操作對(duì)象的類CustomTask,用于保存操作結(jié)果。在這個(gè)類中,由一個(gè)字段和類構(gòu)造函數(shù)。讀線程把接收到的數(shù)據(jù)添加到隊(duì)列,而寫線程將隊(duì)列中的數(shù)據(jù)寫入到文件中。
2.3 界面動(dòng)態(tài)顯示
在C#的應(yīng)用程序開發(fā)中,經(jīng)常要把UI線程和工作線程分開,防止界面停止響應(yīng),同時(shí)需要在工作線程中更新UI界面上的控件。由于.NET禁止跨線程調(diào)用控件,使用delegate和invoke從其它線程中調(diào)用控件,使用定時(shí)器,每隔1s更新一次界面[56]。
首先在System.Timers.Timer類中創(chuàng)建一個(gè)time定時(shí)器,其輕量、計(jì)時(shí)精確,對(duì)應(yīng)用程序、消息沒有特別的要求。
然后,把需要更新的控件都加入updataUI事件中,在程序開始接收數(shù)據(jù)或者發(fā)送數(shù)據(jù)時(shí),設(shè)置time.Enabled 為true,啟動(dòng)定時(shí)器,同時(shí)開始計(jì)時(shí) t1=DateTime.Now。下面以更新接收數(shù)據(jù)的時(shí)間和傳輸數(shù)據(jù)的速率為例說明。
2.4 軟件測(cè)試
在PC上安裝好USB3.0設(shè)備的驅(qū)動(dòng)程序,然后測(cè)試上位機(jī)在不同發(fā)送速率和不同發(fā)送數(shù)據(jù)大小下數(shù)據(jù)接收一致性和完整性,同時(shí)要求保證界面運(yùn)行良好。圖4截取了接收數(shù)據(jù)的一部分。經(jīng)測(cè)試,上位機(jī)程序均滿足要求。
3 結(jié)語(yǔ)
在.NET平臺(tái)下,利用C#開發(fā)了USB3.0接口的上位機(jī)軟件,為USB3.0設(shè)備測(cè)試提供了良好的人機(jī)交互界面。該程序運(yùn)行穩(wěn)定,界面操作直觀簡(jiǎn)單,方便了操作人員測(cè)試,提高了USB3.0設(shè)備的測(cè)試效率。測(cè)試結(jié)果表明,本軟件滿足USB3.0的高速傳輸數(shù)據(jù)的要求。
參考文獻(xiàn):
[1] 鄭杰.USB3.0編程寶典[M].北京:電子工業(yè)出版社,2013:3035.
[2] 黃承安.C#網(wǎng)絡(luò)應(yīng)用案例導(dǎo)航[M].北京:中國(guó)鐵道出版社,2003:7882.
[3] 卞美琴.基于USB3.0接口的高速數(shù)據(jù)傳輸技術(shù)研究[D].南京:南京理工大學(xué),2014.
[4] Eugene Agafonov著.C#多線程編程實(shí)戰(zhàn)[M].北京:機(jī)械工業(yè)出版社,2015:3540.
[5] 李江全.Visual C#.NET串口通信及測(cè)控應(yīng)用典型實(shí)例[M]北京:電子工業(yè)出版社,2012:138145.
[6] 王晶.USB3.0高速信號(hào)完整性分析及其應(yīng)用[D].西安: 西安電子科技大學(xué),2012.
(責(zé)任編輯:陳福時(shí))