免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

Android串口工具源碼詳解:從JNI橋接到設(shè)備節(jié)點(diǎn)通信

Android串口工具源碼詳解:從JNI橋接到設(shè)備節(jié)點(diǎn)通信 簡介這份資源是一套基于Android平臺(tái)的串口通信工具完整源碼面向需要實(shí)現(xiàn)串口調(diào)試、設(shè)備通信的Android應(yīng)用開發(fā)者。項(xiàng)目以 ComAssistant-master 為基礎(chǔ)覆蓋了權(quán)限動(dòng)態(tài)申請(qǐng)、串口API調(diào)用、波特率與校驗(yàn)位配置、數(shù)據(jù)讀寫、后臺(tái)線程管理以及異常處理等關(guān)鍵開發(fā)環(huán)節(jié)適合入門學(xué)習(xí)或作為實(shí)際項(xiàng)目的搭建參考。資源共43個(gè)文件壓縮包約469KB核心部分包括Java層源碼、so動(dòng)態(tài)庫、jni原生C代碼以及XML界面配置目錄結(jié)構(gòu)完整可從上層界面一路追蹤到底層串口通信實(shí)現(xiàn)。已有1790人在CSDN學(xué)習(xí)瀏覽該資源驗(yàn)證了內(nèi)容的實(shí)用性與參考價(jià)值。通過這份源碼開發(fā)者能夠清晰理解Android串口通信的完整流程掌握多設(shè)備枚舉、連接狀態(tài)管理、事件驅(qū)動(dòng)收發(fā)等進(jìn)階要點(diǎn)有效縮短自主二次開發(fā)與排錯(cuò)周期。1. 為什么需要一份 Android 串口工具源碼做工業(yè)平板、儀器儀表或車機(jī)應(yīng)用的同學(xué)遲早會(huì)撞上這樣一幕設(shè)備上留了一個(gè) DB9 或 RS485 接口對(duì)方的協(xié)議手冊(cè)寫得像天書但業(yè)務(wù)上又必須在 Android 系統(tǒng)里把這路數(shù)據(jù)收進(jìn)來。市面上現(xiàn)成的串口調(diào)試 App 一抓一大把能測(cè)通硬件的收尾但沒法直接嵌進(jìn)自己的應(yīng)用里——后臺(tái)服務(wù)、協(xié)議解析、斷線重連全部得從自己的代碼里長出來。這份標(biāo)題里的源碼核心就是一套從應(yīng)用層打開 Linux 字符設(shè)備節(jié)點(diǎn)、配置波特率與數(shù)據(jù)位、再以流的形式完成收發(fā)的完整工程。它解決的是「Android 應(yīng)用側(cè)怎么和外部串口設(shè)備穩(wěn)定通信」這個(gè)具體問題。它的適用對(duì)象很明確一類是要把串口能力接進(jìn)自研 App 的工程師另一類是剛接觸 Android 串口開發(fā)、想從一份可編譯的工程里搞懂原理的初學(xué)者。很多開源實(shí)現(xiàn)把 Java 層和 C 層的職責(zé)分得很清楚——Java 層負(fù)責(zé)設(shè)備路徑、權(quán)限和流接口C 層用 termios 系列函數(shù)真正操作設(shè)備文件。對(duì)開發(fā)者來說這份源碼既是可直接引用的庫也是一份能讀懂的教科書。我見過不少人拿著源碼在 ARM 板子上跑通后才發(fā)現(xiàn)自己在 JTAG 和權(quán)限上耗掉的時(shí)間比寫業(yè)務(wù)代碼還多這篇筆記就按「原理 → 拆源碼 → 集成 → 避坑」的順序把它講透。2. 串口接入 Android 的第一性原理設(shè)備節(jié)點(diǎn)與 JNI 橋接2.1 Android 串口設(shè)備節(jié)點(diǎn)到底藏在哪Android 底層是 Linux 內(nèi)核串口在 Linux 里并不神秘它就是一類字符設(shè)備文件。常見的設(shè)備節(jié)點(diǎn)路徑有/dev/ttyS0、/dev/ttyMT0、/dev/ttyUSB0等具體叫什么取決于 SoC 平臺(tái)和物理接口類型。比如多數(shù) x86 工控板的串口是/dev/ttyS0不少 ARM 平臺(tái)把 UART 命名為ttyMT、ttyAMA之類的前綴如果通過 USB 轉(zhuǎn)串口芯片接入則多半是/dev/ttyUSB0。了解這一點(diǎn)主要是為了在代碼里做設(shè)備路徑的配置化別寫死一個(gè)路徑就以為萬事大吉。串口作為字符設(shè)備的本質(zhì)意味著打開它要用文件操作語義配置參數(shù)要走termios結(jié)構(gòu)體收發(fā)數(shù)據(jù)就是read()和write()。Java 層不提供直接訪問/dev/路徑下的設(shè)備文件的能力所以所有開源方案都繞不開 JNI。常見做法是用 NDK 編譯一個(gè)本地庫在 C 層調(diào)用open()、tcgetattr()、tcsetattr()和read()/write()再把文件描述符傳回 Java 層由 Java 層包裝成InputStream和OutputStream。這個(gè)橋接層的質(zhì)量直接決定了項(xiàng)目后續(xù)的穩(wěn)定性。2.2 為什么 Java 不能直接操作串口不少剛接觸的人會(huì)問我把文件路徑交給FileInputStream不就行了實(shí)驗(yàn)一次就會(huì)發(fā)現(xiàn)不行。原因有兩層一是 SELinux 和 Android 的應(yīng)用沙箱權(quán)限模型不允許普通 App 直接打開/dev/ttyS*這類節(jié)點(diǎn)這點(diǎn)后面避坑章節(jié)再展開二是在 Android 中直接往任意/dev/文件寫數(shù)據(jù)是受系統(tǒng)策略管控的即使僥幸打開配置波特率、數(shù)據(jù)位這種操作也沒有對(duì)應(yīng)的 Java API。串口參數(shù)本質(zhì)是對(duì)驅(qū)動(dòng)層的 termios 結(jié)構(gòu)做ioctl設(shè)置這只能從原生代碼完成。所以 JNI 層的核心任務(wù)就三件打開設(shè)備文件、配置 termios、把 fd 交給 Java 層做流式讀寫。打開設(shè)備的 C 代碼中open()通常會(huì)傳入O_RDWR和O_NOCTTY兩個(gè)標(biāo)志O_NOCTTY的意思是防止這個(gè)串口設(shè)備成為當(dāng)前進(jìn)程的控制終端避免進(jìn)程收到意外的終端控制信號(hào)。參數(shù)用O_NONBLOCK還是阻塞模式取決于讀線程的實(shí)現(xiàn)策略后面會(huì)細(xì)說。int fd open(device_path, O_RDWR | O_NOCTTY | O_NDELAY); if (fd -1) { // 打開失敗打印 errno 便于排查權(quán)限與路徑問題 return -1; } // 把串口設(shè)置為阻塞模式讓讀寫有自然的等待語義 fcntl(fd, F_SETFL, 0);這段代碼里的O_NDELAY在這里的作用是與F_SETFL搭配使用先以非阻塞方式探測(cè)能不能打開節(jié)點(diǎn)隨后通過fcntl把 fd 恢復(fù)為阻塞模式。這樣既避免打開階段因設(shè)備狀態(tài)異常導(dǎo)致掛死又保證正式讀寫時(shí)能按阻塞流模型處理。很多源碼就是在這一層掉了鏈子——非阻塞 fd 傳給 Java 層后InputStream.read()會(huì)立即返回 0 或拋出異常導(dǎo)致數(shù)據(jù)讀不到或 CPU 空轉(zhuǎn)。如果你看到的源碼里沒有這一行大概率會(huì)在實(shí)際設(shè)備上踩到這個(gè)坑。2.3 termios 配置波特率、數(shù)據(jù)位與校驗(yàn)位的 C 層寫法配置 termios 是整個(gè)源碼里最容易“看著沒問題但跑起來全是亂碼”的部分。標(biāo)準(zhǔn)流程是先tcgetattr拿到當(dāng)前配置修改c_cflag、c_iflag、c_oflag、c_lflag再用tcsetattr寫回。常見的干凈做法是先調(diào)用cfmakeraw(options)把驅(qū)動(dòng)設(shè)置為原始模式這樣不會(huì)對(duì)輸入輸出做回車換行轉(zhuǎn)換、不會(huì)把CtrlC當(dāng)信號(hào)處理避免 Linux 行規(guī)程干擾二進(jìn)制數(shù)據(jù)幀。struct termios options; tcgetattr(fd, options); cfmakeraw(options); // 設(shè)置波特率這里的速率宏要與 Java 層傳過來的 int 值對(duì)應(yīng) cfsetispeed(options, B9600); cfsetospeed(options, B9600); // 數(shù)據(jù)位 8、停止位 1、無校驗(yàn)最常見組合 options.c_cflag ~CSIZE; options.c_cflag | CS8; options.c_cflag ~CSTOPB; options.c_cflag ~PARENB; // 啟用接收關(guān)閉硬件流控大多數(shù) RS232 設(shè)備不用 RTS/CTS options.c_cflag | CREAD | CLOCAL; options.c_cflag ~CRTSCTS;參數(shù)說明這一組配置的含義CS8表示 8 個(gè)數(shù)據(jù)位CSTOPB清零表示 1 個(gè)停止位若置位則是 2 個(gè)停止位PARENB清零表示無校驗(yàn)置位后還要配合PARODD決定奇偶校驗(yàn)。CREAD必須置位否則驅(qū)動(dòng)不會(huì)把收到的數(shù)據(jù)交給應(yīng)用CLOCAL忽略調(diào)制解調(diào)器的載波信號(hào)避免檢測(cè)不到 DCD 就收不到數(shù)據(jù)。cfmakeraw之后c_iflag和c_lflag基本不用再改這一點(diǎn)是很多源碼里容易忽略的細(xì)節(jié)——有人只設(shè)置了c_cflag卻保留了行規(guī)程的轉(zhuǎn)換結(jié)果收到的幀里時(shí)不時(shí)多一個(gè)\r或0x0A。雙向波特率不一定要一樣部分設(shè)備要求 115200 發(fā)送、9600 接收這種非對(duì)稱配置。源碼里一般會(huì)做成讀波特率和寫波特率兩個(gè)參數(shù)內(nèi)部依次調(diào)用cfsetispeed和cfsetospeed。如果發(fā)現(xiàn)設(shè)備回?cái)?shù)據(jù)亂碼第一件事就查這兩個(gè)值有沒有配對(duì)。3. 拆解源碼核心模塊讀、寫、關(guān)閉的生命周期管理3.1 Java 層與本地庫的對(duì)應(yīng)關(guān)系拿到一份串口工具源碼先看 Java 層的類結(jié)構(gòu)通常能整理出幾個(gè)固定角色一個(gè)持設(shè)備路徑和參數(shù)并調(diào)用 native 打開方法的門面類一個(gè)繼承InputStream的讀包裝類一個(gè)繼承OutputStream的寫包裝類再加上關(guān)閉時(shí)釋放 fd 的清理邏輯。native 方法的典型聲明是private native int open(String path, int baudrate, int flags)open返回的 int 就是要持有的文件描述符。這套設(shè)計(jì)的關(guān)鍵在于Java 層的流對(duì)象與底層 fd 是綁定的流生命周期必須跟設(shè)備開關(guān)周期嚴(yán)格同步。常見錯(cuò)誤是只關(guān)閉了InputStream卻沒關(guān)閉底層 fd導(dǎo)致串口被長時(shí)間占用、其它進(jìn)程無法再打開。所以源碼里close()方法通常會(huì)先在 Java 層標(biāo)記一個(gè)mOpen false再調(diào)用 nativeclose()并且在 native 內(nèi)部做了 fd 合法性檢查防止close(-1)導(dǎo)致崩潰。3.2 讀線程模型阻塞讀還是事件輪詢串口數(shù)據(jù)是異步到達(dá)的所以讀操作必然要放到子線程。很多源碼會(huì)在打開設(shè)備后啟動(dòng)一個(gè)讀線程在線程里循環(huán)調(diào)用InputStream.read(buffer)。阻塞模式下沒有數(shù)據(jù)時(shí)線程會(huì)自然掛起不占 CPU數(shù)據(jù)到達(dá)時(shí)驅(qū)動(dòng)喚醒線程完成讀取。如果 C 層沒有把 fd 恢復(fù)為阻塞模式這個(gè)循環(huán)就會(huì)變成空轉(zhuǎn)CPU 占用率直線上升。Override public void run() { byte[] buffer new byte[256]; while (mIsOpen) { int length; try { length mFileInputStream.read(buffer); if (length 0) { byte[] data new byte[length]; System.arraycopy(buffer, 0, data, 0, length); if (mDataListener ! null) { mDataListener.onDataReceived(data); } } } catch (IOException e) { if (mIsOpen) { // 只有未主動(dòng)關(guān)閉時(shí)的異常才需要上報(bào) mDataListener.onError(e); } break; } } }邏輯說明這個(gè)讀循環(huán)里三個(gè)容易寫錯(cuò)的點(diǎn)。第一mIsOpen先判斷再read()但read()可能長期阻塞在設(shè)備上所以關(guān)閉方法里要同時(shí)close()流來打斷阻塞第二buffer大小通常 128256 字節(jié)對(duì)于一幀幾十字節(jié)的協(xié)議足夠遇到大幀場(chǎng)景再調(diào)大第三必須把IOException掐在本地區(qū)分是主動(dòng)關(guān)閉還是異常斷開否則線程會(huì)不正常終止。參數(shù)上我一般把buffer設(shè)為 512覆蓋絕大多數(shù)傳感器和工業(yè)協(xié)議的幀長度。3.3 寫操作與串口驅(qū)動(dòng)的發(fā)送緩沖寫操作相對(duì)簡單直接通過OutputStream.write()完成。需要留意的點(diǎn)是串口驅(qū)動(dòng)的發(fā)送緩沖區(qū)并不是無限大寫入速度超過設(shè)備消費(fèi)能力時(shí)底層write()會(huì)阻塞所以業(yè)務(wù)上發(fā)送協(xié)議幀的線程不要放在 UI 線程。另一個(gè)細(xì)節(jié)是write()成功返回并不代表對(duì)方設(shè)備真的收到了完整數(shù)據(jù)它只表示數(shù)據(jù)進(jìn)入內(nèi)核發(fā)送緩沖區(qū)對(duì)講機(jī)式的應(yīng)用還要靠應(yīng)答幀確認(rèn)。public void send(byte[] data) { if (!mIsOpen || data null || data.length 0) { return; } try { mOutputStream.write(data); mOutputStream.flush(); } catch (IOException e) { // 寫入失敗時(shí)記錄日志并觸發(fā)重連回調(diào) onConnectionError(e); } }這里flush()對(duì)流本身沒有意義因?yàn)闆]有用戶態(tài)緩沖區(qū)但保留這個(gè)調(diào)用是為了將來替換成帶緩沖的包裝流時(shí)行為保持一致。send()方法最好做成同步方法或由上層消息隊(duì)列統(tǒng)一調(diào)度避免多個(gè)業(yè)務(wù)線程并發(fā)write()導(dǎo)致幀交叉錯(cuò)亂。多數(shù)設(shè)備協(xié)議對(duì)幀連續(xù)性敏感一條指令被另一條指令的字節(jié)打斷解析端必然報(bào)錯(cuò)。3.4 串口參數(shù)的可配置化設(shè)計(jì)良好的源碼不會(huì)把這些參數(shù)寫死在 C 代碼或者 Java 類的構(gòu)造方法里而是支持讀取配置或動(dòng)態(tài)傳入。設(shè)備路徑、波特率、數(shù)據(jù)位、停止位、校驗(yàn)位、流控方式這六項(xiàng)每一項(xiàng)都應(yīng)當(dāng)被上層參數(shù)化。常見做法是提供一個(gè)配置類或SerialPortOptions結(jié)構(gòu)體打開時(shí)一次性傳入。參數(shù)可選值缺省建議設(shè)備路徑/dev/ttyS0、/dev/ttyMT0、/dev/ttyUSB0運(yùn)行時(shí)探測(cè)波特率9600、19200、115200 等按設(shè)備手冊(cè)數(shù)據(jù)位5、6、7、88停止位1、21校驗(yàn)位NONE、EVEN、ODDNONE流控NONE、RTS/CTSNONE表格里的參數(shù)需要兩者都要覆蓋到一是 C 層的 termios 宏定義二是 Java 層的參數(shù)映射邏輯。特別提醒波特率只能使用內(nèi)核預(yù)定義的速率值直接傳一個(gè)隨意數(shù)字給底層會(huì)設(shè)置失敗或得到錯(cuò)誤速率。非標(biāo)波特率如 2400、57600 之外的奇異值需要內(nèi)核和驅(qū)動(dòng)支持BOTHER機(jī)制絕大多數(shù)商用源碼不處理這種情況。4. 把源碼集成進(jìn)自己的 Android 工程從編譯到第一個(gè) Demo4.1 準(zhǔn)備工作拷貝源碼與本地庫進(jìn)工程無論從哪獲得的源碼通用集成步驟都是類似的找到 C 層源碼或預(yù)編譯的.so庫、把 Java 層工具類拷貝到自己的src目錄、配置CMakeLists.txt或把.so放到src/main/jniLibs/abi/下。如果是 .so 庫需要確認(rèn)包含arm64-v8a和armeabi-v7a目錄某些源碼只帶 v7a在 64 位真機(jī)上可能加載失敗。android { defaultConfig { externalNativeBuild { cmake { cppFlags // 指定要編譯支持的 ABI abiFilters arm64-v8a, armeabi-v7a } } } externalNativeBuild { cmake { path src/main/cpp/CMakeLists.txt } } }這段配置的含義是讓 Gradle 在構(gòu)建時(shí)自動(dòng)用 CMake 編譯 C 層源碼并只生成arm64-v8a和armeabi-v7a兩種指令集。真機(jī)調(diào)試時(shí)這兩個(gè) ABI 基本覆蓋全部設(shè)備如果還要支持 x86 模擬器可以臨時(shí)加一個(gè)x86_64但發(fā)布包不推薦帶上體積變大且沒有實(shí)際意義。如果源碼不附帶 C 源碼而只有 .so那就省去externalNativeBuild配置直接依賴預(yù)編譯庫。4.2 初始化與打開串口的最小可用代碼集成調(diào)試階段不要上來就套復(fù)雜的業(yè)務(wù)框架。先用最小代碼把設(shè)備打開、收到一串?dāng)?shù)據(jù)、再關(guān)掉驗(yàn)證硬件鏈路是通的然后再往上層加協(xié)議解析。最小可用的調(diào)用邏輯一般是聲明設(shè)備路徑與參數(shù) → 實(shí)例化串口工具類 → 注冊(cè)數(shù)據(jù)回調(diào) → 打開設(shè)備。// 1. 確定設(shè)備節(jié)點(diǎn)先執(zhí)行 ls /dev/ttyS* 確認(rèn)實(shí)際路徑 String devicePath /dev/ttyS0; int baudrate 9600; // 2. 創(chuàng)建配置數(shù)據(jù)位8停止位1無校驗(yàn) SerialPortOptions options new SerialPortOptions.Builder() .devicePath(devicePath) .baudrate(baudrate) .dataBits(8) .stopBits(1) .parity(SerialPortOptions.PARITY_NONE) .build(); // 3. 打開設(shè)備讀線程自動(dòng)啟動(dòng) SerialPort serialPort new SerialPort(options); serialPort.setDataListener(data - { // 收到數(shù)據(jù)后投遞到業(yè)務(wù)線程不要在這里做耗時(shí)操作 Log.d(SerialPort, recv: bytesToHex(data)); }); serialPort.open();邏輯說明這個(gè)代碼塊演示了從配置到打開的最小閉環(huán)。bytesToHex是調(diào)試期間必備的輔助方法把字節(jié)數(shù)組轉(zhuǎn)換成十六進(jìn)制字符串打印出來方便和協(xié)議手冊(cè)逐字節(jié)對(duì)照。對(duì)于協(xié)議復(fù)雜的場(chǎng)景建議在回調(diào)里先做幀緩沖再按幀長度或幀頭解析整包數(shù)據(jù)避免把半包數(shù)據(jù)交給業(yè)務(wù)邏輯。打開方法內(nèi)部應(yīng)該先檢查設(shè)備是否已打開防止重復(fù)調(diào)用造成 fd 泄露。4.3 幀協(xié)議封裝粘包與半包處理串口通信最常見的協(xié)議坑是“粘包”和“半包”。設(shè)備可能一次發(fā)來多個(gè)幀緩沖區(qū)讀一次也可能只讀到半幀。成熟的源碼會(huì)提供一個(gè)幀緩存區(qū)把每次讀到的數(shù)據(jù)追加到緩存尾部然后按協(xié)議格式循環(huán)解析逐幀回調(diào)上層。private final ByteArrayOutputStream mFrameBuffer new ByteArrayOutputStream(); public void onDataReceived(byte[] data) { // 1. 數(shù)據(jù)進(jìn)入緩存 mFrameBuffer.write(data, 0, data.length); // 2. 按幀頭長度字段循環(huán)拆包 byte[] buffer mFrameBuffer.toByteArray(); int offset 0; while (buffer.length - offset 4) { // 假設(shè)幀格式: 0xAA 0x55 len data... if ((buffer[offset] 0xFF) 0xAA (buffer[offset 1] 0xFF) 0x55) { int frameLength buffer[offset 2] 0xFF; if (buffer.length - offset frameLength 3) { break; // 數(shù)據(jù)不夠一幀等下一包 } byte[] frame Arrays.copyOfRange(buffer, offset, offset 3 frameLength); mFrameListener.onFrameReceived(frame); offset 3 frameLength; } else { offset; // 沒有幀頭逐字節(jié)跳過 } } // 3. 處理剩余未消費(fèi)數(shù)據(jù) byte[] remain Arrays.copyOfRange(buffer, offset, buffer.length); mFrameBuffer.reset(); mFrameBuffer.write(remain, 0, remain.length); }這段代碼的邏輯是典型的“緩存 循環(huán)拆包”模式先把新數(shù)據(jù)追加進(jìn)緩沖區(qū)再根據(jù)定義的幀頭與長度字段判斷當(dāng)前緩沖區(qū)里有沒有完整的一幀。有就切割出來回調(diào)沒有就跳出循環(huán)等待下包數(shù)據(jù)。跳字節(jié)找?guī)^的分支應(yīng)對(duì)異常字節(jié)防止數(shù)據(jù)錯(cuò)位后整個(gè)緩存區(qū)作廢。參數(shù)上協(xié)議長度字段通常是 1 或 2 字節(jié)如果幀長度超過 255 就要改成雙字節(jié)小端序幀頭越復(fù)雜比如 4 字節(jié)魔數(shù)誤判概率越低但拆包代碼也更繁瑣。4.4 關(guān)閉與資源釋放的完整順序串口關(guān)閉的順序里藏著不少 bug。一個(gè)常見的錯(cuò)誤是先把mIsOpen置為 false 再關(guān)閉流然后直接 join 讀線程但在某些定制系統(tǒng)上讀線程可能深度阻塞join 會(huì)一直卡住。更穩(wěn)妥的關(guān)閉順序是主動(dòng)設(shè)置關(guān)閉標(biāo)記 → 關(guān)閉InputStream打斷阻塞 → 等待讀線程退出并設(shè)置超時(shí) → 最后關(guān)閉OutputStream和底層 fd。public void close() { if (!mIsOpen) { return; } mIsOpen false; try { if (mFileInputStream ! null) { mFileInputStream.close(); // 打斷阻塞讀 } } catch (IOException ignored) { } try { if (mReadThread ! null) { mReadThread.join(500); // 等待線程退出避免殘留 } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } try { if (mFileOutputStream ! null) { mFileOutputStream.close(); } } catch (IOException ignored) { } mSerialPortNative.close(); // 釋放 fd }這段關(guān)閉流程的巧妙之處在于借助InputStream.close()從外部打斷阻塞的read()從而讓讀線程自然退出而不是依賴一個(gè)不確定的接口標(biāo)志位。join(500)是保險(xiǎn)策略如果驅(qū)動(dòng)異常導(dǎo)致流關(guān)閉后線程仍不退出最多等 500ms避免關(guān)設(shè)備時(shí) UI 卡死。mSerialPortNative.close()必須在最后調(diào)用等所有 Java 層流全部釋放后再收起 fd。5. 串口集成避坑指南5 個(gè)最常見的翻車現(xiàn)場(chǎng)5.1 設(shè)備節(jié)點(diǎn)存在但打開報(bào) Permission denied現(xiàn)象代碼里路徑寫的是/dev/ttyS0文件也存在但open()返回 -1日志里打出的 errno 是 13。原因Android 的 SELinux 策略默認(rèn)禁止普通應(yīng)用訪問 tty 設(shè)備節(jié)點(diǎn)即使應(yīng)用聲明了READ_EXTERNAL_STORAGE也無濟(jì)于事。解決如果設(shè)備已經(jīng) root調(diào)試階段可以用setenforce 0臨時(shí)放行量產(chǎn)方案通常需要在系統(tǒng)固件的 sepolicy 里追加允許規(guī)則或者有系統(tǒng)簽名權(quán)限的 App 通過系統(tǒng)接口申請(qǐng)。經(jīng)驗(yàn)之談是工業(yè)平板上跑串口應(yīng)用十有八九要跟設(shè)備廠商要一個(gè)定制固件或系統(tǒng)授權(quán)不要指望純應(yīng)用層繞過。5.2 read() 一直接收不全整幀數(shù)據(jù)總是在半路斷開現(xiàn)象打印收到的字節(jié)數(shù)組每次只有幾十字節(jié)一幀 200 字節(jié)的數(shù)據(jù)要分四五次才能收完。原因驅(qū)動(dòng)按內(nèi)核緩沖區(qū)大小與中斷節(jié)奏上報(bào)數(shù)據(jù)應(yīng)用側(cè)read()不會(huì)為你湊夠一幀。解決從根上接受“讀到多少算多少”的現(xiàn)實(shí)把協(xié)議拆包邏輯做在應(yīng)用層用 4.3 節(jié)那種幀緩存持續(xù)拼接。另外一個(gè)隱蔽原因是緩沖區(qū)開得太小read(buffer)的 buffer 只有 64 字節(jié)驅(qū)動(dòng)一次可用數(shù)據(jù)再多也只能取 64 字節(jié)改大到 512 或 1024 往往能減少切包次數(shù)。5.3 波特率設(shè)了 115200設(shè)備回的卻是亂碼現(xiàn)象收發(fā)硬件連線確認(rèn)無誤參數(shù)配置也檢查過設(shè)備返回的字節(jié)流完全不可讀。原因最典型的是 C 層未正確設(shè)置對(duì)應(yīng)波特率的宏或者cfsetispeed與cfsetospeed只設(shè)置了一個(gè)。另一個(gè)可能位于不太容易被想到的位置USB 轉(zhuǎn)串口芯片的驅(qū)動(dòng)層默認(rèn)配置和代碼配置不一致導(dǎo)致實(shí)際鏈路速率與預(yù)期不同。解決排除法很有效——先用系統(tǒng)自帶串口調(diào)試工具把設(shè)備調(diào)通再用自己的源碼連確認(rèn)不是硬件問題后回到 C 代碼逐行打印tcgetattr讀回的c_cflag實(shí)際值檢查波特率宏是否真的生效。5.4 串口關(guān)閉后立刻重新打開失敗現(xiàn)象執(zhí)行close()后 1 秒內(nèi)再次open()同一路徑返回 -1提示Device or resource busy。原因關(guān)閉時(shí) fd 還被子線程持有或者驅(qū)動(dòng)內(nèi)部有狀態(tài)殘留還有一個(gè)常見原因是close()沒被完整調(diào)用Java 層流關(guān)了但 C 層 fd 沒關(guān)。解決關(guān)閉流程嚴(yán)格按 4.4 節(jié)順序執(zhí)行若仍然復(fù)現(xiàn)在 close 末尾加一次usleep或讓上層業(yè)務(wù)在收到關(guān)閉回調(diào)后再等 200ms 重新打開。某些底層驅(qū)動(dòng)確實(shí)需要幾十毫秒釋放端口這種“玄學(xué)”問題見得多了重試機(jī)制比糾結(jié)驅(qū)動(dòng)源碼更省時(shí)間。5.5 數(shù)據(jù)回調(diào)里直接更新 UI 導(dǎo)致界面卡死或崩潰現(xiàn)象數(shù)據(jù)量一大界面掉幀甚至 ANR。原因串口讀線程是一個(gè)高頻觸發(fā)源在回調(diào)里直接runOnUiThread刷新控件會(huì)把每幀數(shù)據(jù)都變成一次 UI 任務(wù)消息隊(duì)列瞬間堆積。解決讀線程只負(fù)責(zé)把幀投遞到業(yè)務(wù)層的單線程隊(duì)列由專門的 HandlerThread 消費(fèi)只有在真正需要刷新 UI 的業(yè)務(wù)點(diǎn)上才切到主線程。比較實(shí)用的模式是回調(diào)里做數(shù)據(jù)聚合比如每 100ms 把累積數(shù)據(jù)合并發(fā)布一次而不是一幀一刷。6. 把串口源碼變成趁手的調(diào)試工具一個(gè)長期值得投入的小習(xí)慣源碼集成穩(wěn)定之后我建議再做一層輕量封裝把它做成一個(gè)可獨(dú)立運(yùn)行的工具型 Activity或至少保留一個(gè)不依賴業(yè)務(wù)模塊的調(diào)試入口。界面不用復(fù)雜一個(gè)設(shè)備路徑下拉框、一個(gè)波特率選擇框、一個(gè)發(fā)送輸入框、一個(gè)滾動(dòng)接收日志區(qū)就夠。別小看這個(gè)工具它解決的是實(shí)際開發(fā)里特別好用的痛——協(xié)議聯(lián)調(diào)時(shí)對(duì)方的設(shè)備不可能每次都連著你電腦上的 USB 轉(zhuǎn)串工具在 Android 設(shè)備上直接調(diào)才是現(xiàn)場(chǎng)真實(shí)鏈路。一個(gè)值得借鑒的做法是把接收區(qū)做成十六進(jìn)制與 ASCII 雙顯并且加上行號(hào)和時(shí)間戳。工業(yè)協(xié)議里經(jīng)常出現(xiàn)“非打印字符 殘留舊幀”的組合純文本模式下幾乎無法定位問題。加上時(shí)間戳后從設(shè)備發(fā)出到應(yīng)用收到的時(shí)間差一目了然能直接判斷是鏈路延時(shí)長還是協(xié)議交互次數(shù)太多。我會(huì)習(xí)慣性地在工具頁放一個(gè)“連續(xù)發(fā)送”按鈕用來長時(shí)間壓測(cè)設(shè)備在高頻詢問下會(huì)不會(huì)掉線——這個(gè)測(cè)試數(shù)據(jù)在量產(chǎn)評(píng)估里非常有說服力。在封裝時(shí)給源碼補(bǔ)兩個(gè)能力一是把當(dāng)前收發(fā)的字節(jié)數(shù)統(tǒng)計(jì)出來累計(jì)計(jì)數(shù)清零二是把每條日志同步落盤。字節(jié)統(tǒng)計(jì)能直觀看到實(shí)際吞吐量和理論波特率對(duì)比就能大致判斷底層鏈路是否健康。日志落盤的價(jià)值則在于復(fù)現(xiàn)問題現(xiàn)場(chǎng)設(shè)備環(huán)境復(fù)雜等用戶把出問題的 logcat 抓回來往往已經(jīng)丟了上下文有了本地文件排查效率能提高一倍不止。除此之外確認(rèn)數(shù)據(jù)穩(wěn)定后再考慮把它收斂為獨(dú)立 Module串口邏輯與業(yè)務(wù)完全隔離對(duì)外只暴露 open/send/close 三個(gè)接口。這樣以后從 Android 工程切到系統(tǒng)定制固件或換平臺(tái)遷移成本都控制在很小的范圍。這套源碼對(duì)我來說更像是一個(gè)持續(xù)迭代的底座——每次遇到新硬件平臺(tái)把設(shè)備節(jié)點(diǎn)映射和波特率策略調(diào)整一下剩下的穩(wěn)定性保障都是現(xiàn)成的。希望能幫你的串口項(xiàng)目少走幾段彎路。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
精品一二三区久久AAA片| 久久伊人婷婷| www婷婷| 免费观看亚洲AV片| 丁香婷婷视频一区二区| 狠狠香婷婷五月| 久久婷婷青青草| 婷婷五月色情天| 成人午夜无码视频| 大香蕉Av在线| 日本道久久91| 久9综合| 欧美丁香五月97色| 五月丁香在线观看| 五月天丁香| 五月开心啪啪| 婷婷5月天激情综合| 亚洲成人综合网在线免费观看| 激情五月天视频| 99re这里只有精品首页| 亚洲舔观看| 久草网大香视频| 九九在线精品| 久热大香蕉| 久机视频这只有精品| ,99视频久久| 欧美久人人| 国产精品美女久久久久AV超清 | 久久综合干| 色色图五月天| 免费日本aⅴ中文字幕| 久久这里只有精品热在99| 五月天.com| 色插综合网| 中美日韩成人在线| 成人视频一区| 亚洲综合激情五月天婷婷| 九热电影av| 涩涩网五月天| 99视频精品8 | 久久久久99精品成人片| 婷婷综合伊人丁香| 激情五月天伊人av| 五月天色五月| 久热中文字幕| 激情性爱五月天| 婷婷五月激情视频| 五月丁香六月婷婷激情视频在线观看免费 | 色色色1网址| 第九色区av天堂| 久操激情| 久久九九国产精品怡红院| 丁香婷婷九月| 成人在线99| 日韩色久| www.激情五月天。com| 亚洲免费观看高清完整版AV线| 中文字幕综合色| 久久91久久精品久久| 人妻熟人中文字幕一区二区 | 一区二区免费看| 久久久九九九 99| 懂色av粉嫩AV蜜臀AV| 性按摩玩人妻HD中文字幕| 性爱久久| 亚洲日比视频| 久久婷婷综| 天天日夜夜欢| 婷婷五月天 偷拍| 五婷婷六月合| 五月婷视频| 婷婷色导航| 色天五月天在线观看视频| 欧洲亚洲精品| 色噜噜狠狠色综合日日| 九九99精品视品| 色婷婷六月天在线| www.色五月| 精品爆操| 99热热热99精品丁香| 丰满少妇乱A片无码| 99精品国产乱码久久久人妻| 九九综合网色全集 | 丁香亭亭久久| 99视频精品全部观看10| 99亚洲视频| 五月婷婷丁香六月| 九九性爱网| 色婷婷丁香九月| 国产在线黄色| 天天做天天爱天天玩夜夜爽| 日韩成人精品中文字幕| 久久996re热这里只有精品无码| 六月婷五月丁香| 中文国产五月天| 99在线免费观看| 97香蕉碰碰人妻国产欧美| 天天肏夜夜肏| 五月丁香色综合| 丁香综合婷婷开心激情网| 激情五月天啪啪| 亚洲最大五月六月丁香婷婷| 天天天天干| 91无码色色| 东北黄色一级| 五月花亭亭| 五月 激情视频| 久久97| 国产一级黄色影片,| 丁香五月在线自慰| 六月丁香婷婷五月| 九九一区| 99热 在线观看| 九九热视频这里只有精品| 79精品视频在线观看,| 怎么样可以看免费的一级av| 五月丁香久人妻中文| 五月丁香久久丝袜啪啪| 婷婷五月天基地| 色色色色区| 久久成人性爱| 久久这里只有精品热在99| 日韩AC在线免费观看| 另类小说五月天| 色丁香婷婷| 任你爽视频| 久久久五月天网站| 色欲一区二区三区精品A片| 丁香婷婷色五月| 996re热精品视频| 色婷丁香五月| 99激情视频| 99九九视频精彩在线| 日本特黄aaaaa| 激情久久肏屄视频| enecarbon-materials.com污K127封锁请涟系@wip1688 | 日本超碰在线| 九九九九国产| 色区久久| 激情五月婷婷丁香六月| 色偷偷五月天| 婷婷色色综合激情| 国产精品99久久久久久久女警| 五月丁香琪琪| 激情婷婷| 九九这里只有精品在线视频| 九九黄色网| 五月色色网| 国产婷婷五月天| 色婷婷亚洲综合网站| 亚洲中文丁香| 国色天香成人网| 五月丁香久久| 狠狠色婷婷7777久| 婷婷在线午夜| 天天AV导航网| 99燥99日| 色五月第四色| 五月天婷婷操逼视频| 99精品大片| 五月丁香综合网| 天天情色五月天| 极品人妻VIDEOSSS人妻| 亚洲99精品欧美一区| 日日操夜夜操不卡| 九九无码| 久草婷婷| 99热午夜精品| 亚洲情色一区| 九九人妻福利| 久久九九思思| 99爱视频| 综合激情五月四射婷婷| 色爽干| 亚洲99视频| 操人妻AV| 久操97| 婷婷的99视频网站| 国产高潮A片羞羞视频涩涩| 丁香五月综合| 五月丁香六月激情综合在线| 色色九九五月天| 久久久久久久97| 四月婷婷五月色综合| 国产精品人人做人人爽人人添| 欧美五月丁香在线观看| 婷婷伊人视婷婷婷| 色婷婷色99国产综合精品| 丁香五月骚喷水视频| 人五月天婷婷喷水| www.99久久久| 婷婷色情小说| 欧美日韩91| 天天干天天干天天干| 五月综合激情图片 | 婷婷五月a| 亚洲AV人人操| 伊人啪啪网| 99热青青草| 亚洲亚洲人成综合网络| 黄色五月婷婷| 丁香五月激情综合啪啪| 丁香婷最新动态| 五月天大香蕉av| 色综合天天| 色亚洲无码| 亚洲综合网在线| 婷婷玖玖五月天| 国产色色网址网站| 成人一级片| 内射爽无广熟女亚洲| 99小视频网站| 婷婷国产日本欧美| 婷婷99狠狠| 91狼友视频网页更新| 另类 在线| 婷婷五月欧美综合| 大香蕉啪啪啪| 五月丁香激情婷婷| 五月丁香婷婷99| 久久久网站| 九九热最新地址| 26uuu.| 久久色午夜在线导航| 色五月婷婷基地| 狠狠干在线| 五月停停直播| 五月天婷婷日日爱| 99亚洲精品视频在线观看| 五月天堂色色| 9色小视频在线观看| 99免费在线| 丁香婷婷月| 五月婷婷免费视频| 激情综合五月.....| 超碰在线视屏| 亚洲熟女色| 国产黄色大片| 狠狠 久久| 少妇性按摩无码中文A片| 日熟女| 99成人无码| 亚洲精品乱码久久久久久按摩观| 色五月色五天色情网| 久久婷婷东京热大香樵| av五月丁香婷婷网| 五月婷婷丁香网| 久久久久久久久月丁| 思思热视频在线观看| 丁香六月天| 婷婷五月深深爱| 精品色色网| 综合网激情五月天| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 人人爱操| 婷婷五月天最新综合你懂的| 九九人妻福利| 六月婷婷私欲| 国产精品热搜丁香五月婷婷| 五月丁香五月婷婷| 国产免费一区二区三区三州老师F1F1.CC | 亚洲激情av| 99超级碰碰| 天堂久久性| 婷婷五月天大香蕉| 婷婷五月综激情| 天天干天天操天天射 | 五月婷婷激情色情网| 亚洲另类婷婷五月丁香在线播放| 丁香婷婷丁香五月欧美人| 久久激情视频| 精品国产va久久久久久久| 五月丁色AV| 99色在线视频观看| 五月综合激情图片| 五月网在线| 夜夜操天天干| 9久热| 五月丁香综合激情网| 日本狠狠干| 激情深爱五月天| 国产片XXXXA片国语对白| 极品少妇高潮啪啪AV无码| 国产乱人偷精品人妻A片| 亚洲色图欧美色图日本视频| 婷婷五月中文字幕| 热九九在线| 色宗合,宗合网| 夜夜操狠狠操天天操| 精品五月天| 天天干一干| 99久久久久| 天天天天操| 五月婷婷 婷婷五月 一区二区 久久久| 123日本不卡在线| 99综合成人视频在线观看| 久热91精品| 9+1视频网址| 五月六月激情婷婷| 97色欧美| 成人无码免费一区二区中文| 91九色精品女同系列| 99热在这里只有免费精品| 色五月婷婷婷婷| 婷婷五月天久久| 婷香五月激情视频| 色婷婷丁香五月| 天堂在线伊久| 偷偷狠狠久久婷婷五月天| 激情五月天网页| 人妻少妇色综合| A久久| 午夜天天精品视频| 激情五月天婷婷| 五月婷六月丁| 国产毛片精品一区二区色欲黄A片| 九九XX视频| 丁香六月激情| 亚洲操B| 丁香激情五月| 久久XX| 久久机热思思热| www久久99| 色婷婷小视频| www.爱操com.| 亚洲激情综合| 久久久大香蕉| 亚洲无码色| 国产精品国产成人国产三级 | 欧美A片在线视频免费观看| 96精品久久久久久久久| 欧美中文五月天| 风流少妇A片一区二区蜜桃| 狠狠综合区| 丁香六月婷婷综合麻豆| 久久伊人五月天| 亚州操逼网| 五月丁香狠狠地噜噜噜噜| 丁香六月啪啪| AV在线免费播放| 五月激情影视| 色色色色色日韩午夜激情| 99热这里只有精品国产免费| 深爱激情五月网| 9l视频自拍9l九色9l成人| 婷婷涩五月天综合| 五月婷婷啪啪啪啪| 婷婷激情五月天亚洲综合| 色五月首页| 99色.com| A1片久久久| 色色综合五月| 色综合伊人网| 影音先锋偷偷色男人站| 国产精品美女| 99久精品视频| 97视频91| 97久久视频| 91超碰在线观看| 在线成人av播放| 丁香五月婷婷成人网| 成人午夜天| 天天拍天天做视频| 大香蕉综合视频在线| 婷婷5月天激情综合| 九九热99热| 99热精品在线播放| 99热国产| 小视频一区 | 久久五月天综合视频网站| www.婷婷五月天.com| 婷婷久热| 激情五月天色色| 六月丁香成人| 婷婷五月精品| 99啪啪网| 精品国产va久久久久| 五月婷婷啪啪| 噜噜噜噜在线| 色综合久久无码| 婷婷五月天亚洲| 婷婷伊人綜合| 婷婷色婷婷| 婷婷五月天777| 激情五月综合网| 爱草视频在线| 五月婷婷黄色毛片| 久久精品性爱| 99热成人在线观看| 91色九| 五月丁香婷婷啪啪| 五月丁香五月天现场视频| 百度一下国产精品A| 九九热视| 99精品视频在线免费观看| 激情婷婷丁香| 91人人网| 五月婷婷精品视频| 婷婷内射视频在线| 国产黄大片在线观看画质优化| 六月婷婷国产| 91狠狠综合久久| www.狠狠| 噜噜操操| 欧美综合五月丁香六月婷| 九色PORNY在线精品酒店| 色婷婷狠狠| 99re思思精品在线观看| 超碰人人干| 亚洲国产精品二二三三区| 五月婷婷久| 成人av在线电影| 成人无码精品1区2区3区免费看| 久久丁香久久| 插插插丁香五月婷婷| 五月丁香久久激情综合| 色噜噜狠狠色综无码久久合欧美| 一本久道综合色婷婷五月| 五月丁香激情四射综合| 大鸡巴伊人网| 午夜婷婷| 黄色片区子| 五月丁香六月婷婷久久久综合| 欧美大香蕉视频| 91九色最新视频| 婷婷99狠狠躁天天躁中| 天天日夜夜帕| www.91有码.com| 亚洲熟女乱色综合亚洲网站| 五月丁香综合色婷婷| 婷婷伊人网| 色噜噜婷婷| 快乐激情五月色婷婷| 色综合色色色色色色综合| 五月婷婷色播| 大香蕉精品视频| 久久婷婷五月综合色和| 亚洲五月综合色播| 五月六月丁香婷婷在线观看| 婷婷五月色| 日韩AV一区二区三区| 精品国产一区二区三区四区阿崩| 色香欲综合| 五月丁香六月综合激情| 激情五月天小说| 婷婷五六日| 色丁香五月天射婷婷爱婷婷| 五月婷婷欧美| 九九久久五月天综合伊人| 久操人| 婷婷五月欧美综合| 久久五月婷6 9| 精品久热| 九九无码| 激情又色又爽又黄的A片| 欧美性爱五月天| 无码橾| 99re思思热久久| 国产高清精品色| 五月丁香啪啪激情| 五月丁香综合伦理片| 五月噜噜噜色综合| 成人天天爽| 中文AV在线播放| 丁香婷婷91在线观看视频| 狠狠综合久久综合| 亚洲色图在线视频| 久久9热| 婷婷五月天成人网站| 怕怕視頻| 激情五月综合ì香亚洲| 五六月丁香激情视频| 婷婷五月天少妇| 亚洲 日韩色色| 26uuu.| 色五月涩涩婷婷蜜桃| 九九这里只有精品在线视频| 丁香激情五月综合网| 九九热免费观看视频| 五月丁香综合啪啪啪啪啪| 五月丁香日本片| 爱之国产色情综合| 1010日日无码| 婷婷刺激综合| 五月丁香啪啪啪| 79精品视频在线观看,| 中文字幕在线日亚州9| 97人人操人人干| 国产精产国品一二三在观看| 色婷婷丁香AV综合| www.91九色| 91天天操天天干天天射| 伊人婷婷激情| 狠狠干在线| 九九精品99| 婷婷五月天伊人网| 九月婷婷在线视频| 中文字幕,综合,91| 天天摸天天舔天天爽| 日本九九热| 99爱在线免费视频| 五月丁香久久| 五月丁香A片| 人妻激情视频| 国产裸舞福利资源在线视频| 婷婷成年人免费视频| AV色婷婷| 国产成人精品一区二三区熟女在线| 激情五月天。| 久草天堂| 激情九九这里只有精品| 色五月综合网| 五月丁香激情综合网官网| 色婷婷色九月| 天天干天天干天天干天天干天天| 五月婷激情影院| 久久五月视频| 久久九九99桃花视频| 婷婷五月花免费视频在线| 激情小说视频图片网| 激情婷婷五月天| 婷婷性爱五月天丁香网| 99久久99视频只有精品| 天天婷婷综合亚洲亚洲| 99精品国产在热久久| 激情图片婷婷丁香五月| 狠狠操在线视频| 免费亚洲婷婷中文字幕| 丁香花五月天社区| 激情五月天之六月婷婷| 国产一级片| 色色综合热| 思思视频这里是精品| 久久思思热| 国产一区二区av免费| 九九色欲网| 婷婷色激情五月天| 国产五月视频| 亚洲avjiujiur91| 五月婷激情影院| 99热草草| xxx日本东京热| 六月丁香激情网| 日日夜夜天天| 人妻中文字幕精品| 婷婷射婷婷舔| 夜色热久| 婷婷五月婷婷五月天| 99热这里全都是精品| 九九青草热| 午夜五月天| 五月天婷婷丁香成人网| 九九热在线视频,| 久久九九免费视频| 久久er视频6| 日韩人妻无码精品| 99精品视频偷拍| www.狠狠| 狠狠情色| 丁香 亚洲 久久| 月丁香久久久| 精品人妻久久久久久| 青青久久五月天丁香婷婷| 五月婷婷就去色| 丁香五月天堂网| 婷婷五月天国产精品| 99欧州偷拍视频| 中文字幕无码人妻少妇免费视频| 99热这里只有精品亚洲| 色狠狠综合| 人妻射精AV| 91热在线| 国产免费一区二区三州老师F1F1| 人人综合久| 婷婷色偷拍| 99热在线观看免费精品| 五月婷婷黄色毛片| 天天精品视频免费观看| av激情在线| 婷婷五月激情网| 激情五月色婷婷| av人人干| pom538精品视频| 五月丁香六月成人| 色狠狠综合| 色婷婷婷婷| 欧美黑人大吊| 亚洲中文字幕在线观看| 日日肏天天操| 丁香社92视频| 色在线99| www.av视频xx999.com| 思思热精品在线视频| 国产乱码久久| 亚洲成人AV高清字幕| 囯产精品一品二区三区| 99丁香五月婷婷在线| 婷婷成人五月天成人文学| 国产熟女大叫受不了| 久热亚洲| 五月丁香日本一抹本| 中文中文在线| 另类综合婷婷五月天欧美视频| 老师把我爽高潮了免费A片| 亚洲另类日本| 另类专区在线| 亚洲三A| www.六月丁香看AV| 99亚洲精品视频| 久久婷婷色| 伊人综合网4| 亚洲第一成人AV| 9热精品| 色色综合成人网| 婷婷丁香五月综合| 婷婷丁香人妻天天爽| 婷婷五月天综合久久| 丁香六月激情综合| 亚洲无码九九| 亚洲性天天| 五月综合人妻| 99操久久| 五月天激情无码专区| 涩九九九九| 欧美叉叉叉BBB网站| 99热精品在线播放| 丁香色情五月综合激情| 卡视频1区2区| 少妇人妻偷人精品无码视频新浪| 亚洲成人在线综合| 成人五月天在线视频在线观看| 人五月天婷婷喷水| 99爱爱| 开心五月深爱五月丁香五月激情五月| 男女99免费视频| 婷婷狠狠综合网入口| 黄色AV日韩| 色综合久久久久久久久五月| 99热99在线| 五月色丁香婷婷综合| 精品久久久人妻| 五月丁香在线观看| 97干婷婷五月天| 色九亚洲| 亚洲精品成人片在线播| 日韩丰满少妇无码内射| 天天干夜晚夜操| 人人射人人高潮| 婷婷欧美色| www.91九色| 香蕉视频性爱BB做爱| 啪啪91| 亚洲无码yw| 99久久精品网| 思思热精品免费视频| 成人五月天丁香| 狠狠干在线| 色婷婷六月| 丁香五月综合| 丁香婷婷深情五月亚洲| 婷婷综合一二三| 亚洲视频图片婷婷五月| 婷婷五月丁香色情| 777精品成人a v久久| 97自拍视频在线| 久久久99视频| 九九99热久久精品66中文字幕| 日本视频不卡123区| 99久久久久| 在线中文字幕视频| 我爱大香蕉| 婷婷五月天综合AV| 久久久久人妻网址| 停婷丁五月在线| 欧美色色色色色色色| 久久婷婷色五月| 五月天小说激情| 亚洲综合五月天综合| site:minyis.com| 97人人射| 成人必爱视| 丁香六月婷婷综合激情欧美 | 激情丁香久久| 人人超碰99| aaaa.黄| 激情性爱婷婷| 天堂综合久久| 站长推荐无码播放| 99无码超碰| 他改变了拜占庭| 丁香婷婷精品视频| 激情网开心网| 亚洲第一色区| 无码动漫av| 婷婷色九月| 亚洲综合草草| 久久机热/这里只有精品| 狠狠综合网| 五月天婷婷色色| 国产精品a无线| 久久婷婷五月综合色欧美| 亚洲无码影音| 成人丁香色| www.激情| 色播五月天天| 日狠狠| 五月天操逼网| 亚洲中文字幕在线观看| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 亚洲综合一区二区| www超碰| 五月激情四射婷婷丁香| 色色欧美色色| www.五月天婷婷| 97色婷| 超碰熟女农村在线69| 亚洲午夜一区二区| 丁香五月情色| 色婷婷亚洲在线| www.黄色片-久久成人国产精品在线播放-999AV | 五月婷婷综合天天操| 综合超碰熟| 精品人妻在线| 色综合激情| 91碰免费视频| 亚洲天堂热| 激情综合色图| 色婷五月| 色情丁香五月婷婷精品| 色五月,com| 91chinese 在线| 大波美女VA网站| 天天干天天操天天拍| 丁香五月婷婷基地| 在线成人国产| 亚洲色久| 激情五月综合| 噼里啪啦在线观看免费完整版视频 | 亚洲人人操| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | AV网在线| 97资源碰碰| 国产成人片| 日韩五月婷婷| 亚洲第一色色色色| AV在线大香蕉| 五月天色软件| 人人人人人人人人人草| 天天操综合网| 操草草草| 五月婷婷开心色伊人| 97婷婷狠狠| 1024AV视频| 97香蕉碰碰人妻国产欧美| 五月五婷婷| 丁香五月影院| 看婷婷五月天网| 五月天久久综合婷婷| av在线免费播放观看| 思思99热热热99| av在线超清中文| 日日夜夜天天爽| 成人av免费观看| 99色久| 婷婷激情五月天在线| 中文字幕黄色片| 亚洲人妻Av| 久久99热这里只有精品| 影音先锋91在线资源站| 亚洲激情 久久| 男女99免费视频| 色色色在线| 亚洲视频99| 青青草99re| 丁香五月婷婷激情123| www.狠狠| 99热只有精品在线播放| 欧美精品啪啪| 97婷婷狠狠| 天堂网啪啪| 碰人人操| 五月丁香激情综合网| 亚洲精品网址| 激情5月婷婷| 色五月婷婷天堂| 丁香婷婷婷五月| 亚洲成人综合网在线免费观看| 密乳视频| 亚洲午夜国产成人电影VA国产欧…| 婷婷五六日| 日本精品人妻无码77777| 99激情网| 99日本在线| 久大香蕉| 婷婷五月播| 日日操夜夜撸| 天天综合天天做天天综合| 99精品免费| 丁香伊人综合| 琪琪色五月婷婷老师| 色综合色色色色色| 啪啪九九色| 丁香婷婷视频| 色玖玖玖| 丁香五月激情网| 色五月琪琪| 天天干天天色综合| 色久五月| 五月丁香婷婷欧美色图视频五月丁香777电影 | 人妻性爱| 性爱激情综合网| 欧美VA在线观看| 久色激情| 色五月激情五月天| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 丁香五月另类色婷婷麻豆| 入口五月婷婷六月香| 婷婷五月天影院| av网站中文| 东北黄色一级| 大香蕉av在线| 五月丁香综合伦理片| 丁香六月天婷婷| 久久综合影院 | 丁香五月成人婷婷| 九九久久99| 婷婷五月激情欧美大胆视频| 五月婷六月| 欧美性二区| 青柠影视免费高清电视剧| 五月丁香婷婷基地| 久久99免费视屏| 激情综合文学| 日本一级特黄大片AAAAA级| 亚洲色色在线| 激情综合九| 特级西西4444www无码| 天天舔天天| 婷婷趴趴| 五月婷婷色| 婷婷欧美| 密臀久久| 久操激情| 日本三级成人秘书精品片| 色婷婷色99国产综合精品| 亭亭丁香aV| www.99精品视频| 五月天婷婷综合| 97干在线播放| 天天爽曰日爽| 婷婷五月天色| www.91AV.com| 久久婷婷五月天| 丁香婷婷色五月激情综合| 五月婷婷伊人网| 婷婷涩涩五月天| 色色五月天 亚洲| 久久久97| 五月天激情网图片| 五月天婷婷丁香蜜桃91| 99re在线精品视频| 丁香五月婷婷操逼| 国产精产国品一二三在观看| 操逼巨乳91| 婷婷五月色網站| 密黄站| 天天肏高清在线| 人妻丰满精品一区二区A片| 99热大香蕉| 深爱激情69热| 操操操操操电影网| 97亚洲色 torrent magnet| 操日视频| 激情五月最新网址| 日本V在线观看不卡视频网站| www.精品99| 99色色网| 五月停停丁香| 亚洲综合视频一下| 伊人网欧美在线男人天堂五月丁香 | 日本激情91| 亚洲人成网站999综合| sS丁香五月婷婷| 99色久| 久久婷婷五月综合一| 香蕉AV777XXX色综合一区| 啪啪91| 97人人干人人操| AV操逼网| 婷婷狠狠97| 综合五月天| 欧美性爱特黄一级aaaassss| 思思热久久阴99| 特级操b片| 久久精品婷婷五月丁香| 国产色网站| 亚洲色色五月| 久久视频婷婷| 婷婷丁香综合| 丁乡久久| 色www.con| 黄色激情久久| 九九热99视频在线| 伊人久久大香网| 婷婷五月综激情| 日韩成人av在线| 九九热欧美| 丁香色五月婷婷17C| 99精品自拍视频| 婷婷五月四狠狠| 天天玩夜夜操天天爽| 天天色爽| 天天热夜夜操| 九九爱激情| 人人摸人人| 成人免费在线电影| 色婷婷成人| 婷婷五月天丁香| 天天操天天插| 黄色热99| 色噜久| 超碰在线超碰| 五月色婷婷亚洲 | 国产乱子轮XXX农村| 亚洲视频在线观看| 亚洲视频1区| 五月色婷丁香| 婷婷射图| 97丁香五月天| 六月丁香婷婷在线波多| 99热这里只有精品中文字幕| 亚洲综合另类| 激情综合网激情五月天| 粉嫩AV久久一区二区三区| 日韩av免费版| www,色综合| 五月天婷婷色在线视频免费观看| 婷丁香久综合| 另类综合婷婷五月天欧美视频| 五月婷婷成人| 99热8| 综合色七七| 9999热在线观看| 天天日日人| 密桃激情五月天综合网| 色哟哟www| 精品婷婷| 色婷婷啪啪| 日本久久视频| 欧美一区二区三区不卡影视| www.婷婷五月天.com| 丁香九月久久| 99色在线观看视频者| 91视频五月丁香| 五月婷婷久久综合| 夜夜骑夜夜撸| 色五月婷婷五月天| 69天堂99| 99久热这里只有精品视频删减版| 色区域网站视频| 久久网日本| 日本91在线播放| 丁香婷婷91在线观看视频| 色 丁香婷婷| 五月丁香影院| 婷婷的五月天另类视频| 国产九九一区二区三区| www.伊人天堂偷偷婷婷| 人人97碰| 色婷婷六月| 婷婷月五天在线在线看| 精品色色色| 欧美日韩成人在线| 99热精品10| 色区域网站视频| 婷婷五月天久久久| 99视频在线观看网址| 亚洲精品性色| 亚洲操b| 伊人大香蕉在线视频| 丁香狠狠| 26UUU欧美| 91互操| 天天艹天天色| 99操碰| 日韩在线观看亚洲| 日本颜色视频人人爱| 五月丁香六月| 99久久99九九九99九他书对| 九九精品免费| 久久se 综合网| 99丁香五月婷| 天天搡日日搡aaaaⅩ| 97香蕉人人在线观看| renrencaoav| 涩五月婷婷| 五月天激情综合在线| 九九在线精品| 激情久久婷婷| 五月丁香色婷婷熟女| 色五月情| 天天插天天狠| 日韩1区2区| 日韩999| 久久五月天网| 99热线观看9| 激情网婷婷婷| 亚洲第一成人AV| 色情久久久| 欧美大肥婆大肥BBBBB| 中文字幕丰满乱孑伦无码专区| 991国产精选视频在线播放下载| 色一情一乱一乱一区9| 婷婷五月天综合小说网| 婷婷五月激情综合网| 婷婷五月天亚洲综合| 99久久国产宗和精品1上映| 婷婷五月开心中文字幕色| 色色婷婷五月天| 99热在线里有精品| 亚洲精品久久久无码| www.99热国产| 人妻丰满精品一区二区A片| 五月在线婷色| 三男玩一女三A片| 亚洲五月婷天天操| 亚洲最大成人综合网720P| 六月丁香婷婷开心综合基地| 噼里啪啦完整版中文在线观看| 五月丁香AV、伊人业余、性色熟妇| 五月丁香啪啪啪综合网| AAA久久| 综合五月婷婷| 99 频99热国里只有精品| 无码少妇高潮喷水A片免费| 丁香桃色综合网| 日本一級黃色一級片| 色噜噜婷婷| 久久38视频| 99综合自拍| 亚洲午夜视频| 9久久精品| 天天夜天天色天天| 超级碰碰99| 久久五月天色婷婷| 九九亚洲综合| 色色色网站| 天天干狠狠艹| 99久热精品在线| 婷婷六月丁| www.婷婷,com| 日韩激情网站| 99热在线只有精品| 九九热这里都是精品6| 色色999三级片| 九九99精品视频| 金桔一区二区ab地址| 清纯唯美 激情四射| www色婷婷com| 色婷丁香| 97日本在线播放| 五月久久婷婷成人网| www.色五月| 蜜臀av 粉嫩av 懂色av| 亚洲成人av在线播放| 久久婷婷丁香五月一二三| 色一色综合| 亚欧州精品视频| 天天综合天天做天天综合| 99爱在线| 婷婷午夜天| 夜夜骑日日夜夜| 人人操人人干AV| 色135综合网| 婷婷 色 丁香 夜| 亚洲色婷婷色| 久久天堂婷婷五月| 天天日天天插| 六月婷婷色综合| 色婷婷丁香网| 91丨人妻丨国产丨丝袜| 国产精品美女| 亚洲第79页| 六月色伊人婷婷| 五月婷婷综合影院| 九九在线视频| 婷婷午夜精品久久久| 99色视频在线观看| av在线观看免费| 日本一区二区三区精品视频| 色99网| 天天色天天日| 深爱五月亚洲| 成人在线网| 9在线9在线婷婷在线国产| 亚洲激情综合网| 亚洲激情综合免费| 天天网站天天爽| 欧美性久| 欧美高潮9| 精品少妇人妻AV无码专区偷人| 色婷婷在线视频| 五月婷婷狠狠干| 色噜噜,噜噜色| 久草视频一,二三四| 99久久天堂婷婷| 欧美性猛交99久久久久99按摩| 大香蕉伊人99| 天天干电影| 天堂婷婷丁香六月网| 五月天婷基地| 久久久99久久| 99精品网址| 在线观看视频1区| 成人精品视频99在线观看免费| 97色在线观看视频| 可以看的AV| 亚洲成人va| 情欲综合网| 国产激情AV| 国产婷婷五月天| 色九九七七| 亲子乱AV-区二区三区| 欧洲MV日韩MV国产| 成人精品视频99在线观看免费| 激情另类综合| 性高潮久久久久久-九九九九九九九九九九热-成人AV | 五月天婷亚洲天综合网综合| 欧美成人精品三区综合A片| 五月婷婷五月天| 五月天婷婷在线AN| 日本三级日本三级三级人妇四虎| 丁香五月123| 色婷亚洲| 综合久久8| 久久一操| 色婷婷久久视屏| Caoub青青超碰| 丁香婷婷浪潮AV久久综合| 久久久久久久久月丁| 日产精品久久久久久久蜜臀| 九九热免费视频| 日本不卡一区二区三区| 中文字幕成人| 熟女少妇内射日韩亚洲| 欧美情色电影一区二区| 国产69久久久欧美黑人A片| 99ER热精品视频| 4399无码视频| 国产真实乱了老女人视频| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 丁香五月婷婷综合精品素人| 69色婷婷| 天天干天天干天天干| 婷婷五月丁香91| 激情五月婷婷综合| 婷婷精品| 中文字幕日产A片在线看| 婷婷的五月天另类视频| 亚洲乱码日产精品BD| 久久丁香综合精品综合| 色婷婷五月成人网| 婷婷五月天中文字幕| 日韩成人AV在线| 青青操avbb| 五月色情网| 五月丁香六月综合激情无码软件亮点| 五月婷激情| 久草狼人| 99这里只有精品| 五月天福利影院导航| 婷婷久久爱| 久久九九玖玖| 99热这里只有精品亚洲| 俺五月| 日日干天天爽| www色色com| 99自拍视频| www.久久久久久久久久.com| 五月丁香六月成人| 免费黄色视频网址| 五月久久亚洲| 九艹在线| www.99视频| 熟妇内谢69XXXXXA片| 色婷婷色五月综合| 99思思在线视频| 六月婷婷影院| 成人网站免费在线播放| 在线观看免费视频| 婷婷丁香五月基地| 五月婷婷新网站| 亭亭五月色男人| 九月丁香亭亭| 五月Huangsewang| 久久综合丁香| 欧洲激情网站| 色偷偷色婷婷| 一起草av| 五月丁香婷婷成人版| 无码一区二区日韩| 丁香六月婷婷| 三十熟女| 精品人妻在线| 99re热久久| 久久久久久久久久8888| 夜夜爽天天爽| 九色在线观看91av| 五月亭亭六月激情| 成人AV在线网站| 国产一区二区av免费| 激情六月丁香| 色色色9| 五月天激情国产综合婷婷婷| 丁香五月婷婷色偷偷| 五月丁香成人| 色情成人五月天| 天海翼中文字幕高| 思思99热这里只有精品| 婷婷国产成人| 欧美性猛交 XXXX 乱大交| 九九婷婷综合| 日日夜夜狠狠操| 婷婷五月天影院| 五月天天堂久久| 色播五月婷婷五月| 精品久久久中文字幕大豆网推荐理由| 激情av在线| 香蕉AV777XXX色综合一区| 欧美色综合天天久久综合精品| 五月婷婷六月丁香玖玖玫瑰91| 操操操操操电影网| 丁香六月激情综合| 六月丁香成人| 婷婷开心六月| 爱爱网址9| 99热精品少| 日本色天堂| 五月丁香成年黄色| 五月丁香淫淫婷婷婷| 久久综合激情| 操人无码| 婷婷五月丁香六月| 狠狠干综合网| www,26uuu,c0m,色情| 综合狠久久| 色婷婷狠狠色| 精品久久久91久久影视网| 五月色综合| 91热在线| 51成人| 九九无码| 99五月婷| 中文在线成人| 91视频免费后入强操| 久久视频在线| 色婷小说| 性色视频| www.久久色.com| 丁香五月亚洲天堂| 综合色图婷婷| 亚洲激情网站| 青青久在线视频免费观看| 激情丁香久久| 69精品人人人人| 五月天中文字幕在线婷婷|