色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Unity安卓串口通信實(shí)戰(zhàn):USB Host橋接實(shí)現(xiàn)手機(jī)直連單片機(jī)

Unity安卓串口通信實(shí)戰(zhàn):USB Host橋接實(shí)現(xiàn)手機(jī)直連單片機(jī) 簡介一份面向 Unity 開發(fā)者的安卓串口收發(fā)代碼包用于解決 Unity 應(yīng)用與 Arduino、樹莓派等外部硬件設(shè)備的數(shù)據(jù)交互問題。壓縮包共 30 個(gè)文件大小約 124KB包含 JNI 橋接相關(guān)的 C/C 源文件.c/.h、Android.mk/Application.mk 構(gòu)建配置、Java 串口接口封裝、多架構(gòu) .so 動(dòng)態(tài)庫及 SVN 元數(shù)據(jù)等。通過閱讀源碼可了解 JNI 層如何封裝打開、關(guān)閉、發(fā)送與接收串口數(shù)據(jù)的邏輯并查看 armeabi-v7a、armeabi、x86 三種 CPU 架構(gòu)的庫文件便于在真機(jī)調(diào)試時(shí)替換對應(yīng) so 庫對于有一定 Android 原生基礎(chǔ)、想擺脫現(xiàn)成插件限制的 Unity 開發(fā)者是可直接參考的實(shí)現(xiàn)樣本。已有 1172 人學(xué)習(xí)下載適合作為復(fù)刻串口收發(fā)功能的起點(diǎn)。1. 一條手機(jī)直連單片機(jī)的數(shù)據(jù)鏈路Unity做界面安卓原生USB口負(fù)責(zé)收發(fā)有一次接產(chǎn)線數(shù)據(jù)采集面板的活兒甲方拿了一臺(tái)現(xiàn)場安卓平板要求直接插USB轉(zhuǎn)串口線讀取下方RS485傳感器數(shù)據(jù)同時(shí)在一套Unity做的三維工控界面里實(shí)時(shí)刷新數(shù)值。大部分人聽到“Unity串口”第一反應(yīng)是用C#的System.IO.Ports但這個(gè)庫在安卓上直接失效連打開設(shè)備都會(huì)拋異常原因在于安卓的串口權(quán)限模型和Windows差了一個(gè)時(shí)代。這篇文章拆一套能跑起來的Unity安卓串口收發(fā)方案核心思路是把底層USB串口讀寫交給安卓原生層C#通過AndroidJavaObject橋接調(diào)用Unity只負(fù)責(zé)協(xié)議解析和UI渲染。適合在Unity里做設(shè)備上位機(jī)、需要手機(jī)直連單片機(jī)或傳感器的開發(fā)者讀完照著配權(quán)限、寫代碼基本能在幾分鐘內(nèi)跑通數(shù)據(jù)回路。2. 技術(shù)選型拆解為什么繞開C#串口API把寶押在安卓USB Host上2.1 安卓串口的三條路有兩條走不通先看現(xiàn)狀。在Windows上寫串口System.IO.Ports拿過來就用打開COM3讀數(shù)據(jù)幾行代碼搞定但這個(gè)體驗(yàn)在安卓平臺(tái)上徹底失效。Unity的Mono運(yùn)行時(shí)在安卓上沒有串口設(shè)備文件的訪問權(quán)限SerialPort類實(shí)際調(diào)用會(huì)直接失敗或者打開后沒有任何數(shù)據(jù)返回。原因是安卓應(yīng)用層的設(shè)備訪問受SELinux和權(quán)限模型雙重控制工廠設(shè)備里常見的/dev/ttyS0、/dev/ttyMTK節(jié)點(diǎn)普通應(yīng)用連列目錄的權(quán)限都沒有。第二條路是直接用FileStream讀/dev/ttyS*設(shè)備節(jié)點(diǎn)這也是很多老項(xiàng)目在網(wǎng)上流傳的做法。這個(gè)方案依賴root權(quán)限需要把App裝在root過的設(shè)備上再在授權(quán)下執(zhí)行chmod 666。實(shí)際跑起來會(huì)發(fā)現(xiàn)另一個(gè)問題不同SOC平臺(tái)的tty節(jié)點(diǎn)命名完全不同高通平臺(tái)叫ttyHS聯(lián)發(fā)科部分平臺(tái)叫ttyMT展銳的節(jié)點(diǎn)又是另一套。今天能在這臺(tái)機(jī)器跑通的代碼換一批設(shè)備就全滅維護(hù)成本高到失控。所以真正可復(fù)現(xiàn)的路徑只剩第三條USB Host外接串口轉(zhuǎn)接芯片。安卓手機(jī)和平板普遍支持OTG系統(tǒng)把外接的CH340、FT232、CP210x這類轉(zhuǎn)接芯片枚舉成USB設(shè)備應(yīng)用層通過UsbManager獲得設(shè)備句柄。這里不像PC那樣由內(nèi)核自動(dòng)加載串口驅(qū)動(dòng)安卓不會(huì)把USB轉(zhuǎn)串口芯片變成/dev/ttyUSB0需要開發(fā)者在應(yīng)用層實(shí)現(xiàn)對應(yīng)芯片的協(xié)議。繞這一大圈本質(zhì)是用USB的批量傳輸端點(diǎn)模擬異步串口的收發(fā)。2.2 自寫芯片驅(qū)動(dòng)不劃算選現(xiàn)成庫省掉八成工作量USB轉(zhuǎn)串口芯片的協(xié)議并不是統(tǒng)一標(biāo)準(zhǔn)。拿市面上最常見的兩種芯片舉例CH340的控制傳輸命令和FT232的格式完全不是一回事波特率配置、流控開關(guān)、數(shù)據(jù)位設(shè)置的寄存器偏移都對不上。這意味著不借助外部庫需要拿到每顆芯片的數(shù)據(jù)手冊逐個(gè)寄存器實(shí)現(xiàn)配置命令再自己處理廠商芯片的識別邏輯。我見過有人在這個(gè)環(huán)節(jié)翻車——花兩個(gè)星期照著CH340手冊寫了一個(gè)能用的驅(qū)動(dòng)換一批FT232的轉(zhuǎn)接板控制命令全部失效又要重新讀FT232手冊。這種純應(yīng)用層開發(fā)去啃芯片協(xié)議性價(jià)比實(shí)在低。工程上推薦直接引入現(xiàn)成的USB串口開源庫它把設(shè)備枚舉、VID/PID匹配、芯片差異、波特率寄存器配置全部封裝在底層上層唯一需要關(guān)心的就是打開、讀、寫三個(gè)動(dòng)作。實(shí)際測過CH340和FT232兩種轉(zhuǎn)接板同一份代碼幾乎不用改就能切換芯片。2.3 工程目錄逐文件拆解每個(gè)文件管哪一段拿一個(gè)可運(yùn)行的Unity工程示例串口相關(guān)資源集中放在兩個(gè)目錄下Unity側(cè)的C#腳本和Android插件。Assets/ ├── Plugins/ │ └── Android/ │ ├── AndroidManifest.xml │ ├── libs/ │ │ └── usb-serial-lib.aar │ └── java/ │ └── com/devdemo/serial/ │ ├── SerialPortBridge.java │ └── SerialCallback.java ├── Scripts/ │ ├── Serial/ │ │ ├── SerialPortConfig.cs │ │ ├── SerialPortService.cs │ │ └── SerialFrame.cs │ └── Demo/ │ └── SerialDemoController.cs └── Prefabs/ └── SerialManager.prefabPlugins/Android下的AndroidManifest.xml不是Unity工程默認(rèn)那個(gè)而是構(gòu)建APK時(shí)給安卓打包用的合并清單負(fù)責(zé)聲明USB Host特性、權(quán)限過濾規(guī)則把USB設(shè)備枚舉的Intent-Filter掛到主Activity上。libs目錄放串口庫的aarjava目錄放我們自己的橋接類SerialPortBridge和回調(diào)接口SerialCallback。Scripts/Serial里SerialPortConfig.cs承載當(dāng)前串口的參數(shù)集合波特率、數(shù)據(jù)位、停止位、校驗(yàn)位都在這定義并通過Inspector露出SerialPortService.cs是全局唯一的串口服務(wù)入口控制打開、關(guān)閉、讀寫SerialFrame.cs是協(xié)議解析工具負(fù)責(zé)把收到的原始字節(jié)流按自定義幀格式拆解。Demo目錄掛一個(gè)演示控制器把串口事件轉(zhuǎn)發(fā)到UI顯示文本。Prefabs/SerialManager.prefab是一個(gè)內(nèi)含SerialPortService組件的空物體場景啟動(dòng)時(shí)掛上即可。這種組織方式的好處是協(xié)議、底層、UI三層隔離。后期協(xié)議從Modbus改成私有文本協(xié)議時(shí)只需要?jiǎng)覵erialFrame其余代碼基本不動(dòng)。2.4 USB通信模型底料endpoint、批量傳輸和控制傳輸串口庫封裝得再深底層還是在跟USB的endpoint打交道。UsbDevice暴露接口后需要拿到UsbDeviceConnection再找到對應(yīng)接口的In/Out兩個(gè)endpoint。endpoint就是USB設(shè)備上數(shù)據(jù)傳輸?shù)耐ǖ酪粋€(gè)負(fù)責(zé)往設(shè)備發(fā)數(shù)據(jù)一個(gè)負(fù)責(zé)收數(shù)據(jù)。批量傳輸不保證實(shí)時(shí)性但適合收發(fā)一幀一幀的串口數(shù)據(jù)。控制傳輸則用來做設(shè)備配置比如切換波特率、設(shè)置數(shù)據(jù)位、請求設(shè)備描述符都走控制端點(diǎn)。UsbSerialPort的setParameters方法內(nèi)部就是拼好控制命令發(fā)到控制端點(diǎn)再由轉(zhuǎn)接芯片改寫內(nèi)部寄存器。理解了這一層就能明白自寫芯片協(xié)議的工作量在哪里——每顆芯片的控制字格式都不同做一次就得重新折騰一遍寄存器映射。提示權(quán)限是一個(gè)繞不開的環(huán)節(jié)。UsbManager是系統(tǒng)服務(wù)App要用設(shè)備必須得到用戶授權(quán)。授權(quán)彈窗呼出后如果沒有對應(yīng)的BroadcastReceiver處理返回結(jié)果后續(xù)openDevice調(diào)用會(huì)一直失敗。這部分在下一章代碼里能看到具體落法。3. 核心模塊拆解從USB設(shè)備枚舉到串口打開的完整鏈路3.1 AndroidManifest配置讓系統(tǒng)把轉(zhuǎn)接板識別成可用USB設(shè)備Unity導(dǎo)出的APK原本帶一個(gè)自動(dòng)生成的AndroidManifest.xml里面只有Unity入口Activity。外接USB轉(zhuǎn)串口設(shè)備時(shí)需要額外聲明USB Host特性并且給Activity加上USB設(shè)備插拔的Intent-Filter否則設(shè)備插上去系統(tǒng)沒有任何反應(yīng)UsbManager.getDeviceList()拿到的列表永遠(yuǎn)是空的。?xml version1.0 encodingutf-8? manifest xmlns:androidhttp://schemas.android.com/apk/res/android uses-feature android:nameandroid.hardware.usb.host android:requiredtrue / application activity android:namecom.unity3d.player.UnityPlayerActivity intent-filter action android:nameandroid.hardware.usb.action.USB_DEVICE_ATTACHED / /intent-filter meta-data android:nameandroid.hardware.usb.action.USB_DEVICE_ATTACHED android:resourcexml/usb_device_filter / /activity /application /manifest這段配置做了兩件事。uses-feature聲明應(yīng)用依賴USB Host硬件系統(tǒng)在一開始就知道這個(gè)App需要OTG能力。intent-filter和meta-data組合起來把USB設(shè)備插拔事件路由到UnityPlayerActivity同時(shí)由usb_device_filter.xml文件做設(shè)備過濾。設(shè)備過濾文件通常按廠商VID和產(chǎn)品PID來放行只讓特定芯片觸發(fā)打開流程?xml version1.0 encodingutf-8? resources usb-device vendor-id6790 product-id29987 / usb-device vendor-id1027 product-id24577 / /resources這兩個(gè)ID是我實(shí)際調(diào)試中用到的分別對應(yīng)CH340和FT232兩種常見芯片的組合識別碼。不同廠商轉(zhuǎn)接板的VID/PID五花八門如果擔(dān)心漏設(shè)備也可以把過濾文件寫成空列表讓系統(tǒng)對所有USB設(shè)備廣播在Java代碼里再靠芯片協(xié)議探測來判斷是不是串口。我的習(xí)慣是過濾寫嚴(yán)一點(diǎn)只放已經(jīng)驗(yàn)證過的板子防止車間現(xiàn)場彈出些莫名其妙的權(quán)限請求干擾作業(yè)。3.2 SerialPortBridge.java設(shè)備枚舉、鑒權(quán)、連接一次說清Java側(cè)的核心類叫SerialPortBridge負(fù)責(zé)把UsbManager的系統(tǒng)服務(wù)能力包裝成Unity方便調(diào)用的接口。先看設(shè)備枚舉public class SerialPortBridge { private static final String ACTION_USB_PERMISSION com.devdemo.serial.USB_PERMISSION; private Context context; private UsbManager usbManager; private PendingIntent usbPermissionIntent; private UsbSerialPort serialPort; private UsbDeviceConnection connection; public SerialPortBridge(Context context, Activity activity) { this.context context; this.usbManager (UsbManager) context.getSystemService(Context.USB_SERVICE); this.usbPermissionIntent PendingIntent.getBroadcast( context, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_MUTABLE); } public String[] enumDevices() { HashMapString, UsbDevice devices usbManager.getDeviceList(); ListString names new ArrayList(); for (UsbDevice device : devices.values()) { names.add(device.getDeviceName()); } return names.toArray(new String[0]); } }枚舉方法把UsbManager內(nèi)的所有USB設(shè)備名取出來返回給Unity側(cè)。一個(gè)安卓設(shè)備會(huì)掛多個(gè)USB設(shè)備比如觸控屏、鍵鼠、數(shù)據(jù)線通通都會(huì)出現(xiàn)在這里。光拿名字不夠打開前還要通過UsbSerialProber探測哪一個(gè)是能被串口芯片協(xié)議識別的設(shè)備。請求權(quán)限的代碼public void requestPermission(String deviceName) { UsbDevice device findDeviceByName(deviceName); if (device null) return; if (!usbManager.hasPermission(device)) { usbManager.requestPermission(device, usbPermissionIntent); } }這里的回調(diào)不是同步返回而是通過ACTION_USB_PERMISSION廣播回到注冊好的BroadcastReceiver。我在構(gòu)造方法里動(dòng)態(tài)注冊Receiver到應(yīng)用Context上收到允許結(jié)果后馬上執(zhí)行openDevice和UsbSerialPort初始化。不熟悉這個(gè)模式的開發(fā)者把requestPermission當(dāng)同步調(diào)用緊接著就調(diào)openDevice必然每次失敗這個(gè)坑后面避坑章節(jié)會(huì)詳細(xì)展開。打開串口的核心方法public int open(String deviceName, int baudRate) { UsbDevice device findDeviceByName(deviceName); if (!usbManager.hasPermission(device)) { return -2; } connection usbManager.openDevice(device); if (connection null) { return -3; } UsbSerialPort port UsbSerialProber .getDefaultProber() .probeDevice(connection, device); if (port null) { return -4; } serialPort port; serialPort.open(connection); serialPort.setParameters( baudRate, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE); return 0; }幾個(gè)返回值對應(yīng)不同失敗原因-2是沒授權(quán)-3是系統(tǒng)把設(shè)備占了-4是芯片協(xié)議不匹配。Unity側(cè)拿到返回值就能直接給用戶一個(gè)明確的提示文案。setParameters里的參數(shù)分別對應(yīng)波特率、數(shù)據(jù)位、停止位和校驗(yàn)位和Windows串口編程里DCB結(jié)構(gòu)體的內(nèi)容一一對應(yīng)這里配置錯(cuò)了后面讀到的數(shù)據(jù)全部是亂碼。3.3 C#側(cè)橋接Unity把調(diào)用傳到Java層的標(biāo)準(zhǔn)姿勢Unity側(cè)并不直接持有UsbManager所有安卓系統(tǒng)服務(wù)調(diào)用都必須經(jīng)過AndroidJavaObject。SerialPortService以單例形式存在構(gòu)造時(shí)同時(shí)創(chuàng)建Java橋接對象和回調(diào)代理public class SerialPortService : AndroidJavaProxy { public delegate void DataReceivedHandler(byte[] data); public event DataReceivedHandler DataReceived; private AndroidJavaObject bridge; private readonly object lockObj new object(); public SerialPortService() : base(com.devdemo.serial.SerialCallback) { AndroidJavaClass unityPlayer new AndroidJavaClass(com.unity3d.player.UnityPlayer); AndroidJavaObject activity unityPlayer.GetStaticAndroidJavaObject(currentActivity); bridge new AndroidJavaObject( com.devdemo.serial.SerialPortBridge, activity, this); } public string[] GetDeviceList() { return bridge.Callstring[](enumDevices); } public int Open(string deviceName, int baudRate) { return bridge.Callint(open, deviceName, baudRate); } public void Close() { bridge.Call(close); } }AndroidJavaProxy是Unity提供的動(dòng)態(tài)代理機(jī)制C#對象可以作為Java接口回調(diào)的實(shí)參傳進(jìn)Java層。Java的SerialCallback接口定義一個(gè)onData(byte[])方法C#類通過重寫OnData方法接收底層數(shù)據(jù)這樣Unity側(cè)不用開額外線程就能拿到串口字節(jié)。調(diào)用過程有兩個(gè)注意點(diǎn)。AndroidJavaObject.Call傳參時(shí)bool要轉(zhuǎn)成Java booleanstring直接用C#的string即可返回值是數(shù)組的Unity能直接轉(zhuǎn)成對應(yīng)類型的C#數(shù)組。另外在Linux編輯器模式下調(diào)試會(huì)報(bào)找不到UnityPlayer類所以串口服務(wù)初始化要包在#if UNITY_ANDROID宏里等真機(jī)打包后再調(diào)用。4. 數(shù)據(jù)收發(fā)實(shí)戰(zhàn)從讀取線程到幀解析完整鏈路一幀不丟4.1 Java側(cè)讀取線程別把USB讀操作塞到主線程USB串口庫提供的read操作是阻塞式的。如果直接在Unity下幀循環(huán)里調(diào)用橋接去讀每一幀都卡在USB讀取上界面明顯掉幀。數(shù)據(jù)流量一上來主線程和渲染線程互相等整個(gè)應(yīng)用就“假死”了。正確做法是在Java層起一條獨(dú)立線程循環(huán)調(diào)用read把讀到的數(shù)據(jù)通過回調(diào)拋給Unityprivate Thread readThread; private volatile boolean running; public void startReading() { running true; readThread new Thread(() - { byte[] buffer new byte[512]; while (running serialPort ! null) { try { int len serialPort.read(buffer, 300); if (len 0) { byte[] data new byte[len]; System.arraycopy(buffer, 0, data, 0, len); callback.onData(data); } } catch (Exception e) { running false; } } }); readThread.start(); } public void stopReading() { running false; if (readThread ! null) { readThread.interrupt(); } }read的第二個(gè)參數(shù)是超時(shí)毫秒數(shù)300毫秒內(nèi)沒有新數(shù)據(jù)就返回0或負(fù)值。進(jìn)入循環(huán)后如果串口斷開read會(huì)拋異常這里捕獲后把running置false線程自然退出避免出現(xiàn)僵尸線程。每次從buffer截取實(shí)際讀到的長度再一次性提交回調(diào)。不直接復(fù)用整個(gè)512字節(jié)數(shù)組是因?yàn)閁nity側(cè)會(huì)把這個(gè)數(shù)組當(dāng)完整數(shù)據(jù)做幀解析如果混入多余空字節(jié)會(huì)判斷錯(cuò)幀長。4.2 Unity側(cè)數(shù)據(jù)接收隊(duì)列把Java回調(diào)轉(zhuǎn)成主線程親和的事件流Java回調(diào)到C#側(cè)時(shí)OnData方法運(yùn)行在子線程而Unity大部分API不允許子線程訪問。處理方法是在C#側(cè)把收到的字節(jié)放入線程安全的隊(duì)列然后在Update里統(tǒng)一取出處理private readonly ConcurrentQueuebyte[] pendingData new ConcurrentQueuebyte[](); public void OnData(byte[] data) { pendingData.Enqueue(data); } private void Update() { byte[] data; while (pendingData.TryDequeue(out data)) { ProcessSerialData(data); } }注意幾個(gè)細(xì)節(jié)OnData回調(diào)必須保證線程安全如果隊(duì)列不加鎖回調(diào)并發(fā)進(jìn)來就可能壞數(shù)據(jù)ConcurrentQueue的TryDequeue保證出隊(duì)原子性但ProcessSerialData內(nèi)部不能做耗時(shí)操作否則隊(duì)列會(huì)越堆越長。ProcessSerialData內(nèi)部流程是先把原始字節(jié)拼進(jìn)一個(gè)分組緩沖區(qū)再按幀頭幀尾切分。不能每收到一次回調(diào)就算一幀因?yàn)榇诘膔ead可能一幀分兩次讀到也可能一次讀到半幀。常見做法是積累式緩沖新字節(jié)append到尾部再循環(huán)從頭查找完整幀。4.3 發(fā)送鏈路指令組包、異步寫入和失敗降級發(fā)送接口同樣走AndroidJavaObject.Call回到Java層。write是同步的在主線程調(diào)用可能卡頓所以發(fā)送時(shí)我一般放在Unity協(xié)程里或Task.Run包一層public bool Write(byte[] payload) { if (bridge null) return false; return bridge.Callbool(write, payload); }Java側(cè)對write封裝一層重試邏輯public boolean write(byte[] data) { if (serialPort null) return false; try { int written serialPort.write(data, 300); return written data.length; } catch (Exception e) { return false; } }寫入時(shí)序有一個(gè)容易翻車的點(diǎn)兩個(gè)指令間隔太短轉(zhuǎn)接芯片的發(fā)送緩沖區(qū)還沒把上一幀發(fā)完下一幀就綴上去。應(yīng)用層要保證每次發(fā)送之間至少有一個(gè)幀的間隔不建議硬編碼毫秒級delay。更穩(wěn)妥的做法是維護(hù)一個(gè)發(fā)送隊(duì)列上一幀write返回后再發(fā)下一幀。對實(shí)時(shí)性要求不高的工業(yè)采集場景發(fā)送頻率控制在20幀每秒以內(nèi)穩(wěn)定性會(huì)好很多。4.4 協(xié)議幀封裝幀頭、長度、命令字和CRC16的通用實(shí)現(xiàn)單片機(jī)那邊幾乎不會(huì)用裸字節(jié)當(dāng)業(yè)務(wù)數(shù)據(jù)至少帶一個(gè)簡單幀格式。下面是一個(gè)可以直接拿去改的組包實(shí)現(xiàn)public static class SerialFrame { public static byte[] BuildFrame(byte cmd, byte[] payload) { int length 1 1 payload.Length 1 2; byte[] frame new byte[length]; frame[0] 0xAA; frame[1] 0x55; frame[2] (byte)(payload.Length 1); frame[3] cmd; System.Buffer.BlockCopy(payload, 0, frame, 4, payload.Length); ushort crc Crc16.Compute(frame, frame.Length - 2); frame[frame.Length - 2] (byte)(crc 0xFF); frame[frame.Length - 1] (byte)((crc 8) 0xFF); return frame; } }幀結(jié)構(gòu)是兩字節(jié)幀頭0xAA55一字節(jié)長度字段一字節(jié)命令字然后是負(fù)載最后兩字節(jié)CRC16校驗(yàn)尾。接收端解析先找?guī)^讀長度字段判斷幀長計(jì)算CRC比對校驗(yàn)尾。這個(gè)格式很通用能應(yīng)付大多數(shù)單片機(jī)通信。CRC16用查表法實(shí)現(xiàn)代碼不復(fù)雜。組包時(shí)注意CRC計(jì)算范圍是除校驗(yàn)尾以外的所有字節(jié)兩個(gè)校驗(yàn)字節(jié)的順序由單片機(jī)固件決定。調(diào)試時(shí)如果CRC一直對不上先把這兩字節(jié)交換一下再看。這類“對不上校驗(yàn)”的排查點(diǎn)后面避坑章節(jié)會(huì)專門提。注意幀頭、長度字段和CRC的字節(jié)序一定要先跟設(shè)備端固件確認(rèn)。很多項(xiàng)目聯(lián)調(diào)翻車都是協(xié)議看起來一致實(shí)際高低字節(jié)順序完全相反。5. 串口調(diào)試避坑五類高頻問題從現(xiàn)象到根因的排查路線5.1 設(shè)備列表為空USB轉(zhuǎn)串口板插上沒反應(yīng)現(xiàn)象Unity界面上點(diǎn)“刷新設(shè)備”枚舉數(shù)組為空OTG線已插好轉(zhuǎn)接板指示燈也亮了。原因AndroidManifest沒聲明USB Host特性或Activity沒有接收USB_DEVICE_ATTACHED廣播。系統(tǒng)層面可能壓根沒把設(shè)備加入U(xiǎn)sbManager設(shè)備列表。另一種情況是部分平板廠商對USB設(shè)備做了白名單限制。解決先確認(rèn)清單里有uses-feature android.hardware.usb.host再檢查Intent-Filter是否齊全。排除后在電腦上用adb shell執(zhí)行dumpsys usb查看系統(tǒng)枚舉結(jié)果如果這里都沒有就是硬件接觸或供電問題。帶RS485隔離模塊的轉(zhuǎn)接板常吃電流單靠平板USB口供電經(jīng)常帶不動(dòng)這時(shí)得外接供電。5.2 權(quán)限彈窗出現(xiàn)但點(diǎn)確定之后沒有任何回調(diào)現(xiàn)象第一次插入設(shè)備系統(tǒng)彈出USB設(shè)備授權(quán)對話框點(diǎn)了允許但串口就是打不開甚至反復(fù)彈窗。原因請求權(quán)限用的PendingIntent在Android 12以上需要顯式指定可變性標(biāo)志如果配了FLAG_MUTABLE或FLAG_IMMUTABLE不當(dāng)權(quán)限回調(diào)廣播就發(fā)不出來。另外BroadcastReceiver如果用Activity作為context動(dòng)態(tài)注冊Activity銷毀后收不到任何事件。解決PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT)Receiver注冊改用context.getApplicationContext()這樣即使頁面重建也不會(huì)丟廣播。還要區(qū)分手機(jī)系統(tǒng)設(shè)置里的“USB調(diào)試”彈窗那是開發(fā)者選項(xiàng)和應(yīng)用層USB權(quán)限是兩回事。5.3 串口打開正常但收到的字節(jié)全是亂碼現(xiàn)象read能收到數(shù)據(jù)打印出來是\u00ff\u00fe之類或者高位字節(jié)全部丟失。原因最常見是波特率不匹配。單片機(jī)端配置9600安卓側(cè)按115200打開肯定亂碼。另一類是數(shù)據(jù)位、停止位、校驗(yàn)位有一項(xiàng)不一致比如設(shè)備端是8N1代碼里寫成了7E1導(dǎo)致字節(jié)錯(cuò)位。解決先查看設(shè)備說明書確認(rèn)串口參數(shù)再把setParameters里四個(gè)參數(shù)對齊。還亂碼就換一根更短的連接線工業(yè)現(xiàn)場長線傳輸高波特率很容易受干擾。試到2400或4800許多老傳感器在低速下反而穩(wěn)定。5.4 數(shù)據(jù)能收但丟幀嚴(yán)重幀與幀之間斷流現(xiàn)象偶爾能收到完整數(shù)據(jù)幀但數(shù)據(jù)不連續(xù)中間缺字節(jié)報(bào)文頭尾經(jīng)常對不上。原因讀取線程buffer太小或讀取間隔太長。USB批量傳輸一次最大有效載荷不過64字節(jié)單次讀取后沒及時(shí)清空下一個(gè)包就可能覆蓋前一個(gè)。另一頭可能是Unity側(cè)ProcessSerialData耗時(shí)太長隊(duì)列堆積串口數(shù)據(jù)延遲后看起來就像斷流。解決Java讀取線程把buffer加大到1024超時(shí)設(shè)200到300毫秒。Unity側(cè)處理函數(shù)不要直接做日志輸出先把字節(jié)緩沖到幀緩沖區(qū)拼出完整幀再處理。如果還是掉考慮在AndroidManifest里給讀取線程加高優(yōu)先級或者直接用后臺(tái)Service持有連接。5.5 鎖屏或切后臺(tái)后串口斷開回到前臺(tái)必須重新打開現(xiàn)象平板鎖屏一段時(shí)間解鎖后串口數(shù)據(jù)停了重新點(diǎn)打開設(shè)備報(bào)設(shè)備被占用或打不開。原因UsbDeviceConnection的存活和Activity生命周期有關(guān)。Unity場景在后臺(tái)被回收J(rèn)ava層bridge對象雖然還在底層連接已經(jīng)被系統(tǒng)回收。解決把bridge對象的生命周期和應(yīng)用進(jìn)程對齊在Unity里把SerialPortService掛到一個(gè)DontDestroyOnLoad的空物體上同時(shí)監(jiān)聽Application的pause和resume事件。暫停時(shí)主動(dòng)stopReading恢復(fù)時(shí)再startReading可以有效減少斷開概率。需要高強(qiáng)度后臺(tái)采集的場景就得把USB連接放到前臺(tái)服務(wù)里維護(hù)那已經(jīng)超出本文范圍但方向是明確的。6. 二次開發(fā)思路把這套鏈路改造成你自己的協(xié)議通道拿到這套代碼后最常見的改造需求就是替換成自己團(tuán)隊(duì)的私有協(xié)議。我的建議是先不要?jiǎng)覬ava層Java層只負(fù)責(zé)把可靠的字節(jié)流送到C#協(xié)議相關(guān)的一切都收斂在SerialFrame和回調(diào)處理函數(shù)里。這樣做的理由是Java層每次改動(dòng)都要重新導(dǎo)出aar、重新打APK聯(lián)調(diào)成本高而C#層的改動(dòng)可以即時(shí)生效熱更新也不受影響。具體改協(xié)議時(shí)我把SerialFrame做成靜態(tài)工具類留出三個(gè)口子BuildFrame用來組包發(fā)送TryParseFrame用來從字節(jié)流里提取完整幀CalculateCRC用來替換校驗(yàn)算法。很多私有協(xié)議其實(shí)就是把幀頭改成別的魔數(shù)或者在幀尾多塞一個(gè)應(yīng)答號。這種程度的改動(dòng)只需要復(fù)制一份SerialFrame改一兩個(gè)方法完全不影響串口底層。還有一個(gè)實(shí)用技巧是事件驅(qū)動(dòng)模式。SerialPortService已經(jīng)暴露了DataReceived事件但更推薦在業(yè)務(wù)層做二次轉(zhuǎn)發(fā)public class SerialDemoController : MonoBehaviour { private void OnEnable() { SerialPortService.Instance.DataReceived OnSerialData; } private void OnDisable() { SerialPortService.Instance.DataReceived - OnSerialData; } private void OnSerialData(byte[] frame) { // 在這里按命令字分發(fā)例如0x01轉(zhuǎn)溫度顯示0x02轉(zhuǎn)開關(guān)量狀態(tài) } }這個(gè)寫法保證了每個(gè)業(yè)務(wù)模塊只訂閱自己關(guān)心的消息不會(huì)在同一個(gè)回調(diào)里寫一堆switch-case。多設(shè)備場景下還可以給回調(diào)加一個(gè)deviceId參數(shù)把多個(gè)串口的字節(jié)流按端口分開。驗(yàn)證方面我在Unity側(cè)放了一個(gè)調(diào)試面板實(shí)時(shí)顯示收包計(jì)數(shù)、錯(cuò)誤幀計(jì)數(shù)和最近一幀的十六進(jìn)制內(nèi)容。每次改動(dòng)協(xié)議解析邏輯先用調(diào)試面板確認(rèn)幀格式正確再開始做UI聯(lián)動(dòng)。從那以后我每次接新的串口設(shè)備都先花十分鐘在安卓原生層用日志確認(rèn)枚舉、權(quán)限、連接三個(gè)節(jié)點(diǎn)全部通過再回來改Unity側(cè)界面。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲毛片久久| 男人干美女| 色色综合97| 国产福利一区二| 国内伊人久久久久久网站视频| 草草网站影院白丝内射| 天天干天天操天天干天天操| 999熟女精品| av一区二区三区不卡| 日韩熟妇二区| 日韩97在线| 国产免费永久精品无码| 国产suv精品一区二六| 18禁免费视频| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 色色网91| 久久久久久久久久久久黄色 | 国产黄a三级三级三级av在线看| 色原狠狠天天天| 操逼逼无码| 日韩欧美天堂| 99视频在线| 亚洲黄色电影| 亚洲一区二区三区久久 亚洲一区二区| 蜜臀久久99精品久久久久电影| 无码操逼网| 99热18这里只有精品| 亚洲精美粉嫩嫩泬在线观看| 婷婷久草| 日本午夜福利影院| 欧美精品激情| 亚洲少妇色图自慰直播| 另类天堂| 婷婷av在线中文字幕| 蜜臀AV成人精品蜜臀| 18禁免费视频| nuu12国产麻豆精品| 黄片www.| 天堂v无码免费视频| 黑人中出21连凳花野真衣| 国产狂喷潮在线精品| 天天超级碰碰碰| 精品一区二区亚洲国产| 欧美激情综合网| 91 国产丝袜在线放观看 | 亚洲色图欧美色18直播在线| 热久久91婷婷| 黄色电影观看久久9| 久久久久幕乱码| 五月天婷婷综合| 大奶的诱惑| 97干日韩| 人人操人人叉人人插人人| 久久精品99久久久久久| 婷婷丁香在线| 国产精品不卡av免费在线观看| 欧美 日韩 国产传媒| 国产家庭乱伦性爱视频| av草草在线电影| 91精品久久久久久综合五月天| 人人妻人人爱人人玩| 蜜臀亚洲中文| 7777欧美成是人在线观看| 91欧美综合| 伊人久久亚洲中文字幕| 最近2019中文字幕国语免费版| 伊人久久亚洲色欲综合网站| 啪啪啪综合网| 欧美亚洲尤物久久| 日本αv| 极品色电影院| 久久久工口| 国产成年精品高清在线观看91| 人人妻天天做天天爽| 欧美日韩国产在线| 欧美激情另类一区二区| 91精片| 色在线69堂| 日本狠狠干| 天天干天天燥| 日本成人在线不卡一区二区三区| 欧美 综合 亚洲| 999在线电影香蕉| 欧美探花网| 亚洲综合嫩| 九九久久一区二区伦理| 神马九九| 国产97亚洲| 亚洲吊色| 精品久久久av| 九九99久久| 亚洲一区二区在线观看91| 亚洲怡春院| 性色avv| 国产色精品午夜大片| 91夜色| 亚洲AV色图一区| 欧美天天谢综合网| 日韩素人无码一区二区三区三州| 欧美顶级黄色大片免费| 亚洲综合欧美| 久久久久久97| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 伊人五月天婷婷| 婷婷10月天青娱乐| 中出在线视频| 99国产精品久久久在线播放| 色婷婷在线视频精品导航| 九九aV| 国产精品嫩草影院免费| 国产主播福利| 欧美人人曰人人操人人射射| 天天摸天天插天天日| 中文字幕狠狠玩| AA级电影三区| 亚洲熟妇一,二,三期| 欧色网址| 白嫩91在线亚洲| 大乔未久88一区| 久久综合久久综合人久久夜精品| 超碰公开久久网| 亚洲婷婷五月天| 97久久超碰| 亚洲97久久精品亚洲| 日本色色视频网站| 超碰97人妻免费在线| 性色aV一区二区三区噜噜| 91在线国产后入风骚翘臀美女素人| 欧美熟女妇同| com 首页 18岁 禁区 女优 免费 精选 同城 | 色偷偷男人的天堂麻豆| 330dv亚洲成年视频网| 精品国产一区二区三区久久久蜜臀 | 劲爆欧美人妖三区91| 欧美熟妇人体| 中国黑人三级片网站上区| 江都AV在线| 在线黄页看毛片| 国模一区二区三区| 久久久久性熟视频| 夜夜久久| 我爱搞逼综合网| 亚洲精品久久久久久| 欧美激色| 午夜精品99久久久久传媒| 91精产一区二区三区| 日本视频一区二区三区| 少妇与黑人高潮在线| 天天摸夜夜添无码小视频| 综合五月天| 热久久九九热| 秋霞无码av鲁丝片一区| 日本天天人人狠狠在线日美女 | 91少妇香蕉久久精品| 久久久久国产一区二| 可乐操亚洲蜜911| 97超碰磁| 久久久久极品| 五月丁香激情四射| 精品无吗久久| 国产Av超碰| 国产女主播视频在线观看| 日韩视频啪啪| 精品无码久久久久久久久果冻糖心| 97国产亚洲中文在线| 女人被添高潮免费视频| 天天弄欧美| 无码久久国产| 欧美日韩人妻精品系列一区二区三区| 狠狠干,狠狠操| 美女91| 日韩影片中文字幕一区二区三区| 韩日色费| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 成人AV素股で擦久久| 色屁屁影院www国产| 十八禁电影伊人网| 欧美婷婷| 久久香蕉国产线看观看猫咪av| 欧美黑人168页欧美黑人167| WWW4虎| 亚洲欧综合另类无码一区| 久草加勒比一区在线| 日本97久久久精品| 五月丁香啪啪啪| 久久久新亚洲AV| 91夜夜蜜桃臀1区2区3区| 国产激情在线| 久草免费福利在线播放| 久久性爱视频99| 色妺妺AⅤ| 蜜桃臀久久| 偷拍色图| 国产精品一二三区福利| 夜夜一区二区| 超碰人妻中文在线| 91九九九逼| 亚洲导航深夜福利| 日韩电影天堂视频二区三区| 99在线免费视频| 久妇网| 亚洲一区二区三区麻豆传媒| 激情露脸爱| 亚洲精品久久久久久久久豆丁网| 中文字幕av色| 九一综合精品视品av| 97人人操人人干| 天天色,天天干,天天干| 最新无码国产| 夜嗨影院| 口爆综合网| 色婷婷99| 国产五码丝袜屁眼| 国产人人干| 俞拍久久国应视频| 激情天天视频| 免费AV播放| 大香蕉 222| 色眯眯av| 夜夜嗨视频| 日韩中文字幕精品一区在线| 日韩操人| 日韩传媒在线| 五月天AV资源| 日本孕妇一区二区视频操逼免费看 | 久久男人精品| 一类无码操逼视频| 久久久久久久极品香蕉视频| 人妻天天爽| 日本中文字幕不卡视频| 久久精彩免费视频| 啊啊啊啊操死我了| 嗯嗯嗯啊啊在线观看| 久久久男人的天堂| 欧美人妖内射| 欧美啪啪女女| 亚洲自拍欧美色综合| 久久精品国产亚洲粉嫩| 国产小黄片在线免费观看 | 男人的天堂com| 中文字幕日韩电影人妻| 97人肏| 国产中文字幕在线观看| 亚洲综合精品国产一区| 禁十八久久| 九九久久玖玖| 欧美极品女人的天堂| 日韩干B| 自怕偷自怕亚洲精品| 国产91美女高潮| 亚洲AV永久无码精品成人调教| 国产AV色黄看到爽| 国产大学生高潮在线播放| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 亚洲AV永久无码一区仙野| 男人的天堂欧美| 极品色| 亚洲精品丝袜-不卡成人免费……| 无码九九九九| 久草五月| 欧美日韩啪啪电影| 久久9亚洲| 亚洲性高潮| 91九九| 久久黄人人爽视频| 91婷婷伊人狠人| 亚洲国产综合视频| 免费看污网站| 岛国片在线播放| 亚洲精品 欧美精品| 在线看片国产精品每日更新| 国产蜜臀精品一区二区尤物| 91亚洲不卡一区| 日韩精品中文字幕人妻| 加勒比海成人视频网| 国产欧美亚洲精品a第2页| 精吧天堂| 91色久| 熟妇xxxxx性春色| 狠狠入| 97在线观看免费| 久婷婷一区| 97操97色| www.久久爱| 亚洲免费人妻在| 日韩美女操b| 国产av波波国产精品| 在线a亚洲视频播放在线| juliaann丝袜| 九九操久久国产免费视频| 日韩青久久| 97超级色碰碰| 91天堂丝袜美腿| 日韩综合色网| 超碰色美女| 91精品国产91久久久久久久久久久久| 亚洲高清无码在线桃色| 亚洲精品三区在线观看| 欧美自拍偷拍综合图片| 另类TS人妖一区二区三区 | 激情情色五月天| 台湾佬中文娱乐网久久久久久久久久com | 中国探花熟女| 91 国产丝袜在线播放-百度| 国产欧美一区二区| 精品亚洲天堂| 在线观看A啊啊啊| 亚洲精品99999| 欧美熟妇精品黑人巨大91| 99热一区二区三区四区| 国产精品农村妇女精品| 精品一区二区三区18| 亚州综合色| 久草尤物| 日韩人成网站在线播放| 色官网在线| 五月丁香激情综合| 久久国产视频专区一二三| 色五月天AV| 夜夜爽夜夜摸夜夜操免费视频| 97超碰影音| 久 久无码人妻AV| 亚洲av综合伊人久久| 日本十八禁免费看污网站| 99久久久er直播网址| 五月婷婷六月天| 大香蕉伊在线久草麻豆天堂故事| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 四虎永久在线精品免费网址 | 无毛精品| 夜夜草网站| 一二视频神马久久传媒| 丁香五月天激情综合| www鬼畜国产男人的天堂| 九九九久久久久| 999九九精品| 亚洲国产欧美中日韩成人综合视频| 色婷婷五月综合激情中文字幕| 日本 情色 1区2区3区| 亚洲天堂资源网| 国产嫩草精品A88AV在线| 91精品国产麻豆国产自产在| 东北女人高潮视频| 狠狠2050在线观看| 超碰在线人人射| 久久久com| 中文字幕78| 超碰在线91| 国产对白刺激视频| 亚洲精品官网在线观看| 色婷婷六月| 亚洲中文日韩精品| 免费一级欧美片片线观看| 97露脸精品丝袜| 亚洲 欧美 日韩另类 麻豆| 麻豆91熟妇人妻中文字幕茄子| 97chaopenrihan| 69一区二区三区 | 亚洲欧美日韩综合在线尤物| 亚洲天堂性爱| 午夜欧美精品久久久| 性无码专区2020| 色爱三区| 小草av不卡亚洲二区| 欧美色图片色哟哟| 免费精品中文字幕| 97精品国产97久久久久久免费| www.AV有限公司一区| 欧美激情内射| 99热最新| 久久精品高清无码一区| 国产黄色在线播放观看| 天天日少妇逼AV| 人妻丝袜肏逼| 青草草免费网站av| 日本九九久久99播| 欧美色图电影| 91欧美| 超碰是碰在线观看| 最新中文字幕精品在线| 少妇人妻精品| 精品久久久久久无码| 欧美十八禁在线看| 97天天插| 欧美图片偷拍| 久久精品久久九九精品| 图色综合网| 神马九九| 成人天天爽| 麻豆国产视频精品观看| 成人一区二区三区四区| 丰满精品人妻少妇久久字幕| 67194无码不卡| 妇女乱色二区| 久久久久久大| 日韩一级成人毛片免费观看| 人妻欧美| 老司机午夜精品福利视频一区二区| 久久激情五月| 亚洲成人日韩小说| 在线亚洲欧美| 国产青青综合伊人| 91精品成人| 超碰在线看| 神马久久久久久| 麻豆一区在线| 人妻久久久久久久久久久久久久久 | 九九热在线视频| 久久精品久久九九精品| 亚洲色图欧洲| 四虎免费视频| 久久精品老司| 日韩AV电影网站 | 五月婷丁香| 狠狠久久手机视频精品| 精品无码一区二区三区| 爱爱动态试试看6 0秒| 综合色色网| 亚洲色系另类精品国产| 99人妻| 中出20p| 伊人网在线观看| 夜夜中出国产| 午夜男人一级A片7777| 黄色电影在线播放综合网站| 97无码视频在线播放| 欧美亚洲系列| 欧美洲精品一级| 亚欧中文字幕在线视频| 97AV爱| 少妇滛荡视频| 91快色色色色色| 欧美不卡在线一区二区| 久久久久少妇| 好吊色青靑草| 精品在线78| 精品一区二区久久| 欧美精品丝袜久久久中文字幕| 97久久久| 久操不卡视频| 国产一区二区三区导航| 精品九九国产无码| 日韩免费高清大片在线| 日本视频在线中文字幕| 97资源久久| 97超级久久| 91欧美少妇| 97欧美色综合| 97伪v| 亚州熟妇精品| 蜜臀久久久国产| 高树玛利亚无码流出| 欧美|91色综合| 91无码中出人妻视频| 中文字幕性感少妇av| 国产精品免费美女视频| 综合久久六月久久婷婷| 秋霞影音一区二区三区| 国产精品一二三在线看| av网页一区二区三区| 国产99精品一区二区三区免费| 久久精品午夜国产亚洲AV无码| 欧美亚洲中文| 国产精品午夜AV完会免费| 激情色图| a片自拍直播视频| 亚洲情色欧美| 五月天婷婷在线看 | 东北女人无套内谢视频| 91狠狠| 17c嫩草51久久91嫩草| 中文字幕欧美丝袜07资源| 欧美 亚洲 第一页 | 日本精品免费一区二区三区四区| 欧美日韩少妇色情| 亚洲日韩少妇一道本视频| 97就爱干| 青青操在线视频| JuliaAnn丝袜熟女系列| 久久精品国产亚洲AV清纯| 激情小说亚洲| 一级人妻性爱视频| 亚洲1区2区三区高清中文字幕| 日操粉逼逼| 亚洲精品日日夜夜52| 亚洲欧洲综合视频在线| 美女尤物福利视频| 亚洲第一色页夜| 青青青艹在线视频| 春色综合免费| 日韩射精| 国产精品久久久久久久电影渣男| 99久在线精品99re8热视频在线| 亚洲麻豆18发?| 黑白配性爱AV成| 九九碰九九爱97超| 成人一级性爱| 丁香色五月 97干| 久操综合在线| 中文字幕十五区| 国产热av| 午夜性刺激视频免费观看| 国内毛片热久久思思热| 久久久精品无码亚免费| 七久久久| 综合网久久| 欧美性天天影院| 欧美se综合| 亚洲av综合伊人久久| 日韩一级成人毛片免费观看| 男人的天堂网免费| 蜜桃色院一区久久| 天天夜夜rb| 蜜乳成人AV| 操逼操操操91| 久操操| 精品少妇一区二区| 亚洲天堂五月天国产| 久久亚洲精品成人av| 欧美日韩夜夜| 九九人妻| 麻豆天美传媒毛片| 中文字幕日本久久| 一区中文字幕二区日韩| 伊人97| 亚洲精品乱码线路中文字幕 | 999狠狠综合| 精品国产国产AV| 亚洲高清色综合| 国产一区自拍欧美日韩| 久热这里| 成人天天爽| 国产91影院| 中文字幕性感少妇av| 午夜男人天堂| a啊啊啊啊啊啊啊啊一区二区| 国产黄色在线播放观看| 蜜桃久久综合视频| 欧美第二页午夜| 26uuu久久| 色五月婷婷久久| 2026国产精品视频| 国产兽交视频在线播放| 高清在线偷拍自拍视频| 久久久久ab| 色噜噜狠狠色综无码久久合欧美| 成人免费福利在线观看| 高清不卡国产| 日本在线999| 啪啪啪精品视频| 夜夜操天天肏| 日本不卡五区| 大香蕉人妻| AV男人天堂网| 国产精品视频一区二区三区八戒| 欧美色图片91| 亚洲97| 色色色综合网| 在线洲亚线| 一区二区视频在线播放| 日韩欧美偷拍美女视频| 成年人网站在线免费观看| 婷婷色网| 午夜啊啊| 九九Av| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 人妻天堂三区| 日韩亚洲Av人人夜夜澡人人爽| 蜜臀久久在线视频| 99婷婷一区二区| 熟女丰满人妻一区| 久久精品国产97欧美精品亚洲 | 日日骚精品视频| 大屁股人妻女教师撅着屁股| 亚洲aw毛茸茸在线| 激情综合网激情综合| 男人的天堂2019AV| 97资源久久| 骚逼高潮久久精品| v91av| 色色色热| 日本韩国五十路六十路七十路老熟女作爱视频网站| 五月婷婷丁香中文字幕| 伊人嫩草| 亚洲经典啪啪| 日韩精品午夜操呦呦不卡影院| 99热这里只有精品地址| 欧美性第1页| 天天插天天操| 欧美劲爆第一页| 一本久道久久综合狠狠爱| 91中文字幕制服丝袜免费视频| 激情婷婷丁香| 国产精品诱惑| 91 国产丝袜在线放观看 | www.色婷婷.com| 国产精品久久久亚洲第一牛牛_在线观看| 国产无马av| 精品69网| 亚洲aw毛茸茸在线 | 十八禁黄色| 丁香五月婷婷基地| 久久人妻| 精久久久91| 亚洲精品无码久久AV| 无毛精品| 91久久婷婷| 人人摸人人入| 欧洲精品一区二区三区| 影音先锋乱| 91欧美情色| 婷婷五月天影院| 黑人娇小av在线播放| 亚洲另类色图片| 精品国产91av一区二区三区| 久久久久久免费电影| 日本色色色| 91少妇| 亚洲天堂人人妻| 久久一级无码精品毛片6| 久久精品操| 色av中文字| 国产成人精品必看| 色踪合AV| 亚州精人品大香蕉| 国产精品免费久久久久久久久久| 精品网站99999| 日韩av不卡在线观看| 亚洲久久久| 天天做天天爱天天爽AV| 黄片不用下载在线观看| 干超碰碰熟女| 91久久久老司机| 久久精品99| 黄人人操人人操| 疯操AV| 91在线限制级| 你想操日本小逼吗| 色网亚洲人| 青青草视频在线观看一区二区| www.伪伪| 精品传媒在线一区| 欧美78| 人人爱操| 草草影院最新网址| 四方色播| 人妻超碰青青草98| 精彩视频日韩| 欧美在线播放aaaa| 免费成人自拍视频在线| 老熟妇一区二区三区| 久久久影院| 国产精品无码AV网站| 韩国免费播放一级毛片| 性高潮久久久| 国产青青美女玩逼视频| 97亚洲综合电影| 热99这里只有精品| 老司机深夜18禁污污网站| 欧美色图另类图片| 婷婷五月天无码| www鬼畜国产男人的天堂| 在线可观看的黄色网址| 呦呦影院| 玖玖爱影院| 亚洲诱惑| 欧亚第一综合网| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 国产亚洲一黄| 国产家庭乱伦网址| 亚洲成人黄色在线观看| 怡红院成人视频| 很狠操| 久久精精区一区二区一蜜桃一区二区| 澳门特级毛片免费观看| 国产成人无码啪| 熟妇乱伦一区二区| 中文字幕视频在线观看| 综合一区二区影视| 精品国产72| 欧插网站| 天天综合精品| 女人被添高潮免费视频| 国模不卡| 无码精品久久| 欧美精品成人一区二区在线观看 | 午夜福利在线合集| 中文字幕一区 二区三四五 区日 日骚| 中文字幕一区二区无码成人| 日韩综合97P| 亚洲情色在线| 亚洲 图片 欧美 色图| 欧美黄页在线| 九九热精品| 凹凸视频特色日本特黄| 极品美女福利在线观看| 欧美αv.com| 人人贴人人摸| 欧洲亚洲国产综合在线| 日韩激情电影中文字幕| 五月婷亚洲精品天堂| 九九久久久| 欧美高清16| 亚洲女优有码无码高清| 日韩欧美久久婷婷网站| 亚洲se电影| 欧美高清在线| 超碰色美女| 欧美最婬乱婬爆婬牲视频| 人人九九精| 大香蕉在线SuP| 欧美精品,四区。五区| 午夜AV污污污| 懂色影视久久| 97国产中文| 日1区2区3区2020| 青青草综合在线| 东京热91| 亚洲久久久| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 新亚洲无码| 一中国女人毛片水真多| 极品销魂美女一区二区| 黄片免费日韩| 国产美女自拍AV| 熟女乱伦A| 久久九九视频九九视频| 欧美熟女操屄| 综合色色婷婷| 艹我哪美一区无码| 欧美淫穴| 爱爱动态试试看6 0秒| 一区二区三区 丝袜高跟| 欧美中文字幕一区| 动漫片子网站3黄| 四虎国产成人精品免费一女五男| 极品久久久久久久久久久久久久| 成人在线午夜视频一区| 男人天堂久久精品不卡| 欧美一区二区| 99精品九九九九九九| 久久神马| 无码人妻精品一区二区中文| 亚洲成人免费中文字幕| 亚洲无码久久久久久久| 99无码精品| 青青操97| 高清肉丝中文无码| 亚洲影视高清三级-草1024榴社区入口-品爱AV| 校园春色亚洲色图| 国产精品诱惑| 无码国产Av| 激情五月天社区| 久久久久久亚洲精品不卡人乳| 日韩精彩免费| 曰韩少妇无码| 综合久久2017| 亚洲黄片免费在线播放| 国产福利小视频高清在线观看| 91性高潮久久久久久久久| 久久婷婷热| 操我啊啊啊啊啊| 精品人妻伦一区二区三区久久| 亚洲在线a| 黄色视频60分钟| 亚洲成人久久美女| 99re这里只有精品中心播放| 东京热精品97综合网| 97久操| 一起草在线视频| 一类av片在线看| 色噜噜人妻丝袜a∨先锋影| 欧美亚洲丝袜人妻制服99| 精品小视频在线| 日本2020一区二区| 强被迫伦姧在线观看无码网站| 人人操人人大香蕉| 欧美人妻精品| 天天天堂影视日韩亚洲91| 九九热三级片| 久久美女国产| 九九毛片这里只有精品| 日本精品九九九| a级免费在线观看| 国产浮力影院第1页| 炮色五月| 久久久久深夜无码| 国产精品原创巨作?v网站| 欧美日韩999| 久操视频资源站公开| 91色艳| 99re在线视频这里只有精品| 亚洲人成在线放东京热| 久久香蕉国产线看观看猫咪av| 大香蕉免| 伊人操| 很很热性爱视频| 艾草av| 99热婷婷一区二区三| 中文日本免费高清| 国产成人资源| 激情内射| 成人影院永久免费观看网址| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 丰满人妻一区二区三区性色| 99热免费| 极品一区二区三区免费| 91综合色噜噜| 丁香六月激情| 亚欧美无遮挡| 免费观看国产小粉嫩喷水精品午| 日本人体九九九九九九| 蜜桃臀一区二区三区久久| 成人无遮挡毛片免费看| 欧美日韩色图片| 有码专区最新中文字幕有码| 美女一区二区国产精品| 综合天天网| 久久在线观看免费视频| 玖玖视频在线资源一区二区三区| 欧美韩日精品99综合| 色综合av男人天堂| 美女91在线观看| 国产区日韩区在线观看| 亚洲无套久久嗯嗯| 久久九九97| 深田咏美亚洲精品福利社| 国产精品一区二区后入| 日本三级A片网站com| 屌逼麻豆| 精品亚洲天堂| 五月丁香啪啪啪| 热热色色综合| 园内精品自拍视频在线播放| 久操综合在线| 亚洲色阁| 精品区9| 国产精品禁久久久精品| A片 AV一级在线播放观看免费| 2026国产精品视频| 男人天堂黄片| 欧美传媒一区| 久久精品毛片免费不卡| 99热 按摩 日韩| 国产精品爱欲| 黄色不卡视频| 7777奇米影视久久| 精品一区二区3区| 日日黄色三级网站| 成人a级高清视频在线观看| 你草精品在线视频| 五月天久久综合网| 亚洲第一色页夜| 91人妻最真实刺激绿帽| 男人精品天堂一区| 免费啪啪一级视频| 精品无码产区一区二| 国产激情av女片自拍| 五月婷婷青青草娱乐伊人| 国产精品免费视频人成| 天天干1区2区在线| 国产精品秘 福利姬在线观看| 亚洲春色欧美| 狠狠色综合网| 欧美色999| 国产嫩草精品A88AV在线| 无码免费在线观看黄色片| 中文字幕神马久久| 欧美黄片欧美黄片xxx| 欧美日韩系列| 色色色综合| 日日爱99| 台湾大香蕉99热| 久久久久久国产无码精品| julia ann久久| 久/久精品99看9| 天天肏视频| 一区麻豆 高清中文字幕| 久久久久久久伊人精品| 久久久久久中文版| 超碰成人公开| 淫穴高潮色图| 精品女人999| 超碰在线人妻中文字幕| 夜夜夜夜爽| 99在线精品视频| a男人的天堂久久一级A毛片 | 久久精品高清无码一区| 婷婷五月丁香五月| 人妻精品视频一区二区三区| 十八禁黄色成人网站观看| 国产家庭乱伦网址| 果冻传媒A片麻豆熟妇人妻| 人妻AV 中文字幕的| 八戒午夜福利理论片| 97超碰这里只有精品| 亚洲激情网| 一级片视频啪啪| AV色五月天| 亚洲综合五月天婷婷丁香| 一个色导综合| 亚洲风情综合网| 色综合一区二区三巨| 无码免费在线观看黄色片| 久久久九九| 天天综合网一91网| 亚洲AV无码AV吞精久久久久 | 射 色综合| 日韩无码三级影院| 91欧美情色| 欧美性暴力猛交XXXX | 超碰97久久| 走光一区92下载| 这里只有精品视频| 黄片免费视频2019| 九九九九一区| 黄总AV色图| 插欧洲美女欧美精品| 日本乱人伦片中文三区| 黑人综合色| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 久综合国内精品自在自线| 日本二区不卡| 欧美精品偷拍| 国模精品一区二区三区苹果色戒| 国产a片操逼| 成人小电影网站tex| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 亚洲国产综合久久久性感熟妇| 天天做日日做天天欢。| aaa亚无码专区| 色69大色97香蕉| 日日干夜夜操视频h| 色情五月丁香| 人妻干天天| 操人妻视频| 色97综合中文字幕| 中国小夫妻勾搭露脸淫荡对白| 激情六月天| 唐山老熟妇露脸啪啪叫| 成人蜜乳小视频网站| 97超级久久| 操操操操操操| 久久99国产综合精品女同| 日本肉体xxxx裸交| 探花一区二区三| 91东北熟女| 欧美最婬乱婬爆婬牲视频| 好看的久久不射无码影视影院| 内射白嫩美女| 中文操嬖片。| 日韩三A大片在线观看| 欧美综合亚洲综合| 伊人久大| 内射中国少妇高清视频免费视频| 欧美黑人性猛交91| 六月婷婷综合| 日本亚洲熟女视频| 欧美日本中字另类在线| 亚洲另类欧美精品| 啊啊啊在线观看| 女人18精品一区二区三区| AV99热18这里只有精品| 日少妇亚洲版| 亚洲精品蜜桃久久久一区二区三区| 久热伊人| 国精精品无码一二三区水多多| 亚洲精品国产熟女| 亚洲成人黄色在线观看| 天美精品原创av片国产| 成人性生活高清视频在线播放| 夜夜嗨老熟女AV一区二区三区| surenchaopeng| 一区二区三区日韩欧美| 老鸭窝亚洲毛片| 亚洲天堂中文字幕无码男同| 91九色精品熟女内射| 狠狠操夜夜| 亚州免费啪啪视频| 亚洲精品一区二区精品| 激情小说图片亚洲首页| 国产精品不卡av免费在线观看| 日韩少妇无码| 91欧美大片| 啊啊啊啊啊啊在线观看| 精品在线蜜臀| 天天爽天天操啊啊啊| 花花AV导航| 校园春色亚洲| 在线综合网| 国产老太乱伦一区| 国产农村妇女精品| 翔田千里AV无码秘 三区| 成人免费性爱视视| 男女啪啪啪18禁网站| 欧美岛国精品在线观看| а√天堂资源官网在线资源| 97超碰人妻| 91AV入口| 免费?级毛片无码?∨蜜芽试看| 亚洲国产av中文字幕久久| 亚洲熟女精品| 成人五级久久| 中文字幕交换人妻| 色色色天美视频| 三级片网站在线播放| 色色婷婷五月天| 久久婷色| 男人的天堂网免费| 97综合在线观看| 中文字幕av久久爽Av| 91挑色欧美| 久久女女| 超碰97综合| 免费AV中文网在线观看| 大香蕉免费3| 妇女性内射冈站HDWWWCOM| 欧美经典一区二区三区| 亚洲Av无码成人精品国产| 久久五月视频| 日韩人妻资源网| 欧洲综合视频| 国产女同性恋视频| 久湿久久| 青草地一本线一区二区三区| 中文字幕乱妇免费视频| 亚洲天堂欧美| 国产日韩精品人妻久久久久色欲网站| 一级毛片久久久久久久女人18| 亚洲精美粉嫩嫩泬在线观看| 99久久网站| 天美av在线观看| 国产青视频| 丝袜美腿91| 老女人综合网| av天堂精品久久| 人妻熟女av国产网站| 激情六月天| 亚洲视频,小说| 色777999综合| 欧美天天综合网| www.久久制服糖| 牛黄色久午久| 97精彩视频网站| 少妇精品久久久| 国产中文字幕在线观看| 在线日韩日本亚洲国产| 国产成人亚洲精品无码古代早漏男| 色五月丁香五月| 蜜臀久久99精品久久久久免费观| 国产精品国产| 国产97av| 蜜乳视频网站| 欧美顶级黄片AAAAA在线免费看 | 激情四射五月天| 久久久久久无码人妻中文字幕| 九九综合九九综合| 思思热影视| 久久亚洲影院一区二区| 青草视频人妻在线观看| 蜜臀久久99精品久久久久久无删减| 精品久久久久久中文字幕三区| 欧美人人AAA| 有码免费观看| 韩国嫰模上门援交视频| 91w欧美| 日韩欧美字幕亚洲一区二区| www.97在线| 91四海无码日韩欧美| 日本羞羞的视频在线播放| 五月婷婷丁香中文字幕| 青青草视频久久久久| 人人妻人人爽一区二区三区| 久久青青草原免费视频| 丝袜美腿欧美| 看看日B真人视频| 无码操逼视频一下| 精品久久99| 国产十八禁视频| 日韩大香蕉| 天天躁日日躁AAAXX| 今日头条成人一区二区三区四虎精品| 亚洲黄色电影| 九九干| 久久精品一区二区三区不卡| 国产99999久久精品| 日本性感人妻91| 大香蕉啪啪网| 亚洲AV在线资源| 日韩免费一级性爱视频| 另类视频在线| 国产久久男人天堂| 精品亚洲一区在线观看| 亚洲人妻一区二区三区| 亚洲欧美日韩中文久久自慰| 日韩一级久久毛片| 少妇高潮99p| 国产美女91| 操逼片中文| 青青操在线亚洲视频观看欧美在线| 麻豆天美传媒毛片| 国产精品原创巨作?v网站| 黄色电影观看久久9| 天天爽天天| 欲色啪| 八戒无码国产午夜福利| 你操综合| 色97干| 另类在线| 久久成人东京热人妻| 一区二区三区探花在线观看| 伊人成人情色综合| 一区二区三区免费视频入口| 999久久久精品国产| 久久亚洲一区女同性恋中文字幕 | 日韩激情毛片一级久久久| 天天肏美女| 丝袜亚洲综合| 色欧美天天| 日本二三四区| 久久亚洲精品成人av| 97久久天天综合色天天综合色电影| www亚洲免费| 韩国女主播青草在线| 少妇综合网| 97青青操视频| 啪啪啪综合网| 久久久婷婷婷| 久久久555| 九九久久综合| 欧洲色综合| 天天弄天天操| 农村少妇久久久久久久| 亚洲色啪| 天天操妹子| 久久99午夜精品一区人妻| 日韩资源网| 国产精品视频一区二区三区八戒| 日韩美女高潮喷水视频| 日本东京热久久久电影| 色九月综合| 中文字幕美女91| 啊啊啊啊啊在线视频| 尤物网址| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 天天做日日做| 99热18这里只有精品| 五月天玖玖资源站| 亚洲伊人青青草| 曰本人妻人人澡人人夹| 蜜臀aV午夜一区二区三区| 懂色AV蜜臀无码精品APP| 男人的天堂三级| 日韩啪啪啪啪啪| 97超碰超碰| 日韩三级网址| 极品销魂美女一区二区| 亚洲 另类 丝袜 自拍 动漫| 中文字幕乱在线伦视频中文字幕乱码在线 | 78m啪啪啪|