① 單片機串口發送數據包的問題
我來回答你的問題:
1。串口,即串列通迅(非同步心通迅)本來就是一位一位的將數據串列發出,所以你的數據(10位元組)肯定是一位一位的發,發完第一字--》第二位元組--》。。。第10位元組。注意發送某一位元組時不能停頓,當然串口會自動完成,不需要人工干擾;發完一個位元組後中途肯定是可以停頓的,否則我1ms不發送串口就不工作???肯定不會的了。
2。接收端用狀態機來做最方便,編者順手,讀者稱心。收到一位元組後,自動進入中斷,定義一下step來指示接收到了哪一個「階段」,如:地址檢驗階段,然後step++,退出中的,下次再進中斷時,就進入了下一個「階段」了,就是你的「數據長度」,然後step++,退出中斷(如果數據如:ID,址址不對就直接返回STEP=0)。。。。。直到接收完整個數據幀;接收完一位元組數據肯定是要退出中斷去做其它事情的,要不就成了輪循的接收方式,而不叫中斷方式了;
以下為我用PIC的USART做的一段狀態機接收接收程序:
ISR_USART_RX;串口接收中斷
MOVFW
RX_STEP
;the
counter
of
RX
ADDWF
PCL,F
GOTO
ISR_RX_PREAMBLE
;同步頭檢驗
GOTO
ISR_RX_ID_H
;ID_H檢驗,不對就置RX_STEP=0
GOTO
ISR_RX_ID_L
;ID_L檢驗,不對就置RX_STEP=0
GOTO
ISR_RX_DATA
;數據
GOTO
ISR_RX_CHECK
;檢驗
希望樓主能滿意我的回答。
② 單片機接收數據中,假如起始位和結束位為0x7e,如何把這串不定長的數據包接收到一個數組中,並得到包長度
提供個思路,你自己寫寫看吧。
設定一個數組用來存放數據包,如:unsigned char DataArray[100]; 定義的長度要足夠,確定沒有超過這個長度的數據包。再定義一個標志變數Flag,比如初值為0。
在串口接收中斷中將接收到的單個位元組存入數組,當然還要先定義一個全局變數,用來指示當前存到哪一個數組元素,如定義Counti,初值為0,存入數據為:DataArray[Counti] = SBUF; 接下來重要的是要判別接收到的內容,if((DataArray[Counti] == 0x7e) && (Flag == 0)),這里是首次收到0x7e,表示開始接收數據包,該if條件下,將Flag置為1;elseif ((DataArray[Counti] == 0x7e) && (Flag == 1)),這里是第二次收到0x7e,表示數據包接收結束,將Flag置為0,這時候的Counti+1就是數據包長度(包括起始位和結束位)。最後將數據存入數組,然後Counti++; 指向下一單元。
③ 51單片機接入乙太網的幾種方案
1、MAC+PHY方案
所謂的TCP/IP協議棧是一系列網路協議的統稱,不僅包括我們熟知的TCP協議和IP協議。
還有網路層的ICMP(Internet控制報文)協議、IGMP(Internet組管理)協議、ARP(地址解析)協議,傳輸層的UDP(用戶數據包)協議,應用層的HTTP(超文本傳輸)協議、DNS(域名解析)協議、FTP(文件傳送)協議、SMTP(簡單郵件管理)協議等等。
傳統的乙太網接入方案由MCU+MAC+PHY再加入網路介面實現乙太網的物理連接,通過在主控晶元中植入TCP/IP協議代碼實現通信及上層應用。
應用這種軟體TCP/IP協議棧方式實現的比較成熟方案有ENC28J60,CS8900A,DM9000,當然也有像STM32F107這類(內部自帶MAC)+PHY等方案。
2、硬體協議棧晶元方案
由MCU+硬體協議棧晶元(內含MAC和PHY)直接加網路介面,便可方便的實現單片機聯網,所有的處理TCP/IP協議的工作都是通過這位MCU的「小秘書」——硬體協議棧晶元來完成。
乙太網晶元的內核由傳輸層的TCP、UDP、ICMP、IGMP等協議、網路層的IP、ARP、PPPoE等協議以及鏈路層的MAC構成,再加上物理層的PHY和外圍的寄存器、內存、SPI介面組成了這一整套硬體化的乙太網解決方案。
這套硬體TCP/IP協議棧代替了以往的MCU來處理這些中斷請求,即MCU只需要處理面向用戶的應用層數據即可,傳輸層、網路層、鏈路層及物理層全部由外圍WIZnet的晶元完成。
這套方案從硬體開銷和軟體開發兩個方面來簡化前面所述的五層網路模型,簡化產品開發方案。這樣一來,工程師們就不必再面對繁瑣的通信協議代碼,只需要了解簡單的寄存器功能以及Socket編程便能完成產品開發工作的的網路功能開發部分。
(3)單片機數據包擴展閱讀
乙太網協議:
一個標準的乙太網物理傳輸幀由七部分組成。
PR SD DA SA TYPE DATA FCS
同步位 分隔位 目的地址 源地址 類型欄位 數據段 幀校驗序列 7 1 6 6 2 46~1500 4
除了數據段的長度不定外,其他部分的長度固定不變。數據段為46~1500位元組。乙太網規定整個傳輸包的最大長度不能超過1514位元組(14位元組為DA、SA、TYPE),最小不能小於60位元組。
除去DA、SA、TYPE14位元組,還必須傳輸46位元組的數據,當數據段的數據不足46位元組時需填充,填充字元的個數不包括在長度欄位里;超過1500位元組時,需拆成多個幀傳送。
事實上,發送數據時,PR、SD、FCS及填充欄位這幾個數據段由乙太網控制器自動產生;而接收數據時,PR、SD被跳過,控制器一旦檢測到有效的前序欄位(即PR、SD),就認為接收數據開始。
④ 單片機模擬usb鍵盤原理
:
1.基本原理:單片機模擬USB鍵盤是通過將叢鎮單片機的I/O口接入一個USB介面,利用單片機編寫程序來控制USB介面實現鍵盤功能。
2.硬體組成:單片機模擬USB鍵盤需余鄭空要一個USB介面,一個單片機主控晶元和一些按鍵,還有一些電路電阻和其他元件協同完成鍵盤的功能。
3.程序編寫:需要編寫一個程序,使單片機可以識別接入的USB介面,然後使用單片機的I/O口控制按鍵,使I/O口發出的信號以USB的標准格式輸出到USB介面,從而實現USB鍵盤的功能。
4.應用豎瞎場景:單片機模擬USB鍵盤可以應用於智能家居、自動化控制、游戲機、模擬終端等場景。