當前位置:首頁 » 安卓系統 » android的串口

android的串口

發布時間: 2023-05-23 09:04:51

A. android串口消息

android串口消息連接的方法為:
1.模擬器可以使用PC的串口。
啟動模擬器並載入PC串口 命令如下。
運行 emulator @模擬器名稱 -qmu -serial COM1。
2.查看串口是否被載入。
啟動後使用 adb shell 命令打開命令行
cd dev 查看會發現ttyS0 ttyS1 ttyS2,其他ttyS2 就是我們載入上來的串口COM1
3.修改許可權
chmod 777 ttyS2
現在我們可以開發串口程序了。
4.串口程序實例
下載libserial_port.so ,放入libs/armeabi 目錄,可以自己創建此目錄
libserial_port.so 下載地址:
http://code.google.com/p/android-serialport-api/
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.util.Log;

public class SerialPort {

private static final String TAG = "SerialPort";

private FileDescriptor mFd;
private FileInputStream mFileInputStream;
private FileOutputStream mFileOutputStream;

public SerialPort(File device, int baudrate) throws SecurityException, IOException {

if (!device.canRead() || !device.canWrite()) {
try {
Process su;
su = Runtime.getRuntime().exec("/system/bin/su");
String cmd = "chmod 666 " + device.getAbsolutePath() + "n"
+ "exitn";
su.getOutputStream().write(cmd.getBytes());
if ((su.waitFor() != 0) || !device.canRead()
|| !device.canWrite()) {
throw new SecurityException();
}
} catch (Exception e) {
e.printStackTrace();
throw new SecurityException();
}
}

mFd = open(device.getAbsolutePath(), baudrate);
if (mFd == null) {
Log.e(TAG, "native open returns null");
throw new IOException();
}
mFileInputStream = new FileInputStream(mFd);
mFileOutputStream = new FileOutputStream(mFd);
}

public InputStream getInputStream() {
return mFileInputStream;
}

public OutputStream getOutputStream() {
return mFileOutputStream;
}

//JNI
private native static FileDescriptor open(String path, int baudrate);
public native void close();
static {
System.loadLibrary("serial_port");
}
}

####################################

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class PrintClass {

//輸入流
private static InputStream in;
//輸出流
private static OutputStream out;

private static final String PORT = "/dev/ttyS2";//串口

private SerialPort serialPort;

private void Connect()
{
try {
serialPort = new SerialPort(new File(PORT), 38400);

in = serialPort.getInputStream();
out = serialPort.getOutputStream();

} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public void CloseSerialPort()
{
try {
out.close();
in.close();
serialPort.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

B. 怎麼查看android 設備的串口

1. 如果是linux,不需要單獨安裝什麼串口驅動
2. 但需要使用ls /dev/tty * 查看usb 串口設備是否被檢測到
2. 然後使用linux下的MINICOM進行串口信息列印,具體配置和用法可以一下

C. android 串口為什麼不能正常讀寫

串口通讓游信枝滑攔數據丟失很大一部分原因是:mscomm的inputlen設置設置有問題;
解決方案:
mscomm的inputlen設置為0吧(讀取整個緩沖區),讀完一次,清空一次緩沖區試試;
參考如下:
猛胡窗體初始化事件中建議將mscomm的這幾個屬性做如下設置:
mscomm.inbuffersize=8 '接收緩沖區大小
mscomm.rthreshold=4 '促發oncomm事件的字元數
mscomm.inputlen=0 '默認讀取整個緩沖區
mscomm.inputmode=cominputmodetext '以文本方式接收
mscomm.inbuffercount=0 '清空緩沖區
oncomm事件中,建議處理完接收數據後用mscomm.inbuffercount=0清空緩沖區

D. Android UART 串口通信

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

Android 3.0.1
Gradle 4.1
ARM開發版 : RK3399
PC機器:Win10
開發機器: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 是mole 對應編譯之前的so,還有API的封裝。可以直接引用androidserial,調用方法參考app目錄下的activity。

注意 關於許可權!

當接入開發板後如果發現 Error You do not have read/write permission to the serial port 需要root 許可權 ,在開發者模式中開啟root 許可權 adb和應用

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

setenforce 0 : 關閉防火牆,有人說關鍵是這,但是我的環境不用關閉,只要給許可權就可以

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

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

E. Android8.1系統修改串口節點

        應客戶需求,需要將Android系統裡面的串口4(/dev/ttyS4)節點名稱修改為/dev/ttyS9。

        由於設備節點都是在驅動裡面注冊生成的於是查看串口驅動。根據log信息找到了系統串口驅動\kernel\drivers\tty\serial\8250\8250_dw.c中的注冊函數dw8250_probe。該函數中找到serial8250_register_8250_port,這個是注冊設備節點的函數。然後查看serial8250_register_8250_port函數定義(kernel\drivers\tty\serial\老山租8250\8250_core.c),找到了後續注冊節點的函數uart_add_one_port,繼續查看該函數(位於kernel\drivers\tty\serial\serial_core.c)定義,該函數又是調用tty_port_register_device_attr進行注冊的,繼續跟蹤該函數(侍兆kernel\drivers\tty\tty_port.c),該函數又是調用了tty_register_device_attr(位於kernel\drivers\tty\tty_io.c)進行注冊。添加log分析得知串口節點唯虛的名字獲取是由tty_line_name產生的。於是查看tty_line_name的實現:

static ssize_t tty_line_name(struct tty_driver *driver, int index, char *p)

{

if (driver->flags & TTY_DRIVER_UNNUMBERED_NODE)

return sprintf(p, "%s", driver->name);

else

return sprintf(p, "%s%d", driver->name,

  index + driver->name_base);

}

}

通過列印得知串口節點設備名稱是由驅動名稱 driver->name和串口序號index 組成的,於是添加判斷 driver->name是否為"ttyS",index是否為4,如果是就替換。

F. 如何開放android的串口許可權

要調用串口,肯定是要用到JNI的,而且要有打開對應串口設備的許可權
至於是不是通過USB轉的,沒啥關系,因為USB轉串口的驅動已經把USB的特徵封裝了,就當它是一個純串口操作就行
android-serialport-api也是用的JNI,要想知道能不能用,裝它的DEMO代碼試試就知道了
不然重新寫一個JNI的庫,用android-serialport-api的也行,不然網上也好多現成的代碼,基本不用重寫

G. Android開發之串口通信:AndroidSerialPort

Android 串口通信,基於 谷歌官方android-serialport-api 編譯

項目github地址: https://github.com/AIlll/AndroidSerialPort

讀取數據時很可能會遇到分包的情況,即不能一次性讀取正確的完整的數據

解決辦法:可以在讀取到數據時,讓讀取數據的線程sleep一段時間,等待數據全部接收完,再一次性讀取出來。這樣應該可以避免大部分的分包情況

只接收一條數據的情況下,以上方法可以應對數據分包,數據量多的情況下需要考慮是否會因為sleep導致接收多條數據,可以根據通信協議核對包頭包尾等參數。

打開串口時,會檢測讀寫許可權,當沒有許可權時,會嘗試對其進行提權

H. android虛擬機串口通信

工具:Virtual Serial Port Driver.
用這個工具虛擬出一對串口。
下載地址

2.用串口調試助手,測試串口通信。
3.用這個命令啟動虛擬機:emulator @2.2 -scale auto -qemu -serial COM3 &
說明:
2.2:是虛擬機的名稱。
COM3是你要選擇的串口。
ps:在cmd中使用這個命令有兩種方式:1)將安卓的sdk的tools文件夾加入到path環境變數中,2)在安卓的sdk的tools文件夾下打開cmd。
4.虛擬機中測試串口通信用谷歌的一個開源項目:android_serialport_api
5.在虛擬機中運行項目。
說明:運行前要獲取設備的許可權
1)在cmd中用adb shell命令,進入虛擬機命令行環境。

2)打開dev文件夾:cd dev
3)獲取許可權:chmod 777 ttyS2

6.谷歌的開源項目不能導入進eclipse,我整理了一下,調通了。

I. Android studio藍牙app的串口是什麼

Androidstudio藍牙app的串口是一種通信的方式。類似於USB只是比USB低級多了,但是手機等設備他沒外置這個串口,解決方式就是手機用藍牙連接一個小硬體,小硬體有個串口他的和單片機連接,來達到手機和單片機的串口連接這種方式就是藍牙串口。

Androidstudio藍牙app的串口特點

藍牙串口是基於SPP協議SerialPortProfile,能在藍牙設備之間喚宏旁創建串口進行數據傳輸的一種設備,藍牙串口的目的是針對如何在兩個不同設備通信的兩端上的應用之間保證一條完整的通信路徑,需要在系統設置里連接上HC05的藍牙,默認配對密碼為1234默認波特率為9600。

默認名為HC05最好在連接後再看一下對應的MAC地址,因為我做的是單一連接單片機同一時間只能接入一個藍牙設備,所以需求對和橡更改連接藍牙模塊需求要求不大,如果用戶不在創建項目時更改設備絕森MAC地址,則使用的就是默認的MAC地址所以也沒有做選擇藍牙設備的模塊。

J. Android串口通訊

1.打開串口。

2.串口處於監聽狀態

3.想串口寫入數胡鋒據,串口接收到數據返回數據

SerialPort類所嫌遲在的包一定要和上圖包名一直,因為串口通訊需要使用jni中褲者晌的函數。

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();//開啟監聽

}

/**

* 發送指令到串口

*

* @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){ //循環監聽串口,讀取返回的數據

byte[] buffer = new byte[1024];

if(mFileInputStream==null){

return;

}

try {

len = mFileInputStream.read(buffer);

if(len>0){

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

}

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

{

L.tag(sb.toString());//收到串口的返回數據,在日誌中列印出來

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

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

}

}

}

}

熱點內容
銳志哪個配置性價比最高 發布:2025-02-12 17:38:43 瀏覽:917
智能推送演算法 發布:2025-02-12 17:38:41 瀏覽:834
拍照上傳器 發布:2025-02-12 17:34:29 瀏覽:651
androidweb框架 發布:2025-02-12 17:32:45 瀏覽:75
安卓編程賀卡 發布:2025-02-12 17:32:44 瀏覽:837
php獲取資料庫的欄位 發布:2025-02-12 17:29:02 瀏覽:765
伺服器地址消失 發布:2025-02-12 17:23:36 瀏覽:950
後台執行php腳本 發布:2025-02-12 17:21:45 瀏覽:470
spring編程式事務 發布:2025-02-12 17:16:55 瀏覽:397
nginx禁止ip訪問 發布:2025-02-12 17:15:14 瀏覽:273