當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]基本功能  在本設(shè)計(jì)中,數(shù)據(jù)的處理可以使用PC機(jī)的MATLAB等功能強(qiáng)大的軟件,但是這類現(xiàn)有的數(shù)據(jù)處理軟件并不能對(duì)特有的數(shù)據(jù)采集系統(tǒng)的下位機(jī)采集模塊進(jìn)行直接控制,因此需要針對(duì)特定的數(shù)據(jù)采集系統(tǒng)編寫對(duì)應(yīng)的上位機(jī)

基本功能

  在本設(shè)計(jì)中,數(shù)據(jù)的處理可以使用PC機(jī)的MATLAB等功能強(qiáng)大的軟件,但是這類現(xiàn)有的數(shù)據(jù)處理軟件并不能對(duì)特有的數(shù)據(jù)采集系統(tǒng)的下位機(jī)采集模塊進(jìn)行直接控制,因此需要針對(duì)特定的數(shù)據(jù)采集系統(tǒng)編寫對(duì)應(yīng)的上位機(jī)軟件,上位機(jī)軟件是針對(duì)上述目的而設(shè)計(jì)與編寫的,是整個(gè)采集系統(tǒng)的控制前端和數(shù)據(jù)存儲(chǔ)及處理中心??刂乒δ苤饕刂葡挛粰C(jī)采集的開始與終止,采集的頻率等,數(shù)據(jù)處理功能主要包括繪制波形圖,將數(shù)據(jù)顯示于列表,將數(shù)據(jù)存儲(chǔ)于文件,其中將數(shù)據(jù)存儲(chǔ)于文件將便于使用現(xiàn)有的數(shù)據(jù)處理軟件對(duì)數(shù)據(jù)進(jìn)行一些數(shù)值算法處理,以達(dá)到科學(xué)研究,結(jié)論驗(yàn)證等目的。

開發(fā)環(huán)境

  C++程序設(shè)計(jì)語言可以很好地實(shí)現(xiàn)面向?qū)ο蟮木幊趟枷耄捎肅++編寫上位機(jī)程序,可以將每一個(gè)功能模塊封裝成一個(gè)類,修改某個(gè)類的實(shí)現(xiàn),增加類的功能不會(huì)影響整個(gè)程序的框架,這樣就很容易維護(hù)和擴(kuò)展功能;加之我們要實(shí)現(xiàn)的軟件功能中需要調(diào)用大量的windows API函數(shù)庫,所以采用VC++6.0作為上位機(jī)的開發(fā)環(huán)境。

程序功能模塊劃分

  總的功能模塊主要包括三個(gè)模塊,即HID設(shè)備讀寫模塊,數(shù)據(jù)采集模塊,數(shù)據(jù)處理模塊。

HID設(shè)備的查找與讀寫

(1)枚舉

USB主機(jī)在檢測到USB設(shè)備插入后,就要對(duì)設(shè)備進(jìn)行枚舉了。枚舉就是從設(shè)備讀取一些信息,知道設(shè)備是什么樣的設(shè)備,如何進(jìn)行通信,這樣主機(jī)就可以根據(jù)這些信息來加載合適的驅(qū)動(dòng)程序。

(2)HID

人機(jī)接口設(shè)備(HID)是指直接和人進(jìn)行互動(dòng)的設(shè)備,如鼠標(biāo)、鍵盤等. 在Windows 中,具有相似屬性和提供相似服務(wù)的設(shè)備被歸為一種設(shè)備類型,一種類型的設(shè)備可以使用一個(gè)通用的設(shè)備驅(qū)動(dòng)程序. 在運(yùn)行Windows 98 或更高版本的PC 機(jī)上,應(yīng)用程序可以使用操作系統(tǒng)內(nèi)置的HID 類驅(qū)動(dòng)程序與HID 通信. 這樣使得符合HID 類的USB 設(shè)備很容易開發(fā)與運(yùn)行.

(3)HID設(shè)備的查找

在Windows操作系統(tǒng)中內(nèi)置很多與HID有關(guān)的API函數(shù),調(diào)用這些函數(shù),就可以開始對(duì)指定的HID設(shè)備進(jìn)行查找,查找HID設(shè)備的最終目的是獲得該設(shè)備的路徑名,設(shè)備的存取容量等信息,為以后對(duì)該設(shè)備進(jìn)行讀寫做好準(zhǔn)備.

(4)HID設(shè)備的讀寫

在取得了HID設(shè)備的路徑全面后,即可開始對(duì)HID設(shè)備進(jìn)行讀寫,對(duì)設(shè)備的讀寫也是通過調(diào)用相應(yīng)的函數(shù)來實(shí)現(xiàn)的。

控制下位機(jī)進(jìn)行數(shù)據(jù)采集

  上位機(jī)向下位機(jī)發(fā)送命令,控制下位機(jī)進(jìn)行數(shù)據(jù)采集,并從下位機(jī)獲取數(shù)據(jù),在這個(gè)過程中,要處理好兩個(gè)線程的同步的問題,即數(shù)據(jù)采集線程和數(shù)據(jù)處理線程能夠協(xié)調(diào)工作,保正系統(tǒng)能正確穩(wěn)定的工作。具體的解決方法是實(shí)現(xiàn)對(duì)某些數(shù)據(jù)訪問的原子操作,即一個(gè)線程在對(duì)公共數(shù)據(jù)進(jìn)行訪問時(shí),另一個(gè)線程不能打擾,直到操作線程操作完成,放棄對(duì)數(shù)據(jù)的使用權(quán),另一個(gè)線程才能夠訪問數(shù)據(jù)。

  下位機(jī)獲取了關(guān)于采集的有關(guān)參數(shù)后,即可開始采集,每隔一定時(shí)間采集一個(gè)數(shù)據(jù),當(dāng)采集數(shù)據(jù)數(shù)目達(dá)到限制值個(gè)數(shù)后,本次采集完成,此時(shí)下位機(jī)才開始將采集數(shù)據(jù)發(fā)送給上位機(jī)。

上位機(jī)對(duì)采集的數(shù)據(jù)的處理

  上位機(jī)在將數(shù)據(jù)采集命令發(fā)送給下位機(jī)后,所要做的就是等待下位機(jī)采集完成并接收數(shù)據(jù),因此上位機(jī)將循環(huán)查詢下位機(jī)工作狀態(tài),一旦檢測到下位機(jī)采集結(jié)束的標(biāo)志,上位機(jī)就開始對(duì)數(shù)據(jù)進(jìn)行處理。

數(shù)據(jù)處理分為三種:

(1)繪制波形圖

繪制波形圖的要求有兩點(diǎn):第一是不能頻繁閃爍,影響觀察;二是波形圖是動(dòng)態(tài)的,因?yàn)槔L制區(qū)域有限,而所采集的數(shù)據(jù)是源源不斷增加的,因此要求波形圖能夠動(dòng)態(tài)的更新。

(2)添加到列表顯示

可直觀地查看目前所采集的所有數(shù)據(jù)。

(3)保存到文件

運(yùn)用功能強(qiáng)大的數(shù)據(jù)處理軟件對(duì)數(shù)據(jù)進(jìn)行更深的處理。

界面顯示

采集單極性正弦波工作界面

代碼:

1 HID設(shè)備通信模塊實(shí)現(xiàn)代碼/*hid.h頭文件*/

2 #ifndef HID_H

3 #define HID_H

4 #include

5 #include

6 #include

7 #include "commonuse.h"

8 using std::string;

9 #pragma comment( lib, "setupapi.lib" )

10 extern "C" {

11 #include "hidsdi.h"

12 }

13 #pragma comment( lib, "hid.lib" )

14

15

16 class Hid

17 {

18

19 public:

20 Hid(const string &DeviceIdStr = MY_DEVICE_ID);

21 //Hid(DWORD Vid, DWORD Pid) {}

22 ~Hid() ;

23 BOOL Connect() ;

24 //BOOL ChangeDevice() {}

25 BOOL WriteHid(const BYTE * WriteBuff);

26 BOOL ReadHid(BYTE * ReadBuff);

27 BOOL IsWriteValid() const { return m_WriteValid ; }

28 BOOL IsReadValid() const { return m_ReadValid ; }

29 BOOL IsConnected() const { return m_IsConnected; }

30 const string & GetDeviceIDDesc() const { return m_DeviceIdStr ;}

31 private:

32 BOOL GetWRHandle() ;

33 private:

34 HANDLE m_WriteHandle;

35 HANDLE m_ReadHandle ;

36 string m_DeviceIdStr;//設(shè)備描述字符串

37 DWORD m_PID;

38 DWORD m_VID;

39 BOOL m_IsConnected ;//是否已連接上

40 BOOL m_ReadValid;//是否可進(jìn)行讀操作

41 BOOL m_WriteValid;//是否可進(jìn)行寫操作

42 BYTE m_RWBuff[USB_BUFF_SIZE+1] ;//讀寫緩沖

43

44

45 } ;

46

47

48

49 #endif

50

51

52 /*hic.cpp源文件*/

53

54 #include "Hid.h"

55

56 Hid::Hid(const string &DeviceIdStr):

57 m_DeviceIdStr(DeviceIdStr)

58 {

59

60 m_WriteHandle = INVALID_HANDLE_VALUE ;

61 m_ReadHandle = INVALID_HANDLE_VALUE ;

62 m_PID = 0;

63 m_VID = 0;

64 m_IsConnected = FALSE ;

65 m_ReadValid = FALSE ;

66 m_WriteValid = FALSE;

67 strcpy((char *)m_RWBuff,"") ;

68 }

69

70 BOOL Hid::GetWRHandle()

71 {

72 GUID InterfaceClassGuid =

73 {0x4d1e55b2, 0xf16f, 0x11cf, 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30};

74 HDEVINFO DeviceInfoTable = INVALID_HANDLE_VALUE;

75 PSP_DEVICE_INTERFACE_DATA InterfaceDataStructure = new SP_DEVICE_INTERFACE_DATA;

76 PSP_DEVICE_INTERFACE_DETAIL_DATA DetailedInterfaceDataStructure = new SP_DEVICE_INTERFACE_DETAIL_DATA;

77 SP_DEVINFO_DATA DevInfoData;

78

79 DWORD InterfaceIndex = 0;

80 DWORD StatusLastError = 0;

81 DWORD dwRegType;

82 DWORD dwRegSize;

83 DWORD StructureSize = 0;

84 PBYTE PropertyValueBuffer;

85 bool MatchFound = false;

86 DWORD ErrorStatus;

87 DeviceInfoTable = SetupDiGetClassDevs(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT " DIGCF_DEVICEINTERFACE);

88 while(true)

89 {

90 InterfaceDataStructure->cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

91 if(SetupDiEnumDeviceInterfaces(DeviceInfoTable, NULL, &InterfaceClassGuid, InterfaceIndex, InterfaceDataStructure))

92 {

93 ErrorStatus = GetLastError();

94 if(ERROR_NO_MORE_ITEMS == ErrorStatus)

95 {

96 SetupDiDestroyDeviceInfoList(DeviceInfoTable);

97 return FALSE;

98 }

99 }

100 else

101 {

102

103 ErrorStatus = GetLastError();

104 SetupDiDestroyDeviceInfoList(DeviceInfoTable);

105 return FALSE;

106 }

107

108 DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

109 SetupDiEnumDeviceInfo(DeviceInfoTable, InterfaceIndex, &DevInfoData);

110

111 SetupDiGetDeviceRegistryProperty(DeviceInfoTable, &DevInfoData, SPDRP_HARDWAREID, &dwRegType, NULL, 0, &dwRegSize);

112 Pr

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉