关于串口通信的原理这篇博客讲的相对比较简单易懂: http://blog.csdn.net/qiwenmingshiwo/article/details/49557889,适合刚接触的同学,本片主要与大家分享一下如果具体使用,使得的自己所要开发的串口通信功能跑起来,也是菜鸟一枚,如果不对的地方请大神指教
一、串口调试工具
最好是下载一个串口调试工具先对自己的板子测试一下,明确自己到底有那些串口串口及路径,我使用的这个工具,大家可以尝试一下:http://www.cr173.com/soft/66999.html
并且找到了相应的源码:http://download.csdn.net/download/asqwduanfeng/9676069,其实也就是谷歌提供的,大神改造了成功运行在AS上的,感谢一下大神.
二、如果使用google提供的Serial port API
1.导入so文件
在主目录文件夹下建一个jniLibs文件夹,将需要的依次导入即可
2、在主目录下建立cpp,用于存储JNI相关的C代码
之后必须在build.gradle下修改CMakeLists的路径
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}
修改完成之后,如果编译会自动生成一个如下的文件,无需修改,提交代码的时候ignore就OK
3、修改cpp下的Serialport.c和Serialport.h的内容,修改如下
将包名替换为项目的包名,类名只要是你自己命名的类,一般都是copy的,所以不用改,AS中crtl +R,搜索包名,然后将其全部替换为自己的包名即可,包名是
AndroidManifest下的,见下图
4.下载NDK,和CMAKE
使用
打开串口:
串口路径:“/dev/ttMT1”
波特率:9600
这两个参数必须不配置正确,否则无法使用,一般每个厂商会有自己特定的规定,具体会有文档说明,如果文档说明不清楚,就要主动去沟通,一定得问明白,能不能用就看这两个参数了
//打开串口
public SerialPort getSerialPort() throws SecurityException, IOException, InvalidParameterException {
if (mSerialPort == null) {
mSerialPort = new SerialPort(new File("/dev/ttyMT1"), 9600, 0);
Log.d(TAG,"getSerialPort执行了");
}
return mSerialPort;
}
发送数据和接收数据:一般是16进制的,具体要根据说明文档按照人家规定的帧格式去操作,包括接收到的数据的处理也是如此,如果接收的有分高8位和低8位的,高8位的一定得左移8位之后和低8位一起处理,这样的数据才合理:
//发送数据
public void send(byte[] sendCmd) {
Log.d(TAG,"====sendCmd======" + sendCmd);
if (sendCmd == null && sendCmd.length == 0) {
return;
}
Message message = Message.obtain();
message.obj = sendCmd;
sendingHandler.sendMessage(message);
}
/**
* 读取流中的数据
*/
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
while (!isInterrupted()) {
int size;
try {
byte[] buffer = new byte[11];
if (mInputStream == null) return;
size = mInputStream.read(buffer);
if (size > 0) {
int i = 0;
i++;
onDataReceived(buffer, size);
Log.d(TAG,"==========i==========" + i);
}
} catch (IOException e) {
e.printStackTrace();
return;
}
}
}
}
具体的逻辑在onDateReceived中实现,这里的byte[] buffer = new byte[11], 11是根据我们文档中每次发送的字节数来定义的,具体可以根据你自己项目中接收的字节数处理即可。
关闭串口
//关闭串口
public void closeSerialPort() {
if (mSerialPort != null) {
mSerialPort.close();
mSerialPort = null;
}
}
注意:在实际开发中可能一下open和close会报红,大可不必care,只要功能正常就好了,我做的时候纠结了好长时间,发现没必要
/**
* 打开串口设备的方法
* @param path 设备的绝对路径
* @param baudrate 波特率
* @param flags 标志
* @return
*/
private native static FileDescriptor open(String path, int baudrate, int flags);
//关闭设备
public native void close();
本人菜鸟一枚,大多地方也是借鉴前辈的经验,目前只是在使用这些,具体内部的知识还需再深究,想要走下去NDK这块是必须了解的,如果有好的学习文章或路径欢迎推荐,如果有需要详细代码的请私信我 2966325911@qq.com,或加我QQ2966325911