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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2445|回復: 0
打印 上一主題 下一主題
收起左側

網絡點擊數顯示器!

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

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

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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产人久久人人人人爽 | 1级毛片 | 色毛片| 亚洲精品成人av | 成人av一区| 91精品久久久久久久99 | 日操夜操 | 国产视频福利在线观看 | 懂色一区二区三区免费观看 | 91亚洲国产精品 | 久久亚洲一区二区三区四区 | 久久在线| 国产精品a一区二区三区网址 | 久久久性色精品国产免费观看 | 91资源在线观看 | 天天操天天拍 | 欧美成人一区二区三区 | 日韩精品一区在线 | 男女视频在线观看网站 | 国产成人在线视频免费观看 | 二区在线视频 | 午夜影院网站 | 麻豆成人在线视频 | 一级片aaa | av黄色在线 | 91精品久久久久久久久中文字幕 | 午夜久久av | 日韩欧美国产精品综合嫩v 一区中文字幕 | aaaa一级毛片 | yiren22 亚洲综合 | 精品不卡 | 精品亚洲一区二区三区 | 午夜久久久 | 性色av网站| 国产一区二区不卡 | 日韩欧美中文字幕在线视频 | 久久伊人久久 | 国产精品揄拍一区二区久久国内亚洲精 | 黄a免费网络 | 日韩欧美一区二区三区四区 | 国产精品久久在线观看 |