国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成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)配置命令再自己處理廠商芯片的識(shí)別邏輯。我見過有人在這個(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ù)??刂苽鬏攧t用來做設(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)接板識(shí)別成可用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兩種常見芯片的組合識(shí)別碼。不同廠商轉(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í)別的設(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ā)送鏈路指令組包、異步寫入和失敗降級(jí)發(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è)幀的間隔不建議硬編碼毫秒級(jí)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)先級(jí)或者直接用后臺(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)答號(hào)。這種程度的改動(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
返回資訊列表
啊好爽快点-国产一区二区三区撒尿在线-成人AV| 黄色操人| 大香网伊人久久综合网eew| 久久久亚洲欧美综合| 91女日逼| 色哟哟av| 九九九九九九九九九九九九九九九女| 精品人妻伦一二三区久久| 26uuu最新| 看看日B真人视频| 116美女午夜| 国产自产一区视频在线| 在线免费观看高清无码视频| 婷婷五月天激情四射| 97欧美色综合| 91中文精品日韩欧美在线| 九九av| 91天堂色男人的天堂| 成年人黄色视频免费| 東南亚性呦成人伦理资源在线视频| 久久综合中文国产| 久久理论字幕视频| 人妻天堂综合网| 亚洲操人| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 狠操91,com| 国产夜夜操| 密臀视频一区二区三区| 1956日韩精品| 久久极品一区二区| 少妇蜜汁| 成人熟女视频一区二区三区| JULIA人妻风俗店中出电影| 天天插天天插| 好湿好紧好爽 视频| 亭亭丁香激情| 欧美激情欧美精品| 久久久久久9999| 日夜久久久九九九久| 欧美大香蕉在线观看| 黄色高清久久无码依人| 日韩精品大香蕉伊人在线| 操逼999| 久久99精品国产| 性性久久| 精品国产乱码久久久影院| 99re99在线视频| 91高清日| 亚洲加勒比| AVE乱伦| 操婢日韩| 亚洲国产激情国产av| 五月天开心网| 久久久久亚洲一区女同性恋中文字幕| 激情五月天校园春色网| 熟人人妻少妇精品久久| 国产无码精品高清| 亚洲色诱惑| 国产亚州日韩欧美看片| JULIA人妻风俗店中出电影| 熟女啪啪视频| 人妻人妻天天碰| 无毛精品| 色欲av一区二区三区蜜芽| 亚洲一卡2卡3卡4卡乱码网站 | 天天天肏屄欧美| 91欧美另类| 密臀成人视频久久久| 欧姜老司机| 摸奶性爱视频网站在线免费播放| 强奸乱伦中文字幕AV| 99视频精品| 中文字幕丝袜人妻| 精品视频在线观看精品| 亚洲AV成人无码久久精品播放| 91精品综合久久久久久五月丁香| 亚洲精品 超碰| 果冻传媒A片麻豆熟妇人妻| 一本色道久久天天射天天干| 97色碰| 久久久久久久久久久久黄色 | 丰满人妻-区二区三区免费看 | 97色婷婷| 啊啊啊啊免费视频| 九月丁香婷婷色| 国产成人网站在线观看| 粉嫩小泬久久久一区二区| 国产精品白丝AV| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 国产热av| 国产综合日韩伦理| 激情五月婷婷综合| 密臀国产在线| 日韩欧美大力操| 在线综合 亚洲 欧美中文字幕 | 超碰97人人乐| 天天做日日做天天欢。| 青青草吊丝| 日本国产二线女色| 丰满人妻一区二区三区四区| 99re69综合| 美女高潮国产高清| 成人精品在线| 亚洲se电影| 日韩操逼HD| 日韩精品.久久精品.AV女优.天美传媒| 美女干逼2| 国语av狠狠色丁香婷婷综合激情| 色色色99| 国产97/欧美| 国产AV无码AV| 熟女少妇一区二区三区| 免费强奸av| 美女裸体麻豆天美蜜桃91| 人人弄人人摸| 国产精品午夜高潮呻吟久久av| 女一区二区| 欧美精品一二三| 色婷视频| 久久久久久久| 天天色悠悠激情| 国内一级精品| 手机av天堂久久久久| 偷拍 亚洲 欧美| 亚洲午夜免费狠狠干| 亚洲精品熟妇1区2区3区。| 无码聚合| 欧美性高潮在线| 伊人久久大香大香线蕉中文| 欲色综合| 人妻久热在线| 日本熟女中文字幕一区| 夜夜黄| 五月婷婷爱六月丁香色| 亚州欧美另类| 国产性感在线观看| 久草视频在线视频在线视频在线观看| 91白嫩| 情色日播放AV| 淫荡少妇免费| 日本精品网站在线中文| 久久久专区| 国产色精品午夜大片| 蜜臀久久99'精品久久久| 欧亚在线视频| 电家庭影院午夜69久久夜色精品国产69乱 | 在线观看一级α片刺激高潮视频| 性爱AV天堂| 欧美日韩国产色图在线| 亚洲日韩人妻中文字幕一区| 后入日本1234| 99999久久久久9国产精品| 九月丁香婷婷色| 韩日欧亚a级| 4141514逼喷水三级片| 色综合V| 人澡逼| 天堂九九九九九九九九九| 国产亚洲精品A在线观看下载| 免费97视频| 一级特级aaaa毛片免费观看| 91亚州欧美| 秋霞曰韩R级| 亚洲欧美在线丝袜| 欧洲与亚洲欧美精品中文字幕| 乱伦Av网| 欧美高清18A片| 欧美78| www.久久久久| 一牛影视成人片免费| 欧美一级二级三级| 偷拍综合亚洲| www鬼畜国产男人的天堂| 岛国视频一二三区| 91精品人| 好爽视频在线观看视频 | 骚妻少妇精品性色无码四色A V| 色婷婷电影网| 亚洲福利中文字幕在线| 老熟妇一区二区三区…| 欧美精品久久久久久久丰满| 青青草一区二区高清无码视频| 在线天堂999| 99久久99久久综合| 亚洲中文字母在线播放| 国产精品成人久久一区二区三区| 99夜夜操| 欧美综合1性辶| 九九热精彩视频| 日韩精品人妻中文字幕久久久| 九月色婷婷| 日韩中文字幕二区| 91在线精品| 乱伦图av| 亚洲第一精品在线视频| 97无码视频在线播放| 四方色播| 少妇无码av专区线| 高潮精品| 色欧洲| 熟妇人妻精品一区二区| 欧美色图小说综合| 91精品人妻啪啪间| 高清孕妇孕交 交| 大香蕉视频啪啪啪啪| 呻吟 欧美 日本 中出| 一区,二区,三区视频| 欧美日韩电影一区二区| 中美日韩毛片| 综合网久久| 伊人久久大香线综合无码| 殴美牲| 无码免费一区二区三区啪啪| 狠狠 91| 五月丁香六月激情| 人妻激情另类| 亚洲天堂另类小说男人| 中文字幕版| 日本一二三高清| av天天在线| 亚洲十八禁止| 高清无码学生妹高潮| 91在线一起| 久久久月天| 97色亚洲| 中文字幕一区二区三区字幕| 波多野42部无码喷潮在线观看 | 九九久久综合| 小草精彩毛片| 久久久久78| 国产精品乱码久久久、久久| 欧美色院| 丝袜美腿制服人妻二区中文字幕 | 精品视频久久久久九九九九9999 | 国产路线专区| 91被操| 人人操人人插人人摸人人干| 亚洲精品一区二区三区在线播放| 丰满人妻-区二区三区免费| 91亚洲不卡一区| 黄呦呦在线| 超碰精品人妻狠狠干| 偷偷人人精品女女久久| 我要去看2个日本美女.com曹逼| 国产强奸乱伦欧美| 91人妻素女| 长长久久免费视频| 久久超碰av在线| 欧美亚洲系列| 国内亚洲精彩视频在线| 色色亚洲| 久久人体一区二区| 久久久久久久久久8888| 中文字幕老熟妇黄色视频| 久久一留热品黄| 97久久精品不卡| 久久久久久久97| 欧美一级久久久丰满| 超碰人人在线| 色老牛| 97色在线视频| 激情久久久| 亚洲 日本 国产 综合| 久久社区一区二区三区| 丁香五月天婷婷姐| 国产馆| 26uuu国产成人综合| 青青草视频久久| 色老汉玖玖爱| 97网色| a片在线播放| 大色综合网| 国产夜夜艹| 天天影视综合色| 8x福利精品第一福利视频导航| 欧美在线视频99| 九色 蝌蚪 熟女自 | 欧美性爱十八禁| 天天香香欲综合| 91久久青青草原精品| 91精品丝袜在线观看| av麻豆啪啪| 欧美日韩午夜精品一区二区三区| 日韩二三区| 欧美日韩中文视频播放| 校园春色制服丝袜中文字亚洲| 激情内射| 日本日皮视频逼| 天天日熟妇| 你想操日本小逼吗| 久久亚洲色图中文字幕| 欧美一级黄片视频在线| 夜夜嗨绯色| 国产JDAV无码视频在线观看| 97精品97| 日韩亚洲精品一区二区| 日韩97精| 99熟女| 东京太热男人的天堂久久久| 五月丁香影视| 欧美一级A一级a爱片久久| 欧美久热| 天天日夜干| 日韩人妻少妇中文字幕| 国产强奸乱伦无码视频| 日日黄色三级网站| 乱伦1色页| 偷拍五区| 天天透伊人| 国产JDAV无码视频在线观看| 激情内射| 青青草日韩无码| 97这里只有精品| 97天天做| 黄片www.| 午夜爽爽爽| 亚洲成人一二三区| 美女一区二区国产精品| 97色操| 欧美色棕合| 亚洲天堂五月天国产| 久久 久久国内精品亚洲| 国语对白在线播放视频| 男人天堂东京热| 九九九久千久久激情蜜桃在线看 | av凤凰久久久| 极品少妇久久久久| 久久久影院| 黑人美精品 A片| 91精品婷婷国产综合久久| 国产这里只有精品| 国产乱伦亚洲| 成人AV素股で擦久久| 五月天婷婷久久| 人人操,人人液| 色 亚洲 91| 免费啪啪啪网站18岁| 色逼综合| 日本熟妇精品九九| 岛国AV一区二区电影| 97人人操人人摸人人爱| 欧洲精品一级二级精品综合视频综合 | 欧美很很操视频| 欧美天天性| 清清草影| 欧美不卡在线美女| 日人妻视频91| 成年无码动漫av片无尽在线| 久欲AV| 欧美一区二区三区大综合| 福利在线黄片| 91香蕉视频在线观看免费| 密臀在线视频| 亚洲精品 欧美精品| 男人夜色天堂ss| 国产AV久久野战精品| 国产精品网址| 欧美亚洲系列| 激情婷婷丁香网| 色婷婷淫色网| 日本大香蕉| 99久久com免费视频′| 日本色色色色色视频| 欧美成人性爱视频在线播放| 999国产精品999久久久久久| 超碰久久精品| 人妻大香蕉| 久久大精品乱码视频人妻熟女| 色性荡荡荡荡视频| 青青草在线视频人人想人人上 | 无码137片内射在线影院| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 日逼97| 国内成人圈中文字幕无码视频| 色哟哟-国产专区| 超碰97起碰| 免费视频无码| 丁香六月婷| 97人人干人人操| 婷婷中文网| 成人日本视频人妻在线| 欧美成人一区二区三区在线播放| 国产精品蜜乳AV| 人妻-91porn| 日韩久久激情精品| 亚州操操穴网| 女人一区| 色www精品视频在线观看| 亚洲中文电影| 综合天天。| 久9爱精品| 97精品在线视频| 蜜臀久久久99久久久久 | 丁香婷婷大香蕉| www.yw尤物| 天天日天天插| 800zy一区二区| 久久超碰免费的| 99热 按摩 日韩| 无码人妻系列少妇| 久久久久久久久久久久色网| 上特色A在线| av毛片aaaaa免费看| 中文字幕第9页萱萱影音先锋 | 操操操操操操| 精品女同一区| 91综合站| 中文字幕一二区二三区人妻专区| 国产中文字幕曰本毛片| 欧洲色| 爱干爱射网啊啊啊| 四虎影视永久在线观看精品免费网站 | www男人天堂| 亚洲图片欧美| 91精品伊人久久久大香线蕉91| 99在线精品观看99| 五月天伊人| 日韩中文字幕宗合在线| 久久精品区| 国产无吗在线播放| 成人免费不卡在线视频| 天天看综合网| 久久9精品网站| 96久久久久久久| 性videos欧美熟妇hdx| 国产精品免费美女视频| 亚洲 欧美都市激情| 神马久久网| 国产精品一区二区三区四区五区| 蜜乳成人AV| 在线性黄高清免费视频| 韩国轻伦国内自拍一区| 熟妇无码视频三区| 狠狠久久亚洲欧美专区| 亚洲精品骚逼| 九九九九精| 亚洲天堂中文字| 欧美夜夜狠| 国偷自 一区二区| 韩国免费播放一级毛片| 屌逼麻豆| 97综合久第一页| 看免费的黄片| 暖暖精品二区三区观看| 大茄子熟女AV导航| 极品尤物女神在线观看| 天堂精品小草| 日韩熟女三十乱伦| 黄页大片在线观看| 揉揉日日日日| 久操精品网| 亚洲一区亚洲天堂| 成 人片 黄色大片| 人妻在线中出视频| 97视频在线看| 中文啪啪视频| 裸体1区| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 亚洲色图欧美色图综合| 日本3级一区二区免费| 人人人人插| 去干网最新版| 国产成人精品网站| 国产精品电影| 在线视频日韩欧美国产| 不卡超碰护士AV在线免费播放| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 激情文学小说一区二区 | 99少妇| 一块操欧美性爱| 少妇一区二区三区高速| 精品久久大胆人体| 亚洲囯产精品女人久久久| 国产自产91区13区| 91精品国产91久久青草 | 91夜色chaopeng| 91久久青青草原精品| 六月丁香网| 欧美熟妇色| 99久热| 亚洲骚男同com| 亚洲成人久久一区二区| 少妇高潮九九九九九九九| 狠狠激情综合狠狠操中文字幕| 国内外毛片在线观看| 国产精品老师| 蜜臀久久99精品久久久久| 国产精品久久久亚洲一区| 人人弄人人摸| 久久熟女久| 操逼逼无码| 校园春色亚洲色图| 亚洲日韩欧美一区二区| 欧美日韩性爱视屏免费看了| 91老熟女视频| 大香网伊人久久综合网eew| 淫荡熟女乱伦网| 91美女高潮| 天天日少妇逼AV| 中国AAAAAA黄色片| 91网站18+| 丰满人妻-区二区三区免费| 国产区日韩区在线观看| 欧美亚洲高清不卡| 日产狠狠干| 啪啪视频亚洲第一| 午夜操一视频一区| 亚洲 se图 欧美电影| 国产高清26uuu| 一区二区三区麻豆| 天天操美美| 亚洲欧美精品一区天堂久久 | 婷婷伊人五月| 久久后入制服| 天天摸夜夜摸| 中文字幕在线日亚州9| 91视频精品| 亚洲AV色图一区| 天天弄欧美| 久9视频| 久久欲| 97超碰色色| 99热国产精品| 啊啊啊啊操死我了| 天天影视色香色欲| 亚洲精品亚洲人成在线麻豆| 欧美日韩啪啪电影| 国产久久久久久| 欧美色道啊| 91久久堂| 国产夫妻一区二区| 亚洲丝袜二区| 黄片在线免费在线观看| 这里只有精品视频在线观看麻豆 | 中文字幕国产精品1区| 最新啪啪视频| 国模不卡| 日韩精品一区二区高清| 亚洲日韩电影| 久久在肏| 香蕉精品二区二区| 欧美亚洲清纯| 久久综合久色欧美综合狠狠| 久久 亚洲 日韩 人妻| 色综合中文字幕不卡| 久久99网站| 欧美婷婷五月天| 欧美性巨大╳╳╳╳╳高跟鞋| 亚洲成人在线高清| 先锋影音av先锋一区| 日韩无码人妻| J?P?NESEHD熟女熟妇伦| 免费精品无码一级毛片牛牛影视| 美女91| 超碰在线91| 精品日日人妻| 精品久9| 亚洲高清欧美总合| 91n处女在线观看| 精品无av| www.91视频网| 亚洲AV无码乱码| 午夜爽爽爽| 97爱爱| 国产精品点击进入在线影院高清| 思思热在线视频免费| 日本伦乱九九九综合| 9国产超碰| 中国少妇XXXX做受| 99青草| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 99热在线不卡| 亚洲视频二区| 久久激情四射婷婷丁香五月天| 日韩射图| 亚洲国产综合图区中文字幕| 波多野结衣之双飞调教在线播放| 欧美中文字幕日韩在线| 国产操逼逼网| 99热综合| 91伊人大香蕉| 精品美女人人干| 日天天九九天堂666| 97资源久久| 美女操逼A A| 日韩av一级黄片| 欧美色色色| 嗯嗯嗯,草死我| 97视频www| 99精品九九九九九九| 丰满人妻aA一区二区三区| 91精品微拍福利| 日韩av影片在线观看| 98色网| 一区二区三区成人| 日韩一卡二卡三卡| 成人无码电影在线观看网| 自拍偷拍2025在线观看| 大香蕉 222| 成人精品水蜜桃久久久久久久| 人妻丝袜日本| 无码免费精品高清| 91女神在线视频| 国产自啪精品视频网站黑丝| 九九九久久久| 天天插天天操| 老女人老91妇女老热女| 在线不欧美| 熟女色综合久久| 67194无码不卡| 中日韩久久久免费看| 国产精品无码成人精品| 91久热| 91路www| 尤物视频视频官网| 久久激情视频| 很狠操| 99这里只有精品国产| 午夜免费视频1000| 蜜桃香蕉久草精品在线| 一线黄色免费性爱片| 好湿好紧好爽 视频| 97日韩欧美亚洲| 国产精品制服丝袜清纯唯美| 91美乳| 中文字幕一区二区视频在线观看| 中文字幕日本久久| 98福利在线视频| www.yeyecao| 久久色一区| 亚洲牲交| 欧美日韩国产中文超碰| 东京热,男人的天堂| 综合欧美日韩在线观看| 免费亚洲国产精品久久一区| 伊人丁香五月婷婷| 欧美 青青草| 96久久久| 精品国产一区二区久久| 国产传媒日韩| 欧美午夜精品久久久久久超碰| 日韩99999| 亚洲高清在线| 97se亚洲综合自| 五月综合久久| 97超碰9| 91粉芽高清在线一区二区| 97久久超碰日韩精品| 久综合网| 色香欲综合| 亚洲 欧美 91| 国产欧美在线观看免费观看| 亚洲中文字幕乱码无码一区二区| 人妻少妇久久中文字幕一区二区 麻豆| 99re综合伊人| 男女激情黄色网址| 亚洲 中文 欧美 日韩 在线 | 热久久无毒不卡| 在线v中文字幕一区二区三区| 99999这里都精品| 亚洲无码久久久久久久| 国产三级中文字幕粉嫩| 亚洲成av人片色午夜乱码| 超碰97伊人| 奸色色 男人天堂 天天射| 欧美一区二区三区不卡高清视频| 黑人中出21连凳花野真衣| 国产综合在线视频网站| 国产精品一级二级在线| 久久久久久人妻| 97视频在线| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 91精品国产91久久青草| 久久超碰98| 亚洲欧美精品福利在线| 99999国产精品| 91丝袜美女| 国产精品欧美日韩久久| 欧色网址| 伊人久久久日韩一区| 亚洲精品成人激情在线| 又大又大又大又粗爽高潮观看 | 91亚洲情色| 99国产精品久久久久久久成人热| 美女国产一区二区久久| 久久春色| 超碰免费欧美7| 日韩av女优在线免费一区| 国产对白刺激视频| 久久久久久久久久久久色网| 午夜精品久久久99| 国产剧情AV不卡在线观看| 欧美色图20p| 蜜臀th| 中日无幕一二三四区| 亚洲国产欧美另类自拍| 色逼综合| 视频在线中文字幕| 精品人妻1237| 激情专区综合| 国产人妖视频一区在线观看| 91熟女视频| 啊啊啊啊啊舒服| 亚洲日韩青青草色月| 久久伊人五月天| 精品中文字幕第一页| …亚洲黄色厕厕女女在线播…| 久久AV色| 日韩钢筋无码高清啾啾啾| 天天操天天插| 日本三级R| 精品日韩中文在线| 亚洲无码精品AV久久久| 国产97色在线| 美女91网址| 无码男人天堂| 吉田爱美AV在线| 人妻天天操天天爽视频免费| 久久99精品视频| 日韩国产成人自拍视频| 乱伦a片视频| 久操91视频| 久夜视频| 色妇综合网| 91日产桃蜜| 熟女熟妇伦久久影院毛片一区二区 | 91亚洲黄色网| 91AV入口| 嗯嗯啊啊好爽| 97国产精品一区二区传媒公司| 91在线/欧洲| 久久伊人青青草| 97 超碰 人人做 人人爱| 欧美人妻精品| 精品超碰中文在线| 色色五月婷婷| 97人人干| 丁香六月婷婷久久综合| 操人无码| 亚洲中文字母在线播放| 欧美综合第一| 熟妇熟女一区二三区| 日韩pv中文| 综合影院亚洲| 极品五月天噜噜| 精品国产自在在线99| ′ !γ}丶。。久久精品欧美一区二区三区| 99热99在线| 99热这里只有精品8| 任你草| 67914亚洲精品| 精品少妇后入一区二区三区四区人妻巨乳| 99在线精品观看99| 久久五月份| 欧美激情亚洲色图| 91精品成人| 国产精品午夜福利视频| 中日韩久久久免费看| 97色操| 国产高清亚洲日韩一区| 性久久久| 亚洲强奸乱伦影视网| 激情综合网五月婷婷| 色五91| 人妻在线大香蕉| 人妻美腿丝袜日韩| 97se亚洲综合自| 成人午夜高潮av猛片| 欧美色视频在线| 国模精品娜娜一二三区| 96精品在线| 日夜干射色啊| 91免费看中出视频| 精品人妻中文字幕高清| 欧美精品xxxwww| 99视频精品| 东北女人的毛片| 大干人妻| 国产福利一区二| 国产综合网站在线播放| 五月丁香综合网| 国产60区。| 疯操AV| 中文字幕精品免费一区二区| 国产亚洲精品美女久久久m| 五月天激情小说| 国产乱人妻精品入口| 好涩综合| 国产极品美女高潮无套在线观看 | 天天看天天综合成人网| 操死我了嗯嗯嗯| 大香蕉狠狠爱| 日本操大逼| 欧美制服网站美腿丝袜| 男人成人黄色视频在线观看免费下载| 91熟女在线| 国产家庭乱伦网址| 国产精品2020| 欧美78P| 强奸乱伦αv片| 五月天综合网| 凹凸精品熟女在线观看| 欧美劲爆视频一区二区| 中文字幕亚洲欧美在线不卡| 久久男人| 操逼逼福利视频| 色噜噜人妻丝袜AV资源| 色与欲影视| 色婷婷五月综合激情中文字幕| 无码视频一区二区| 大学生美女口爆| 久热免费视频| 天天影视综合色| 美女写真| 亚洲黄色网址| 激情抓乳插进去啪啪啪日韩| 黑丝少妇麻豆| 欧美激情综合网| 99热这里都是精品| 欧美色97| 日韩熟女精品无码专区一区二区| 日韩资源网| 一级二级三级黑人无码| 91亚洲不卡一区| 性一级黄色录像片网站导航| 国产18精品亚洲精品| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 亚洲高潮影院| 亚洲AV无码乱码在线观看性色| 欧美色图人妻| 成人aⅴ一区二区三区| 久久一二三四不卡| 飘花国产午夜精品不卡| 青青草视频导航官网| 欧美精品久久久久久久丰满| 夜夜操91744565| 搡老女人老91妇女老熟女| 久久亚洲不卡| 男人亚洲天堂| 亚洲丝袜B诱惑| 内射小黄片| 国产不卡中文字幕免费avi| 五月丁香六月综合缴清无码| 久久精品老司| 曰韩精品视频一区二区| 日日干男人的天堂| 午夜男人av| 麻豆区久久久久亚| 五月丁香激情综合| 亚洲黄色AV电影| 最新加勒比丝袜在线| 男女啪啪网站免费视频| 亚洲永久AV无码精品秋霞| 91人妻精华帖| 加勒比久久av| 大香蕉啪啪啪| 尤物av网站免费在线播放| 综合激情97 | 精品.99999| 国产成人无码a| 东北操逼| 25国产精品免费观看| 久久永久无码人妻视频| 天天天天做夜夜夜夜做| 国产强奸超碰AV| 97日亚洲欧美| 五月天伊人| 操逼网站视频漫画国产| 91黄站| 一区| 99热超碰在线| 国产成人超碰在线| 亚洲人人夜夜澡人人爽| 欧美极品女人的天堂| 日韩有码 一区二区三区| 超碰97欧美日韩| 五月天婷婷影院| 亚洲图片激情综合另类| 欧美男人的天堂| 日韩精品人妻中文字幕久久久| 黄色视频特级毛片| 在线视频亚洲无码| 欧美日韩97在线| 精品久久久av| 国产精品久久久久久片| 无码国产精品96久久久久孕妇| 超碰这里只有精品| www.色婷婷| 黄色片,com| 欧美日韩资源| 在线观看午夜婷婷久久久久清性观看| 久青草影院| 国产h片在线观看视频| 777超碰| 狠狠操狠狠燥| 欧美72网页| 大稥蕉免费视频这里只有精品| 啪啪资源网| a男人的天堂久久一级A毛片| 亚洲 欧美 日韩另类 麻豆| 日本 免费 一区二区三区 久久香蕉| 日韩黄色电影网站| 乱伦a片视频| 欧美色图亚洲激情| 欧美色图亚洲色,麻豆| 秋霞午夜视频一区二区| 伊人97超碰| 一块操欧美性爱| 99re公开精品免费视频| 操逼网站网站| 男人的天堂免费| 性感美女91影视| 亚洲熟妇综合久久久久久| 久久夜嗨| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 人人看黄色视频| 国产97免费视频| 国产免费小视频| 啊啊啊轻点在线观看| 60秒免费视频| 日本黄 R色 成 人网站| 家庭乱伦性爱av| WWW啪啪的com| 免费看黄片现成| 熟女乱3伦999| 26uuu最新| 亚洲啪啪综合?v一区综合精品区| 久久久91| 色欲久久99国产精品久久久久久| 蜜桃久久一区| 97亚洲自在精品在线观看| 精久久久| 67914在线兔费成人视频| 国产97综合| 天美传媒精品久久视频| 国产国产亚洲一二三久久| 玖玖大干人妻| 午夜亚洲| 久久系列| 婷婷超| 男人女人18禁片免费看网站| 国产黄色视频久久| 九九九九久久久| 99自拍视频| 国产丝袜视频| 中文字幕在线观看第二页| 第四色亚洲色图| 亚洲AV不卡在线观看尤物| 久草综合视频| 999熟女精品| 亚洲激情欧美色图 | 久久免费少妇| 中国AAAAAA黄色片| 日韩无码精品综合久久| 午夜男人av| 岛国精品视频在线观看| 夜夜操二区| 精产国品一区二三产品| 综合久久99亚洲人妻中文在线| 蜜臀av网址| 国产精品不卡少妇白| 人妻少妇久久中文字幕一区二区 麻豆 | 东北熟女91| 欧洲黄色网| 艹少妇网站| 97操碰| 久久久久久久78| 亚洲精品人伦一区二区| 99久草| 亚洲成人性爱网站在线播放| 91 亚洲 欧美 日韩 国产 综合| 五月丁香综合| 亚洲自拍欧美国产首页网曝| 精品一区99999| 97亚洲综合影院| 亚洲免费在线探花| h在线看免费版在线看| 欧美色66| 欧美97av| 欧美一二三级精品在线| 免费毛片在线播放| 日韩AV中文字幕电影| 亚洲青青草| 97在线免费观看视频| 乱伦Av网| 一区久久久二区| 一级免费精品| 亚洲伊人久久综合97| 女同性恋久久| 国产av青草| 中文字幕午夜精品久久久| 日韩精品在线视频,日韩精品……| 综合操逼| 富二代亚洲精品99| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 亚洲婷婷五月天| 伊人991| 少妇久久久久久久| 天天做日日爱夜夜爽| 国产有码一区| 乱人乱色一区二区三区免费| 久久久久久69国产一区二区| www.99色| 国产欧美日产一区二区三区 - 国产欧美日 | 亚洲h片在线免费观看| 99这里只有精品| 狠狠爱夜夜干| 另类TS人妖一区二区三区| www.天天干| 日韩特一级久久| 日本精品网站在线中文| 中文字幕老熟妇黄色视频| 东京热AV男人的天堂| 啪啪啪东京| 中文字幕在线观看第二页| 日韩九九九| 国产成人自拍视频在线| 人妻少妇色综合| 国产午夜福利电影免费在线观看| caorenqi shipin| 亚洲天天自拍| 激情久久av一区av二区av| 东京热熟女亚洲视频网站| 国产一区二区免费福利片| 日韩美脚一区二区网站| 久久久久久九九九九九| 中文字幕性感少妇av| 蜜桃丰满熟妇av无码区不卡| 翔田千里无码中出中文字幕| 熟妇亚洲一区二区三区| 九九九九9999| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 亚洲伊人a线观看视频| 亚洲熟妇乱女区二区三区| 91综合网站| 精品国产一区二区三区av在线资源| 国产精品97超碰| 日本人妻中文字幕| 天堂av2019| 久久久性| 欧美精品偷拍| 盗摄女人妻在线| 亚洲丨在线| 欧美 亚洲 大香| 强奸乱伦日韩AV| 男女做爰猛烈动高潮A片免费应用| 97 视频在线| 国产精品无码成人精品| 91视频观看网站| 色色色色综合网| av 模特一区了| 国产熟女乱论| 91高清日| 激情五月婷婷| 久热一区二区| 好吊色一区| 日本色色色视频| 麻豆色99999| 91 手机在线播放 绯色| 人人模人人看| 欧美日韩一干二干| 国产极品一区二区三区三州| 日韩日韩日韩-国产乱码精品一区二区| 狠狠色婷婷777| 啊啊啊好想要| 欧美亚州综合图片| 欧美一级黄色18片免费看| 欧美欧美少妇| caopeng97人妻| 欧美日韩 强奸乱伦| 啊啊啊啊免费视频| 男人天堂站| 亚一综合久久久久久久久久| 午夜视频久久久| 91人人看| 黄色在线网站| 清纯唯美第一页| 97色论| 午夜影美女日鸡鸡天天视频国产| 日韩内| 热久久国产精品视频大陆精品| 伊人女女资源在线观看| site:sinbotex.com| 精品无码久久久久| 能看的AV| 狼狼色丁香久久婷婷综合五月| 久久久555| 伊人991| 香蕉在线一区二区三区| 免费观看国产小粉嫩喷水精品午| 中文字幕免费在线观看| 国产视频一区二区三区久久亚洲天堂 | 操操操五月天婷婷丁香影院| 玖玖爱伊人玖玖爱| 97视频在线免费看| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 亚洲色图欧美视频| 少妇久久久久久久| 97超碰中文| 69AV女优男人的天堂| 丁香五月天激情网站| 伊人网青青| 777超碰| 日本精品一区二区三| 人妻一区二区三区| 五月丁香狠狠爱| 少妇高潮特黄A片| 国产强奸乱伦欧美| 欧美在线亚洲| 九九九草| 人妻酒店出差被中出免费在线播放| 婷婷五月天在线观看| 肉嘟嘟www视频在线观看高清| 99精品国产户外露出| 亚州,欧美在线| 亚热日本熟女| 亚洲s在线观看| 中日高清无码操逼视频| 欧美精品成人在线播放| 四虎精品永久在线播放| 香港久久久| 破处bbq| 老熟女中文字幕高清| 午夜精品久久久99| 婷婷亚洲中文字幕在线| 色综合久久久久| 久久久精品成人国产| 99re公开精品免费视频| 26uuu国产亚洲综合| 天天草天天日| 少妇一区二区三区| 欧美日韩在线小说| 久久久久久999| 亚洲色图欧美色18直播在线| 久久久久幕乱码| 操死我了啊啊啊| 精品久久9| av 模特一区了| 九九av| 伊人午夜福利视频| 国产自啪精品视频网站黑丝| AV色五月天| 国产吹潮女在线观看| 欧美性天天影院| 日韩 女同 综合| 久久久久久无码人妻中文字幕| 欧美在线中M| 狠狠干2020| 中文字幕免费看| 桑老女人九区| 天天综合有色网| 97色诱| m欧洲一级午老| 热热色色综合| 操老熟女AV| 四虎影视国产精品| 99999亚洲| 精品无码久久久久久久久果冻糖心 | 亚洲精品自拍| 蜜乳视频网站|