XK3168地磅仪表DB9线RS232协议串口电脑读取笔记

本文介绍了如何使用安卓的android-serialport-api库进行串口通信,详细说明了串口连接方式、参数设置以及斤数数据的解析方法,包括数据位、校验位和停止位的设定。此外,还提供了Java代码示例来演示如何读取和解析来自串口的重量数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

(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();


    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法国红酒洗大虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值