欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

android串口,android串口通信

android 串口為什么不能正常讀寫

串口通信數(shù)據(jù)丟失很大一部分原因是:mscomm的inputlen設置設置有問題;

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的市中網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!

解決方案:

mscomm的inputlen設置為0吧(讀取整個緩沖區(qū)),讀完一次,清空一次緩沖區(qū)試試;

參考如下:

窗體初始化事件中建議將mscomm的這幾個屬性做如下設置:

mscomm.inbuffersize=8 '接收緩沖區(qū)大小

mscomm.rthreshold=4 '促發(fā)oncomm事件的字符數(shù)

mscomm.inputlen=0 '默認讀取整個緩沖區(qū)

mscomm.inputmode=cominputmodetext '以文本方式接收

mscomm.inbuffercount=0 '清空緩沖區(qū)

oncomm事件中,建議處理完接收數(shù)據(jù)后用mscomm.inbuffercount=0清空緩沖區(qū)

Android串口通訊

1.打開串口。

2.串口處于監(jiān)聽狀態(tài)

3.想串口寫入數(shù)據(jù),串口接收到數(shù)據(jù)返回數(shù)據(jù)

SerialPort類所在的包一定要和上圖包名一直,因為串口通訊需要使用jni中的函數(shù)。

package android_serialport_api;

import java.io.File;

import java.io.FileDescriptor;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import com.fx.serialporttest.L;

public class SerialPort {

/*

* Do not remove or rename the field mFd: it is used by native method

* close();

*/

private FileDescriptor mFd;

private FileInputStream mFileInputStream;

private FileOutputStream mFileOutputStream;

/**

* 構造方法

* @param device 串口地址

* @param baurate 波特率

* @param flags

* @throws IOException

* @throws InterruptedException

*/

public SerialPort(File device,int baudrate,int flags) {

/*

* 檢測是否有訪問權限

*/

if(!device.canRead()||!device.canWrite()){

//如果沒有讀寫權限,嘗試chmod命令這個文件

L.tag("沒有讀寫權限");

Process su;

try {

su = Runtime.getRuntime().exec("/system/bin/su");//獲取root讀寫權限

String cmd = "chmod 777"+device.getAbsolutePath()+"\n"+"exit\n";

su.getOutputStream().write(cmd.getBytes()); //向此路徑文件寫入命令

if((su.waitFor()!=0||!device.canRead()||!device.canWrite())){

throw new SecurityException();

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

mFd = open(device.getAbsolutePath(),baudrate,flags);

if(mFd==null){

mFd = open(device.getAbsolutePath(),baudrate,flags);

L.tag("native open return null");

}

mFileInputStream = new FileInputStream(mFd);

mFileOutputStream = new FileOutputStream(mFd);

}

public FileInputStream getmFileInputStream() {

return mFileInputStream;

}

public void setmFileInputStream(FileInputStream mFileInputStream) {

this.mFileInputStream = mFileInputStream;

}

public FileOutputStream getmFileOutputStream() {

return mFileOutputStream;

}

public void setmFileOutputStream(FileOutputStream mFileOutputStream) {

this.mFileOutputStream = mFileOutputStream;

}

//JNI

private native static FileDescriptor open(String path,int baudrate,int flags);

public native void close();

static {

System.loadLibrary("serial_port");

}

}

package android_serialport_api;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import com.fx.serialporttest.L;

public? class SerialPortFinger {

private static ReadThread readThread;

private static FileInputStream mFileInputStream;

private static FileOutputStream mFileOutputStream;

static String path = "/dev/ttyS0";//設備主板的串口地址,地址有所不同

public? void startListener(){

SerialPort serialPort = new SerialPort(new File(path), 9600, 0);//9600是波特率,這個也是有所不同,具體要看設備

mFileInputStream = serialPort.getmFileInputStream();

mFileOutputStream = serialPort.getmFileOutputStream();//獲取串口寫入流

readThread? = new ReadThread();

readThread.start();//開啟監(jiān)聽

}

/**

* 發(fā)送指令到串口

*

* @param cmd

* @return

*/

public boolean sendCmds(String cmd) {

boolean result = true;

byte[] mBuffer = (cmd+"\r\n").getBytes();

try {

if (mFileOutputStream != null) {

mFileOutputStream.write(mBuffer);

} else {

result = false;

}

} catch (IOException e) {

e.printStackTrace();

result = false;

}

return result;

}

static class ReadThread extends Thread{

@Override

public void run() {

// TODO Auto-generated method stub

super.run();

int len;

StringBuffer sb = new StringBuffer("");

while(true){ //循環(huán)監(jiān)聽串口,讀取返回的數(shù)據(jù)

byte[] buffer = new byte[1024];

if(mFileInputStream==null){

return;

}

try {

len = mFileInputStream.read(buffer);

if(len0){

sb.append(new String(buffer, 0, len));

}

if(!sb.toString().equals(""))

{

L.tag(sb.toString());//收到串口的返回數(shù)據(jù),在日志中打印出來

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

L.tag("接受完成");

}

}

}

}

Android平臺的串口通信技術

如下表不同操作系統(tǒng)的串口地址,Android是基于Linux的所以一般情況下使用Android系統(tǒng)的設備串口地址為/dev/ttyS0...

Android UART 串口通信

最近有項目需要實現(xiàn)windows機器和Android開發(fā)版進行UART串口通信,經(jīng)過3天查找嘗試,特記錄一下最終方案,希望之后的同行少走彎路,最后在git上回開源我最終的方案希望大家支持。

Android 3.0.1

Gradle 4.1

ARM開發(fā)版 : RK3399

PC機器:Win10

開發(fā)機器:MAC 10.13.3

先上圖

由于 android-serialport-api 項目中的so使用較old的ndk編譯,所以在對于Android 6.0 以上版本兼容的時候會報錯 dlopen failed: "has text relocations" 。且使用的mk進行編譯,特升級為用cmake編譯。

升級 android-serialport-api

項目結構:

app對應原項目中的各個Activity, androidserial 是module 對應編譯之前的so,還有API的封裝。可以直接引用androidserial,調(diào)用方法參考app目錄下的activity。

注意 關于權限!

當接入開發(fā)板后如果發(fā)現(xiàn) Error You do not have read/write permission to the serial port 需要root 權限 ,在開發(fā)者模式中開啟root 權限 adb和應用

使用一下命令開啟Android對串口的讀寫權限

setenforce 0 : 關閉防火墻,有人說關鍵是這,但是我的環(huán)境不用關閉,只要給權限就可以

注意 關于ttyS1 - 6 ttyS1 - 6 對應的是 UART 串口1-6 一般都是一一對應的。這個具體要看一下開發(fā)板的說明。

記錄的比較糙,還請見諒,如有問題請留言,我看到后肯定回復。項目主要看結構,剩下的都是復制黏貼的事。 git地址:

當前標題:android串口,android串口通信
文章來源:http://chinadenli.net/article42/dsdscec.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供自適應網(wǎng)站網(wǎng)站建設用戶體驗虛擬主機網(wǎng)站制作定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設