93707部隊 王志海
串口通信是單片機與上位機最常用的數(shù)據(jù)通信方式,隨著USB接口的普及,單片機與計算機之間越來越多的使用USB接口進行數(shù)據(jù)傳輸,但是直接選用USB接口控制芯片會增加開發(fā)成本與難度。為單片機設備選擇一個簡單、快速、適用的通信方式,不但可以降低開發(fā)成本和技術難度,也可以最大程度的提高單片機系統(tǒng)的運行效率。本文對AVR單片機使用串口通信和V-USB方案的開發(fā)實現(xiàn)過程進行比較,分析了兩種通訊方式的特點和應用場合。
V-USB的全稱是Virtual USB for AVR microcontrollers,是一個開源項目。它利用純軟件的實現(xiàn)方式在ATMEGA公司的AVR系列單片機上虛擬出USB口,將其模擬為低速USB設備,實現(xiàn)方案不需要添加其他的USB接口芯片。通常單片機與上位機進行USB通信,需要用專用的芯片進行USB協(xié)議的轉換,例如CP2101、PL2303、SL811、PDIUSBD12等。其中CP2101、PL2303芯片使用起來雖然簡單,但是功能單一,只能做USB轉串口的通訊設備;而PDIUSBD12、SL811芯片功能較強,但是設計使用復雜,這些USB芯片的價格都相對較高,增加了系統(tǒng)的硬件成本。而V-USB簡單易用,成本較低,絕大多數(shù)的AVR系列單片機加上很少的幾個外部元件,就可以組成一個USB系統(tǒng)。
串口通信基于RS-232-C串行總線接口標準,最初是為了連接計算機主機與CRT終端之間的通信,后來逐漸廣泛地應用于各種設備之間的數(shù)據(jù)交換。早期的計算機主機都帶有RS-232接口,是最常用的數(shù)據(jù)接口,具有傳輸距離遠、連接方式簡單、線路占用少、開發(fā)資料多等優(yōu)點。絕大多數(shù)的單片機都內置USART單元用于串行通信。
V-USB系統(tǒng)的硬件結構很簡單,需要一個AVR單片機(片上具有2KB Flash,128字節(jié)RAM的大部分型號都可以),再加上少量的外部元件(晶振、電阻、穩(wěn)壓二極管等),就組成了一個基本的V-USB系統(tǒng),實現(xiàn)方案需占用單片機的兩個數(shù)據(jù)引腳(其中D+必須連接至INT0),并不占用其他的UART、計時器等硬件資源。系統(tǒng)組成如圖1。
圖中的D1和D2是3.6V穩(wěn)壓二極管,目的是限制USB數(shù)據(jù)線上的電平。USB通信規(guī)范中規(guī)定,數(shù)據(jù)線D+、D-上的電平范圍在3.0V至3.6V之間,而AVR單片機的輸出電平是VCC。如果單片機的VCC是5V,如沒有D1、D2的情況下將導致電平不匹配,會出現(xiàn)在計算機中無法正確識別出USB設備的情況。單片機所需的電源VCC可由USB的5V輸出電源直接提供,電阻R1和R2起到了限流和保護的作用,避免意外情況下?lián)p壞計算機的USB端口或單片機的端口。
V-USB的軟件源代碼是由C代碼和匯編代碼組成的,開發(fā)環(huán)境為AVR GCC,已組織好幾種不同USB設備的框架,開發(fā)者只需直接利用即可。最小化的V-USB程序框架編譯后需要占用單片機1150至1400字節(jié)的程序空間。
由于V-USB使用單片機IO口模擬USB通信,是用純軟件的方式實現(xiàn)了硬件芯片的功能。而USB通信的速率要求是比較高的。因此在進行USB通信時單片機的CPU占用率比較高的。為保證可靠的USB數(shù)據(jù)傳輸,單片機CPU時鐘必須是工作在12MHz、12.8MHz、15MHz、16MHz、16.5MHz、18MHz、20MHz這幾個頻率。
具備USART單元的AVR單片機都可以使用串行通信方式,硬件實現(xiàn)僅使用單片機的RXD和TXD引腳。為和計算機的RS-232接口連接,一般使用MAX232芯片進行電平轉換,這需要增加部分外圍電路,MAX232應用電路如圖2:
若要提高用串口通訊硬件的易用性,還可以選擇成品的USB轉TTL接口芯片,可以方便的將使用串口通信的單片機設備變?yōu)閁SB設備,并且不影響上位機和下位機的程序編制。
為減小波特率偏差,USART對單片機的使用的晶振頻率和串口設置的通訊速率有一些要求,不匹配的波特率和晶振頻率會使傳輸出現(xiàn)通訊錯誤。具體可查各型單片機的數(shù)據(jù)手冊中的波特率設置表。
V-USB項目在計算機端使用跨平臺的開源項目LibUSB來訪問USB設備。LibUSB-Win32是LibUSB在Windows操作系統(tǒng)(Win2k,WinXP,Vista,Win7)上的通用USB設備驅動程序及開發(fā)包。利用LibUSB可以在不設計核心驅動程序代碼的情況下,訪問Windows系統(tǒng)上的USB設備。LibUSB-Win32的開源項目網站是http://libusb-win32.sourceforge.net,遵守GNU Lesser General Public License(LGPL)和GNU General Public License(GPL)許可協(xié)議。協(xié)議規(guī)定LibUSB-Win32可以開源也可以用于商業(yè)軟件。
表1 兩種通信接口特征對比
圖1
圖2
LibUSB-Win32為C/C++程序員提供了可直接用于開發(fā)的頭文件和Lib文件,其中Lib文件還提供了BCC、GCC和MSVC這三個版本。C/C++程序員在自己的程序中要使用LibUSB-Win32時,只需包含提供的頭文件,并鏈接合適的Lib文件即可。對于使用其他語言的開發(fā)者,可以通過直接調用LibUsb-Win32的動態(tài)鏈接庫中的函數(shù)來使用LibUSB的功能來訪問USB設備。如果開發(fā)者希望具體的控制通訊細節(jié),可以使用LibUSB提供的函數(shù)usb_init()、usb_find_busses()、usb_control_msg()來實現(xiàn)設備操作、控制傳輸、批量傳輸、中斷傳輸?shù)裙δ堋?/p>
在V-USB項目中,有多個使用LibUSBWin32訪問USB設備的工程。開發(fā)者可以直接在自己的工程中添加opendevice.h和opendevice.cpp來訪問外圍USB設備,編程時僅使用已經編寫好的usbOpenDevice()、usb_set_configuration()、usb_control_msg()、usb_close()等幾個函數(shù)就可以快速實現(xiàn)與外圍USB設備的數(shù)據(jù)通信功能。
由于AVR單片機具有低成本、高性能的特性,使得V-USB非常適合于應用于USB加密狗、低速USB數(shù)據(jù)采集設備、HID設備等,這樣通過使用極少元件構成的具有USB通信功能的單片機系統(tǒng)比很多使用專用芯片的系統(tǒng)成本低、開發(fā)難度低。
目前應用V-USB的成熟產品有:
USBasp(USB接口的AVR編程寫入器)、AVRCDC(USB轉RS232)、USB Bootlader等。在V-USB網站上(見參考文獻)還有許多使用V-USB的開源項目,這些項目提供了完整的單片機程序和計算機程序的代碼及原理圖,非常方便開發(fā)者查閱參考這些資源,并在這些開源工程實例的基礎上進行修改,快速開發(fā)適合于應用需求的單片機設備。
在Windows下,常用的串口方法主要有:使用MSComm控件、Windows API函數(shù)、第三方類庫等。使用MSComm控件比較簡單,多種計算機編程語言均可利用其實現(xiàn)對串口的控制,但是對于通訊速度和實時性要求高的場合,如果處理不好就會出現(xiàn)內存泄露等問題。使用Windows API中用于控制串口通信的函數(shù),需要對相關的參數(shù)和數(shù)據(jù)結構有一定的了解,雖然各種語言、各種應用場合都可以使用,但是編程較為復雜,開發(fā)周期長,只適合需要精準的控制通訊細節(jié)的情況。相對而言第三方的開發(fā)類庫例如CSerialPort類,CSerialPortEx等,不但支持多串口多線程,而且使用簡單,開發(fā)周期短,應用場合較廣。
V-USB將單片機實現(xiàn)為支持USB1.1協(xié)議的低速設備。由于低速USB設備的速度是1.5M位/秒,而AVR單片機為單指令周期的,當單片機使用12MHz的時鐘頻率時,單片機運行時每8條指令就精確完成一個數(shù)據(jù)位的采集。這對單片機的時序要求非常嚴格,所以V-USB項目的核心部分代碼完全由匯編語言實現(xiàn),并對AVR GCC編譯器做了優(yōu)化。筆者使用V-USB的最小框架進行數(shù)據(jù)傳輸測試,上位機發(fā)送一次USB命令,下位機不做處理直接應答,每次傳輸8字節(jié)時數(shù)據(jù)交換速度最快,約為1600B/s,當傳輸字節(jié)數(shù)增加時速度會下降,這種數(shù)據(jù)通訊是應答式,總數(shù)據(jù)傳輸速度為3200B/s即25.6kbps,加上單片機數(shù)據(jù)處理的耗時,通訊速率應該可以達到20kbps。
單片機的串口通信速度依賴于單片機USART所設置的波特率,其單位時位/秒(b/s),即每秒鐘傳輸?shù)亩M制位數(shù)。若設置為9600b/s,則每秒鐘傳輸?shù)淖止?jié)數(shù)為9600/8=1200Byte。由于USART本身是串行通信,所以收發(fā)數(shù)據(jù)時均是單字節(jié)到達的。而V-USB可以設置一次通訊所傳輸?shù)淖止?jié)數(shù),最大一次可以傳輸254Byte。在編程上可以一次傳輸處理指定字節(jié)的數(shù)據(jù)結構,設計使用上更為簡單。
綜上所述,兩種通信接口(如表1所示)各有優(yōu)缺點。V-USB適用于對單片機空閑時間多、通訊速度要求不高,硬件成本較低、易用性好、需要快速開發(fā)應用USB接口設備的單片機項目。串口通信適用于傳輸距離遠、處理器功能任務復雜、需要對數(shù)據(jù)通信嚴格控制的單片機項目。
[1]V-USB項目.http://www.obdev.at/vusb/.
[2]libusb-win32項目.http://libusb-win32.sourceforge.net.
[3]ATMEL公司.http://www.atmel.com.
[4]MSDN.http://www.microsoft.com/msdn.