我試圖通過以太網到串行轉換器將新微控制器連接到現有的OSC(開放式聲音控制)網絡。如何從MCU UART解析不確定長度的數據包?
的OSC消息具有以下格式發送:
- OSC地址圖案:/串/任選的子 - >有額外NULL對準總是32位打包/ DWORD字節在端
- 類型標記:int32(i),float32(f),string(s)
- 數據:對於某些模式,這是已知的長度;對於其他人來說,它的長度不確定
我對如何最好地劃分代碼以及如何緩衝這個問題有點困惑。在我的UART接收ISR中,我希望只是將傳入的字節轉儲到SRAM緩衝區,然後在主循環中解碼它們,但我不確定如何在不確定長度的數據包中執行此操作。我從來沒有使用可變長度的數據包,但沒有在頭文件中指出數據包的大小。也沒有任何EOP /頁腳來表示數據包的完成,並且您將根據類型標籤解碼x個字節。
一些問題: 1.如何調整緩衝區大小?是的,我可以動態地做到這一點,但如果可能的話,我寧願避免這種開銷。這導致我走向一個循環緩衝區,但是如何在繼續解碼可變長度數據包的同時在主循環中提取我需要的內容? 2.在ISR中應該做多少解碼?我是否在主循環中設置了某種類型的狀態機,該狀態機根據傳入字節的ISR解碼而前進,然後在推進FSM時刷新這些字節?
尋找任何建議/指導如何最好地解決這個問題/架構的代碼。先謝謝你。
一般來說,對於不確定長度的數據,並給出一個串行字節流,沒有可能的答案,你是完全愚蠢的,你的任務不能完成。 –
歡迎訪問我的[關於EE SE的非常相關的問題](http://electronics.stackexchange.com/questions/186254/serial-protocol-delimiting-synchronization-techniques) –
不要在ISR中進行任何解碼。主循環應該做所有的解碼/解析。循環緩衝區的大小應該儘可能大,以避免傳入的字符溢出,即對各種識別部分的解析應該比按照給定「波特」速率填充緩衝區花費的時間少。該緩衝區的長度與數據流的長度無關。此問題與使用編譯器解析源代碼非常相似。編譯器在解析更多代碼時未知源的長度。沒有編譯器使用緩衝區來保存整個源。 – tonypdmtr