1、串口通信232的接线
一般通讯使用232串口的话,我们会用到2、3、5接口,根据安卓平板的标记依次接线(小白注意:接收端要与发送端接入,不要根据名称一样就接线)
2、导入第三方文件包
将以下包文件导入,然后遍历一下整个工程文件。
//串口
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.jakewharton:butterknife:8.8.1'
implementation 'com.jakewharton:butterknife:10.2.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'
implementation 'tp.xmaihh:serialport:2.1'
3、创建串口连接类serialport
package com.example.PipetterRobot.until;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import java.io.IOException;
import java.io.InputStream;
import tp.xmaihh.serialport.SerialHelper;
import tp.xmaihh.serialport.bean.ComBean;
import tp.xmaihh.serialport.stick.AbsStickPackageHelper;
public class serialport {
public static SerialHelper serialHelper;
public static Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
ComBean comBean = (ComBean) msg.obj;
String time = comBean.sRecTime;
String rxText;
rxText = new String(comBean.bRec);
// if (isHexType) {
// //转成十六进制数据
// rxText = ByteUtil.ByteArrToHex(comBean.bRec);
// }
// text += "Rx-> " + time + ": " + rxText + "\r" + "\n";
// mEtReadContent.setText(text);
return false;
}
});
public static void initSerialConfig() {
//初始化SerialHelper对象,设定串口名称和波特率
serialHelper = new SerialHelper(Const.SPORT_NAME, Const.BAUD_RATE) {
@Override
protected void onDataReceived(ComBean paramComBean) {
Message message = mHandler.obtainMessage();
message.obj = paramComBean;
mHandler.sendMessage(message);
}
};
/*
* 默认的BaseStickPackageHelper将接收的数据扩展成64位,一般用不到这么多位
* 我这里重新设定一个自适应数据位数的
*/
serialHelper.setStickPackageHelper(new AbsStickPackageHelper() {
@Override
public byte[] execute(InputStream is) {
try {
int available = is.available();
if (available > 0) {
byte[] buffer = new byte[available];
int size = is.read(buffer);
if (size > 0) {
return buffer;
}
} else {
SystemClock.sleep(50);
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
});
}
}
4、创建类文件Const,主要用于存取串口号和波特率,该方法可以设置成动态变量,目前该工程是定死的,可以自己更改
package com.example.PipetterRobot.until;
public class Const {
//串口 波特率
public static final String SPORT_NAME = "/dev/ttyS1";
public static final int BAUD_RATE = 9600;
public static final String TXT_TYPE_SEND = "hello";
public static final String HEX_TYPE_SEND = "123ABC";
}
5、打开串口,该方法可以直接写在你需要的点击事件里面直接用,使用之前一定要在界面oncreat中初始化一下串口配置
serialport.initSerialConfig();
if (serialport.serialHelper.isOpen()) {
Toast.makeText(LisActivity.this, Const.SPORT_NAME + "串口已经打开", Toast.LENGTH_SHORT).show();
return;
}
try {
serialport.serialHelper.open();
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(LisActivity.this, Const.SPORT_NAME + "串口打开成功", Toast.LENGTH_SHORT).show();
6、发送数据。直接将该方法复制到你的点击事件里面,我写了一个for循环传输,可以自己改
if (!serialHelper.isOpen()) {
Toast.makeText(getActivity(), Const.SPORT_NAME + "串口没打开 发送失败", Toast.LENGTH_SHORT).show();
return;
}
for(int i = 0;i<20;i++){
String sendContent = "*PR96|" + (5+i) + "|1|" + (10+i);
serialHelper.sendTxt(sendContent);
}
7、关闭串口
serialHelper.close();
serialHelper = null;