最近的任务是用java和一块安卓板子进行交互,读取命令,使用的是RXTXcomm,这个百度一下就有很多资料并且十分简单。
同时你也可以使用SecureCRT这个软件来先与板子进行交互,其中遇到的名词对你后面理解串口设置属性还是有帮助的。
左转,吾爱破解搜索:SecureCRT最新版和中文版
1.使用RXTX流程
1.找到所有可用端口(你要是实先就知道名字了也可以不需要这步)
2.打开某一个串口,并设置属性
3.添加回调,在你输入命令后,会返回系统给你发送数据的回调
4.获取串口的输出流,输出命令
5.在会调里等待回调,并在回调里,打开输入流读取数据
可以写个while重复45,不过建议每一个输入和输出之间都等待50ms
6.关闭串口和释放相关资源
2.注意事项
有两点需要注意的是:
1.命令写入
安卓系统是(UNIX)Linux系统,里面的换行是“\n”,而我们在进行命令写入的时候不能只写入命令,还需要加换行符,就像你输入了命令需要按下ENTER一样
SerialUtil.sendToPort(serialPort, (str + "\n").getBytes());
其实str是你输入的命令,如ls,ll之类的。有的命令在安卓系统里是没有的,这点还是得注意下
2.数据读取
在你输入命令之后,推荐等待50ms后读取数据,避免数据一段一段的。
一、有的数据是有一定返回的,不会一直打印,如ll,ls。这种命令就可以使用下面一直读取字节方式进行数据读取
/**
* 从串口读取数据
*
* @param serialPort 当前已建立连接的SerialPort对象
* @return 读取到的数据
* @throws ReadDataFromSerialPortFailure 从串口读取数据时出错
* @throws SerialPortInputStreamCloseFailure 关闭串口对象输入流出错
*/
public static byte[] readFromPort(SerialPort serialPort) throws ReadDataFromSerialPortFailure, SerialPortInputStreamCloseFailure {
//打开输入流
InputStream input;
try {
input = serialPort.getInputStream();
} catch (IOException e) {
throw new ReadDataFromSerialPortFailure();
}
byte[] bytes = new byte[1024];
//因为返回值为byte数组,所以这里采用bite流的方式,同时也方便输入流读取
ByteArrayOutputStream output = new ByteArrayOutputStream();
int len;
try {
while ((len = input.read(bytes)) > 0) {//这里大于0而不是!=-1,是因为后面会一直传来读取长度为0的读操作,会一直停在这里
output.write(bytes, 0, len);
}
} catch (IOException e) {//读取失败,关闭输入输出流
try {
output.close();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
input.close();
} catch (IOException e1) {
e1.printStackTrace();
}
throw new SerialPortInputStreamCloseFailure();
}
//返回,并关闭输入输出流
try {
input.close();
} catch (IOException e1) {
e1.printStackTrace();
}
byte[] result = output.toByteArray();
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
二、有的数据则是会一直打印信息,如logcat,则可用下面的方式:读取一行的字符串,然后一直读取
InputStream input;
try {
input = serialPort.getInputStream();
} catch (IOException e) {
e.printStackTrace();
break;
}
InputStreamReader inputReader = new InputStreamReader(input);
BufferedReader reader = new BufferedReader(inputReader);
String line;
try {
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
}
try {
reader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
不过这种情况,在终端的时候还有用ctrl+c的方式来停止,但是用java的话,目前还没找到办法
针对这种情况,我选择的是只打印一定数据的行数,并期望自己想要的数据就在里面,如logcat -t 1000
三、有的数据则是某一行会刷新进度,而不是下一行显示新的进度,如yum命令安装软件的时候,但是安卓里并没有,并且也不在此次任务需求之列,所以有兴趣的朋友可以自己去试试
rxtx包和工具类代码在这:http://download.csdn.net/download/ons_cukuyo/10023567