久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2546|回復(fù): 0
收起左側(cè)

網(wǎng)絡(luò)點擊數(shù)顯示器!

[復(fù)制鏈接]
ID:71235 發(fā)表于 2014-12-27 23:22 | 顯示全部樓層 |閱讀模式
    曾經(jīng)對USB開發(fā)有過興趣,也買了開發(fā)板和配套書籍,研究了半天,發(fā)現(xiàn)自己對用DIY一個USB鼠標或者一個USB鍵盤根本不感興趣,書上的也盡是接口啊/協(xié)議什么,目的還是教你做個鼠標器..而我只想做一個能通過USB接口實現(xiàn)簡單通訊功能的小玩意兒~~~
    其實早就對AVRUSB(現(xiàn)在叫V-USB)這套東西有興趣了,它使用AVR單片機模擬USB接口協(xié)議,所需要的元器件很簡單,不需要專用的USB接口芯片,也不需要弄懂很復(fù)雜的協(xié)議,相關(guān)的程序/小制作網(wǎng)上也多的是,只是對USB接口的電壓表/溫度計/紅外分析儀這類制作沒心情,想搞一個獨特的,有一定實用性的,又能跟網(wǎng)絡(luò)搭上關(guān)系的東西,這不又在"愛折騰"看到這個網(wǎng)站訪客計數(shù)器,于是DIY開始了...
    規(guī)劃:
    1.首先需要一個上位機軟件去取得網(wǎng)站訪客計數(shù).
    愛折騰上的這個是通過web程序生成一個包含計數(shù)值的文本文件,然后又上位機讀取后發(fā)給下位機顯示,這樣就要求這個網(wǎng)站計數(shù)器必須跟網(wǎng)站在一起,也就是說你能控制這個訪客計數(shù)程序提供你想要的數(shù)據(jù)格式,而我想實現(xiàn)的讀取現(xiàn)在使用很廣泛的cnzz的訪客計數(shù)器,這就要求上位機必須能實現(xiàn)模擬登錄,并解析web頁面,取出所需的數(shù)字,經(jīng)過合理的數(shù)據(jù)轉(zhuǎn)換后發(fā)給下位機顯示,能顯示今日/昨日/每日/累計的PV/訪客/IP共12個項目,其中目前累計PV已經(jīng)達到了4千萬,這就要求下位機至少有8個數(shù)碼管.
    2.需要一個開發(fā)V-USB設(shè)備上位機的接口庫,因為V-USB并未為C#提供一個標準開發(fā)庫,所以要找到這么一個支持C#開發(fā)的接口,所幸找到了,這就是LIBUSBDOTNET,而且是開源的,當然這個庫提供的例程是針對通用USB設(shè)備的,還好網(wǎng)上也有這種用AVRUSB的上位機下位機例程.
    3.下位機:
    (1)USB接口:MCU采用M8,電壓5V,通過3.6V穩(wěn)壓管實現(xiàn)跟USB連接(USB接口電平是3.0~3.6V)
    (2)數(shù)據(jù)顯示器:規(guī)劃是顯示9位數(shù)字,即最多能顯示9億點擊量,有相應(yīng)的顯示項目的指示,有按鍵實現(xiàn)顯示項目的切換,網(wǎng)上可供選擇的模塊有兩種(這只是我個人的想法,想一次就購買全所有的元件,這樣只能在一家店鋪選擇了),一種可以顯示16位數(shù)字,沒有LED指示燈,有鍵盤,數(shù)碼管個頭比較小,不能顯示小數(shù)點,另一種是能顯示8位數(shù),8個指示燈,8個按鈕,能顯示小數(shù)點,考慮到今后的幾年計數(shù)值不太可能達到億次,所以8位即可,加上有LED指示燈,減少了清晰指示當前顯示項目的編程壓力,所以最后選擇了后一個模塊.
    實戰(zhàn):
    1.上位機編程:
    因為不用delphi好多年,目前用的最多的客戶端編程軟件還是vs2008(C#),因此搜索了網(wǎng)絡(luò),找到了模擬登錄的方法,并且研究后確認cnzz可以通過GET的方法提交數(shù)據(jù),返回的數(shù)據(jù)也是有規(guī)律的,可以被分類提取,整個過程用到了"模擬提交"/"正則匹配"等技術(shù),經(jīng)過編程驗證,數(shù)據(jù)讀取成功!而且就算沒有下位機,這個程序也是一個很好的網(wǎng)站訪客技術(shù)軟件,能實現(xiàn)定時刷新功能.
    2.下位機硬件:
    因為V-USB要求AVR單片機的晶振頻率為12M,而且必須有精度保證,所以內(nèi)置的RC振蕩器是不能用了,不需外置晶振電路,至于USB硬件接口,參照相關(guān)的標準及電路即可,3.6V的穩(wěn)壓管平時不太用,一般手頭不會有存貨的,所幸我早有打造v-usb的計劃,早已經(jīng)買了一批放那兒了.按電路搭建起來,檢查電源是否短路,然后插入電腦USB接口,順利被電腦發(fā)現(xiàn),盡管還不能被識別.
    3.下位機程序:
    網(wǎng)上下到的avr驅(qū)動包大部分用的是AVR-GCC,此前一直用的是CVAVR,所以專門下載了winavr和avrstudio的最新版本,經(jīng)過幾天折騰,好歹能順利編譯出基本的程序了,只是對GCC的MAKEFILE還是不甚了了,不過要研究也是以后的事情,現(xiàn)在最主要的還是先把眼前的事情完成.
    程序分三大部分:一部分是V-USB驅(qū)動程序,這個按照通常的方法修改必要的參數(shù),比如PID,VID,USB接入的端口及引腳等等,程序本身是不能動的,可以自定義的僅僅是usbFunctionSetup,usbFunctionRead,usbFunctionWrite這三個函數(shù),一般來說usbFunctionSetup就可以傳送少量的數(shù)據(jù),這在小制作中是夠用了,如果需要大量數(shù)據(jù)傳輸則要用到usbFunctionRead,usbFunctionWrite了.這部分要完成數(shù)據(jù)的接收/判別/存儲功能.
    第二部分是對接收的數(shù)據(jù)按事先規(guī)定好的協(xié)議進行處理,處理成可供顯示的格式.
    第三部分是數(shù)據(jù)的顯示,及按鍵輸入的控制,因為買顯示模塊的時候店家已經(jīng)提供相應(yīng)的庫,應(yīng)用到程序里就可以了.
    4.上下位機的通訊:
    這是最重要也是最困難的.
    首先要先定下通訊協(xié)議和數(shù)據(jù)格式.剛開始的時候打算用LIBUSBDOTNET中的 OpenEndpointWriter 類向下位機傳送批量數(shù)據(jù),就是從網(wǎng)絡(luò)接收到的12個訪問計數(shù)項,后來發(fā)現(xiàn)網(wǎng)上根本沒有跟V-USB有關(guān)的 OpenEndpointWriter 類的用法例程,下位機倒是有用usbFunctionRead,usbFunctionWrite來處理批量數(shù)據(jù)的,不過人家用的上位機是delphi或者BCB的,根本沒有C#的,所以這個方案最終放棄,轉(zhuǎn)而使用 UsbSetupPacket 和 ControlTransfer 傳輸數(shù)據(jù),下位機則使用usbFunctionSetup接收數(shù)據(jù).
    因為usbFunctionSetup只能傳送8個字節(jié),data[0]專門用于主機向設(shè)備發(fā)送命令的,比如要向設(shè)備發(fā)送數(shù)據(jù)或者要求設(shè)備向主機發(fā)送數(shù)據(jù)等等,這是USB協(xié)議規(guī)定好的,不能亂用,data[1]一般用做存放自定義的命令字節(jié),比如要發(fā)送的數(shù)據(jù)類型/命令類型,這是可以任意規(guī)定的,剩下的data[2..7]則是可以任意用來放置要傳送的數(shù)據(jù),直到了這個規(guī)定,接下來就要設(shè)計一個數(shù)據(jù)格式/協(xié)議了:data[1]放置12個計數(shù)項目的編號,從0到11,data[2..7]放置計數(shù)數(shù)值,這個數(shù)值該如何放置才能更簡單更容易處理呢?可以用的方法有兩個,一個是直接將一個整型數(shù)(四字節(jié))拆分成4個字節(jié)放入data[2..3],data[4..5],下位機接收后再還原出來,這樣能表示的數(shù)字非常巨大,完全滿足下傳數(shù)據(jù)的范圍,但是這樣的話下位機的數(shù)據(jù)處理要求比較難,而V-USB要求除驅(qū)動外的程序運行時間必須小于20ms,否則可能造成數(shù)據(jù)丟失,另外一個方案是將8位數(shù)字拆成8個BCD碼,放入4個字節(jié),傳到下位機后,下位機只要按順序?qū)⑦@8個數(shù)分別寫入8個數(shù)碼管即可,根本無需任何的數(shù)據(jù)轉(zhuǎn)換,這樣僅僅是上位機多了點程序處理環(huán)節(jié),而下位機則節(jié)約了大量的運行時間!因此最終方案選擇了后一個.但是后來還是出問題了,出問題的就是這個UsbSetupPacket這個類的參數(shù)(跟下位機的usbFunctionSetup對應(yīng))的data[2..3],data[4..5],data[6..7]的數(shù)據(jù)類型是有符號16位整型,也就是說,其數(shù)據(jù)范圍是+-32768,轉(zhuǎn)換成二進制數(shù)就是0111 1111 1111 1111高字節(jié)最大的數(shù)字范圍只有127,而兩位BCD碼轉(zhuǎn)成10二進制最大是9*256+9=2313,遠大于能存儲的數(shù)值,最終采取了如下的數(shù)據(jù)結(jié)構(gòu):
    按8位的顯示數(shù)字算,每4位用兩個字節(jié)表示,比如9999 9999這個數(shù)就分成兩個9999來表示,這兩個字節(jié)又分高低字節(jié),每個字節(jié)表示2位數(shù),也就是十進制的99,因為這個高字節(jié)最大是127,不能用BCD碼表示,所以仍按二進制來表達,最大是99,正好在127之內(nèi),這兩個字節(jié)傳到下位機后再轉(zhuǎn)成BCD碼送顯示器顯示,這樣就成功的解決了數(shù)據(jù)格式的表示問題,而且最大的數(shù)字仍要大于8位數(shù)(因為有6個字節(jié)可用,8位數(shù)只用掉了4個字節(jié)).
    安排好上位機的數(shù)據(jù)格式問題,下位機只要按協(xié)議還原出來就可以了.
    5.顯示/按鍵模塊的程序
    剛測試店家提供的模塊的時候,怎么都不能讓模塊點亮,懷疑是模塊有問題,后來讓店家傳了一個他自己做的一個示例hex文件,寫入M8后,模塊能正常點亮,說明模塊本身沒問題,問題出在編譯器上,掙扎了一個晚上,終于發(fā)現(xiàn)是makefile寫的有問題.
    6.系統(tǒng)總成
    最終上位機傳送12項計數(shù)值,最小刷新時間是10秒,并同時每隔一秒傳送一個有別于12個項目編號的值,如果下位機在若干秒內(nèi)沒有接收到這個數(shù)值,則顯示某些符號,以告知用戶,USB通訊已中斷,顯示模塊的8個數(shù)碼管用于顯示8位計數(shù)值,如果數(shù)字少于8位,前導(dǎo)的0自動消隱,LED指示燈有8個,前4個分別只是今日/昨日/每日/累計,后3個用于只是PV/訪客/IP,用3個按鍵操作項目的顯示,頭兩個向前向后選擇顯示項目,后一個按鍵切換到自動輪換顯示.上位機方面,原本是用管理員帳號實現(xiàn)模擬登錄的,后來考慮到安全問題,改用查看密碼登錄,這樣只要填寫計數(shù)器的ID和查看密碼就可登錄了,所幸最終的數(shù)據(jù)頁面跟管理員的是一樣的,程序不用大的改動.

    7.遇到的問題:
    (1)USB識別問題,在家里的電腦上都能成功的識別出硬件插入的,但是拿到單位的電腦上卻發(fā)現(xiàn)3臺電腦8個USB端口只有一個能識別出硬件插入,并成功安裝驅(qū)動,也問過其他人,但是沒有答案,后來拿萬用表測data-的引腳電壓,發(fā)現(xiàn)只有3.1v,而相同電路相同參數(shù)的USBASP有3.4,照理說3.0~3.6之間都能應(yīng)該能識別的,可實際上就是不行,最后還是更換了這兩個穩(wěn)壓管,更換后的電壓是3.3v,果然能識別出來了.
    (2)然后是V-USB的PC驅(qū)動問題,因為這類USB設(shè)備(包括USBASP)都是用的免費的PID/VID,就是說都是相同的,這樣不同的設(shè)備插入后都會被識別為同一個硬件,后來用了LIBUSBDOTNET自動的inf向?qū)Чぞ?生成了自己的驅(qū)動安裝文件,這樣插入硬件后就能顯示出不同的硬件名稱了.
    (3)LIBUSBDOTNET的動態(tài)庫問題,USBASP和我的計數(shù)器顯示器都顯示為liabusb_win32類型的設(shè)備,用到的硬件驅(qū)動都是libusb0,奇怪的是插入任意一個硬件,用這個庫做的程序都不能正常的識別出來,不管是官方的還是我自己做的,盡管在設(shè)備管理器上顯示都正常的設(shè)備.但是USBASP的客戶端軟件avr_fighter卻能正常識別出usbasp,但是它用的是BCB編程的,沒有用到libusbdotnet的庫,估計是兩個硬件的驅(qū)動程序都相同的問題(即libusb0不能同時支持兩個USB設(shè)備),后來是修改了我自己的PID/VID,并且將驅(qū)動安裝到自己定義的一個目錄上(默認是windows\system32)但是還是沒有解決根本問題,設(shè)備插入后程序還是不能打開它,有時要兩個設(shè)備同時插入,程序才能識別出來,重啟后又不能識別了,到目前為止這個問題還是不能很好的解決,不過在只有一個V-USB設(shè)備的電腦上還是很正常的.

    又:寫完上面的文字后,又去libusbdotnet官網(wǎng)上逛了一下,都是E文,基本看不懂,湊合用google網(wǎng)頁翻譯看了一下,發(fā)現(xiàn)確也有人提出同時插入兩個相同v-usb設(shè)備時,不能被枚舉的問題,又有人提到他用修改libusb0.sys,libusb0.dll為自己的名字后,再安裝驅(qū)動的事情,給了我一點點靈感,那么改哪個的驅(qū)動呢?是usbasp的還是我的網(wǎng)頁計數(shù)顯示器?因為計數(shù)器可能要拿到外面去用的,而usbasp是自己用的設(shè)備,在自己的電腦上才有可能同時插入兩個設(shè)備,因此先徹底刪除了原來的USBASP驅(qū)動程序,然后修改.inf文件,將所有涉及到libusb0.sys,libusb0.dll,及安裝的服務(wù)名都改成自定義的名稱,當然也要改一下驅(qū)動文件的名稱,然后再安裝,果然現(xiàn)在我的上位機能完全正常的識別出我的小設(shè)備了,當然了,兩個設(shè)備還是不能同時插入,不過這個已經(jīng)不是大問題了,畢竟usbasp只是個寫入設(shè)備,寫入完成后即可拔出的.
附靚照一張,至于要不要給它按一個漂亮點的外殼,看心情而定~~~

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲爱爱网 | 91亚洲一区| 欧美在线亚洲 | 日韩一级欧美一级 | 国产一区二区在线免费 | 免费视频a | 激情久久网 | 久久久久久久久久国产 | 免费a在线观看 | 国产精品高潮呻吟久久 | 一级片日韩 | 在线观看小视频 | h片在线免费观看 | 一级片在线免费观看 | 国产伊人网 | 午夜天堂av| 日韩视频免费看 | 一级淫片观看 | 婷婷丁香六月 | 国产成人在线观看免费网站 | 国产一区不卡 | 国产不卡在线 | 在线观看视频一区 | 国产美女一区 | 午夜999 | 精品久久久久久久久久 | 亚洲国产成人在线 | 能看毛片的网站 | 成人免费黄色大片 | 亚洲精品欧美 | 国产精品99精品久久免费 | 久久久久毛片 | 国产乱码一区二区三区 | 青青草伊人网 | 亚洲一二区 | 亚洲欧美一区二区三区在线 | 日韩精品一区二区三区免费视频 | 黄色在线观看免费 | 国产黄视频在线观看 | 黄色日批视频 | a级片在线观看 |