前言:
(1)厂家的技术文档的通讯方式说明中存在问题,你怎么读都不可能翻译成你想要的斤数,所以我自己打电话问了厂家技术并自己观察数据变化进行的总结,以下仅供参考。
(2)安卓端使用 android-serialport-api 来实现串口读取,记得设备OTG设置打开,代码中com口名称与设备实际的com口名称一致。
1.线连接方式:
第一条线,仪表端接头3针TXD接电脑端接头2针RXD
第二条线,仪表端接头7针GND接电脑端接头5针GND
2.电脑端读取串口参数设置:
波特率4800
数据位8
校验位无
停止位1
进制16(即编码HEX)
3.读取的数据每一位的解释:
读取的数据: FF 11 00 00 00
从左往右解释:
第一位: F固定字符
第二位: F固定字符
第三位: 正负值和地磅稳定状态标识位,共有四种状态,分别是 0表示正数且不稳定,1表示正数并稳定 ,2表示负数且不稳定 ,3表示负数并稳定
第四位: 应该是固定字符, 数值一直是1
第五位: 斤数位,十位
第六位: 斤数位,个位
第七位: 斤数位,千位
第八位: 斤数位,百位
第九位: 斤数位,十万位
第十位: 斤数位,万位
4.读取的数据例子:
FF 11 68 04 00 翻译结果 : 468 斤
FF 31 68 04 00 翻译结果 : -468 斤
FF 11 68 14 00 翻译结果 : 1468 斤
FF 31 68 14 00 翻译结果 : -1468 斤
FF 31 68 14 02 翻译结果 : -21468 斤
FF 31 68 14 32 翻译结果 : -321468 斤
5.电脑端JAVA代码读取
desc: 读取数据是按两次流为一组,一次流是状态信息,即FF 11 。第二次是6位数字的斤数,即 00 00 00。部分老款秤头会合并成一组。
第一步:加入RXTXcomm.jar依赖
第二步: 编写串口读取代码
import gnu.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.TooManyListenersException;
public class SerialBean implements SerialPortEventListener {
private static String PortName;
private static CommPortIdentifier portId;
private static SerialPort serialPort;
private static OutputStream out;
private static InputStream in;
public static int baud = 4800;
public SerialBean(String com, int baud) {
SerialBean.PortName = com;
SerialBean.baud = baud;
}
// 初始化串口,将输入流返回用于事件读取
public void Initialize() {
try {
portId = CommPortIdentifier.getPortIdentifier(PortName);
// 由对象打开串口,并为串口命名
serialPort = (SerialPort) portId.open("JAVA_SERIAL", 2000);
// 注册一个SerialPortEventListener事件来监听串口事件
serialPort.addEventListener(this);
// 数据可用则触发事件
serialPort.notifyOnDataAvailable(true);
// 打开输入输出流
in = serialPort.getInputStream();
out = serialPort.getOutputStream();
// 设置串口参数,波特率4800,8位数据位,1位停止位,无奇偶校验
serialPort.setSerialPortParams(baud, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
} catch (PortInUseException e) {
System.out.println("该串口正在使用中");
} catch (NoSuchPortException e) {
System.out.println("该串口当前不可使用");
} catch (UnsupportedCommOperationException e) {
System.out.println("错误的串口参数配置");
} catch (TooManyListenersException e) {
System.out.println("该串口已存在监听器");
} catch (IOException e) {
System.out.println("输入输出流打开失败");
}
}
// 关闭串口
public void ClosePort() {
serialPort.close();
}
// 监听串口事件
@Override
public void serialEvent(SerialPortEvent event) {
switch (event.getEventType()) {
case SerialPortEvent.BI://Break interrupt,通讯中断
case SerialPortEvent.OE://Overrun error,溢位错误
case SerialPortEvent.FE://Framing error,传帧错误
case SerialPortEvent.PE://Parity error,校验错误
case SerialPortEvent.CD://Carrier detect,载波检测
case SerialPortEvent.CTS://Clear to send,清除发送
case SerialPortEvent.DSR:// Data set ready,数据设备就绪
case SerialPortEvent.RI://Ring indicator,响铃指示
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:// Output buffer is empty,输出缓冲区清空
break;
case SerialPortEvent.DATA_AVAILABLE://Data available at the serial port,端口有可用数据。读到缓冲数组,输出到终端
byte[] bytes = null;
try {
if (in != null) {
bytes = new byte[in.available()];
if (in.available() > 0) {
in.read(bytes);//数据赋值到字节数组
}
}
} catch (IOException e) {
e.printStackTrace();
}
//转成16进制
String s = printHexString(bytes);
//打印正负和斤数
if (s.startsWith("FF")) {
switch (s) {
case "FF01":
System.out.print("正数且秤不稳+");
break;
case "FF11":
System.out.print("正数且秤稳+");
break;
case "FF21":
System.out.print("负数且秤不稳-");
break;
case "FF31":
System.out.print("负数且秤稳-");
break;
}
} else {
//调换斤数位置
System.out.print(s.charAt(s.length() - 2));//十万位
System.out.print(s.charAt(s.length() - 1));//万位
System.out.print(s.charAt(s.length() - 4));//千位
System.out.print(s.charAt(s.length() - 3));//百位
System.out.print(s.charAt(s.length() - 6));//十位
System.out.println(s.charAt(s.length() - 5));//个位
}
break;
}
}
/**
* 字节数组转16进制字符串
*
* @param b 字节数组
* @return 16进制字符串
*/
public static String printHexString(byte[] b) {
StringBuilder sbf = new StringBuilder();
for (byte value : b) {
String hex = Integer.toHexString(value & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
//sbf.append(hex.toUpperCase()).append(" ");
sbf.append(hex.toUpperCase());
}
return sbf.toString().trim();
}
}
第三步: 调用代码测试
public class MainTest {
public static void main(String[] args) throws ParseException {
//读取串口
SerialBean serialBean = new SerialBean("COM1", 4800);
serialBean.Initialize();
}