导航:首页 > 操作系统 > android访问串口

android访问串口

发布时间:2022-12-29 06:00:09

⑴ 怎么查看android 设备的串口

1. 如果是linux,不需要单独安装什么串口驱动
2. 但需要使用ls /dev/tty * 查看usb 串口设备是否被检测到
2. 然后使用linux下的MINICOM进行串口信息打印,具体配置和用法可以一下

⑵ 如何开放android的串口权限

要调用串口,肯定是要用到JNI的,而且要有打开对应串口设备的权限
至于是不是通过USB转的,没啥关系,因为USB转串口的驱动已经把USB的特征封装了,就当它是一个纯串口操作就行
android-serialport-api也是用的JNI,要想知道能不能用,装它的DEMO代码试试就知道了
不然重新写一个JNI的库,用android-serialport-api的也行,不然网上也好多现成的代码,基本不用重写

⑶ 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,我整理了一下,调通了。

⑷ android如何读取串口数据

代码如下:
import com.friendlyarm.AndroidSDK.HardwareControler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

public class MapGuider_Activity extends Activity{

private int serial_fd=0;
private byte[] serial_RevBuf=new byte[100];
private byte[] serial_SendBuf="fsjajd".getBytes();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mapguider);
serial_fd=HardwareControler.openSerialPort("/dev/s3c2410_serial1", 115200, 8, 1);
if(serial_fd!=-1)
{
System.out.println("打开串口成功");
HardwareControler.write(serial_fd, serial_SendBuf);
lac_handler.post(RevicePosDataThread);
}
else
{
System.out.println("指定的串口不存在或在其它进程中已被打开");
}
}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
HardwareControler.close(serial_fd);
System.out.println("关闭串口");
lac_handler.removeCallbacks(RevicePosDataThread);
super.onDestroy();
}

Handler lac_handler =new Handler(){

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
}

};
Runnable RevicePosDataThread =new Runnable()
{
int err=0;
String s;
public void run() {
// TODO Auto-generated method stub
while(true)
{
//Looper.prepare();
err=HardwareControler.select(serial_fd, 1, 0);
if(err==1)//有数据可读
{
HardwareControler.read(serial_fd, serial_RevBuf, 10);
s=new String(serial_RevBuf);
System.out.println("接收到串口数据"+s);
}
else if(err==0) //无数据可读
{
System.out.println("没有接收到串口数据");
}
else //出错
{
System.out.println("接收到串口数据出错");
}
try {
Thread.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

};

}

⑸ 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("接受完成");

}

}

}

}

⑹ 求助,求大神,android与串口通信

转载最近做的项目用到了蓝牙串口通讯功能.毕竟是接触到底层的一些东西,让吾等局限于java编程思想的小菜遇到了一些意想不到的问题.

问题一,连接不上蓝牙串口
直接在android自带的蓝牙例子上尝试,发现根本连接不上蓝牙串口,后来对比别人的代码发现uuid不一样.因为以前用过UUID.randomUUID();所以想当然的认为所有uuid都是随机生成的.通过搜索发现,android连接蓝牙串口的话,必须要这个UUID

UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

问题二,在读取从蓝牙串口返回的数据时,一直阻塞在inpustream.read(buffer);那里.

起初是因为仿照网上的例子,直接发送指令的16进制字符串过去,返回不到数据.后来通过反编译可以使用的蓝牙串口助手apk发现,需要发送的不是16进制字符串的byte数组.而是将16进制字符串转换成的byte数组.

String string = "01 00 05 07 00 00 00 00";
string = string.replaceAll(" ", ""); byte[] bytes = hexString2Bytes(string);//正确,要发送这个bytes
byte[] bytes = string.getBytes();//错误,发送这个bytes获取不到数据.

附上hexString2Bytes方法

/**
* Convert hex string to byte[] 把为字符串转化为字节数组
*
* @param hexString
* the hex string
* @return byte[]
*/
public static byte[] hexStringToBytes(String hexString) {
hexString = hexString.replaceAll(" ", "");
if (hexString == null || hexString.equals("")) {
return null;
}
hexString = hexString.toUpperCase(Locale.getDefault());
int length = hexString.length() / 2;
char[] hexChars = hexString.toCharArray();
byte[] d = new byte[length];
for (int i = 0; i < length; i++) {
int pos = i * 2;
d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
}
return d;
}

/**
* Convert char to byte
*
* @param c
* char
* @return byte
*/
private static byte charToByte(char c) {
return (byte) "0123456789ABCDEF".indexOf(c);
}

得出结论.串口通讯时,如果获取到错误的信息,是不返回数据的.在socket连接时.如果没有获取到数据.inputstream.read(buffer);是会一直阻塞的.

⑺ Android开发之串口通信:AndroidSerialPort

Android 串口通信,基于 谷歌官方android-serialport-api 编译

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

读取数据时很可能会遇到分包的情况,即不能一次性读取正确的完整的数据

解决办法:可以在读取到数据时,让读取数据的线程sleep一段时间,等待数据全部接收完,再一次性读取出来。这样应该可以避免大部分的分包情况

只接收一条数据的情况下,以上方法可以应对数据分包,数据量多的情况下需要考虑是否会因为sleep导致接收多条数据,可以根据通信协议核对包头包尾等参数。

打开串口时,会检测读写权限,当没有权限时,会尝试对其进行提权

⑻ 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

阅读全文

与android访问串口相关的资料

热点内容
苹果平板如何开启隐私单个app 浏览:704
空调压缩机一开就停止 浏览:528
如何下载虎牙app 浏览:847
日语年号的算法 浏览:955
dev里面的编译日志咋调出来 浏览:298
php函数引用返回 浏览:816
文件夹和文件夹的创建 浏览:259
香港加密货币牌照 浏览:838
程序员鼓励自己的代码 浏览:393
计算机网络原理pdf 浏览:752
吃鸡国际体验服为什么服务器繁忙 浏览:94
php中sleep 浏览:490
vr怎么看视频算法 浏览:86
手机app如何申报个人所得税零申报 浏览:694
如何截获手机app连接的ip 浏览:331
冰箱压缩机是否需要电容 浏览:346
python列表每一行数据求和 浏览:275
自己有一台服务器可以玩什么 浏览:657
社会学波普诺pdf 浏览:584
解压做食物的小视频 浏览:760