最近遇到在安卓上通过串口连接地磅的需求, 基本上实现了读数和判断地磅稳定状态 , 这里分享出来实现过程以方便大家开发.我们开发用的打印机是XK3190-A9+ ,需要这个打印机参数文档的可以耀华官网下载:http://www.yaohua.com.cn/companyfile/16/
地磅是通过串口连接的,连接地磅主要参数有串口名称、波特率、一帧长度、以及是否校验,校验位等其他参数;
我这边做的参数有:串口名称、波特率、一帧长度以及通讯方式;
一、地磅参数
1、串口名称
在我安卓工控机上是已接入是RS232,命名为ttfS1和ttfS3两个串口;
RS232、TTL、COM 是不同电平和逻辑的串口,百度一下大概有常用的电平标准有TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232、RS485等,还有一些速度比较高的 LVDS、GTL、PGTL、CML、HSTL、SSTL等
2、波特率
波特率即调制速率,指的是有效数据讯号调制载波的速率,即单位时间内载波调制状态变化的次数。
XK3910-A9+支持的波特率有:600、1200、2400、4800、9600;我这里统一选择了9600
3、一帧长度
是指一次信号携带的数据长度 ,耀华是8位,其中开后1位是“=”号连接位,后面7位是数据位。
4、通讯方式
意思是说地磅跟其他机器的通讯方式,可以选择连续发数据,但不接收数据、发送一次和等待接收、连续发送8位、连续发送9位这四种;我选择的是连续发送8位。
地磅上相关参数的设置方步骤和方式:
更多设置可以去下载打印机文档.
二、配置参数
1、外设参数配置,先配置上面的默认参数
String port = “/dev/ttyS1”;//串口名字,默认ttfS1
int baudRate = 9600;//波特率,默认9600
int dateLengthPerFrame = 8;//每一帧的数据长度 ,耀华是8位
2、增加上一些本地的参数配置
int stableTimeMills = 1000;//地磅稳定时间,超过这个时间数据不曾修改则表示地磅稳定,耀华的是1秒
int receiveTimeOut = 1000;//地磅接收超时,一般地磅会毫秒内发送数据,超过这个时间则表示地磅链接失败,默认是1秒没内收到数据就表示地磅链接失败
int receiveTimeCountdownInterval = 500;//地磅接收超时,倒计时 ,默认50毫数一次
double recentlyValidWeightNum = 0.0;//最近一次有效读磅数
3、自定义地磅状态
public enum PoundStatus {
UN_CONNECTED(-1),//未连接
UNSTABLE(0),//已连接,不稳定
STABLE(1);//已连接,已稳定
int code;
PoundStatus(int code) {
this.code = code;
}
public String getStatusStr() {
return code == -1 ? "未连接" : (code == 0 ? "不稳定" : "稳定");
}
}
三、连接地磅代码解析
1、增加一个串口管理依赖
gradle 下添加依赖 implementation 'com.github.547394:SerialPortManager:1.0.10'
2、新建一个PoundManager.java 增加上面的相关配置参数
public class PoundManager {
static PoundManager instance;//唯一实例
SerialPortManager serialPort;//端口管理器
SerialPortProtocol protocol = new SerialPortProtocol();//端口协议
String port = "/dev/ttyS1";//串口名字,默认ttfS1
int baudRate = 9600;//波特率,默认9600
int stableTimeMills = 1000;//地磅稳定时间,超过这个时间数据不曾修改则表示地磅稳定,耀华的是1秒
CountDownTimer countDownTimer;//地磅信号接收超时倒计时
int receiveTimeOut = 1000;//地磅接收超时,一般地磅会毫秒内发送数据,超过这个时间则表示地磅链接失败,默认是1秒没内收到数据就表示地磅链接失败
int receiveTimeCountdownInterval = 500;//地磅接收超时,倒计时 ,默认50毫数一次,
int dateLengthPerFrame = 8;//每一帧的数据长度 ,耀华是8位
PoundStatusListener poundStatusListener;//地磅状态监听器
PoundStatus poundStatus = PoundStatus.UN_CONNECTED;//地磅状态,默认未连接
double recentlyValidWeightNum = 0.0;//最近一次有效读磅数
long lastValidWeightNumTimeMills;//最后一次有效读数时间
long lastDataReceiveTime;//最后一次监听到数据输入的时间
public static PoundManager getInstance() {
if (instance == null) {
instance = new PoundManager();
}
return instance;
}
/**
* 地磅信息
*/
public interface PoundStatusListener {
void onTick(double lastValidWeightNum, PoundStatus status);
}
/**
* 地磅状态
*/
public enum PoundStatus {
UN_CONNECTED(-1),//未连接
UNSTABLE(0),//已连接,不稳定
STABLE(1);//已连接,已稳定
int code;
PoundStatus(int code) {
this.code = code;
}
public String getStatusStr() {
return code == -1 ? "未连接" : (code == 0 ? "不稳定" : "稳定");
}
}
}
3、初始化端口连接
//初始化端口设置
public void init() {
outPutInfo("正在初始化地磅设置");
initSettingFromSP();
serialPort = new SerialPortManager();
protocol.setFixedLength(dateLengthPerFrame);
serialPort.setBufferSize(1024);
serialPort.setProtocol(protocol);
serialPort.setReceivedTimeout(receiveTimeOut);
serialPort.enableDebug(true);//是否开启日志
serialPort.setOnDataListener(new OnDataListener() {
@Override
public void onDataReceived(byte[] bytes) {
// dealReceiveDataOld(bytes);
dealReceiveData(new String(bytes));
}
@Override
public void onDataSend(byte[] bytes) {
super.onDataSend(bytes);
}
});
serialPort.setOnOpenListener(new OnOpenListener() {
@Override
public void onSuccess(File device) {
super.onSuccess(device);
// poundStatus = PoundStatus.UNSTABLE;
// outPutInfo("地磅连接成功,开始监听数据返回");
startListeningPortCountDown();