精华内容
下载资源
问答
  • 前言物联网开发开发是时下热门的行业。Android系统自然也能进行物联网开发。除开Android本身自带的模块还有一类通过外部链接的设备需要通过串口来进行通信。本人在做完两个相关的抓娃娃和寄存柜项目之后觉得需要总结...

    前言

    物联网开发开发是时下热门的行业。Android系统自然也能进行物联网开发。除开Android本身自带的模块还有一类通过外部链接的设备需要通过串口来进行通信。本人在做完两个相关的抓娃娃和寄存柜项目之后觉得需要总结一点东西给大家。

    一些预备知识

    关于串口

    串口通信指串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

    在串口通信中,常用的协议包括RS-232、RS-422和RS-485。

    当然具体是那种协议和你选择的硬件有关,将你的硬件插到对应协议的串口口即可。

    开发前的准备

    检查你的开发板设备,包括开发板信息,开发板上面包含的模块信息。是否有Wifi模块 蓝牙模块 指定接口等。还有一方面就是关于开发板系统的信息,开发板的系统版本。如果需要特别定制,可以和厂商商量。关于系统定制

    某些特殊的板块需要隐藏状态栏不能被下拉,否则会被退出应用。还有一方面就是可以定制取消掉下导航栏。

    检查你的硬件装备。正确连接你的设备,向你的硬件提供商索要开发资料。基本的资料包括硬件的通讯命令格式。当然更好的是如果能要到开发程序资料。比如android程序或者源码那就更好了。

    正确的连接,测试你的硬件与系统。Android串口助手下载地址:http://zhushou.360.cn/detail/index/soft_id/162355?recrefer=SE_D_%E4%B8%B2%E5%8F%A3%E5%8A%A9%E6%89%8B

    下载一个串口调试助手,按照资料输入命令。测试是否能够成功的启动设备。并且收到对应的返回数据。

    开发阶段

    需要一点点的JNI知识和一点点Android多线程开发经验

    整体的开发流程如下:打开指定串口-->开启接收数据线程(readthead)-->发送串口数据-->接收数据处理返回信息-->关闭接收数据线程(readthead)-->关闭串口。

    导入so库

    谷歌开源serialPort api项目https://github.com/cepr/android-serialport-api

    里面封装了c层代码调用底层代码的通信方式,如果你们喜欢改东西的话。可以自己改着玩,不过我觉得没有必要,因为这些代码已经封装的很好了。直接使用即可。

    至于通过c代码如何生成相应的so文件,以及如何java层调用c层代码都是很基础的东西啦。我不想在这里展开大篇幅的讲JNI,因为串口通信其实用的JNI知识不多。

    首先把JNI相关代码导入到自己的工程里面,先看下目录结构吧:

    jni目录

    java 目录

    SerialPort.java

    了解JNI的同学都知道的,这个SerialPort.h对应的就是SerialPort.java层的native 方法。这里用两个方法private native static FileDescriptor open(String path, int baudrate, int flags);

    public native void close();

    很显然一个是打开串口 一个是 关闭串口 方法。打开串口之前,程序需要获得最高权限,SerialPort.java的构造函数里面需要获得设备的超级root权限,也是通过输入su命令完成。if (!device.canRead() || !device.canWrite()) {

    try {

    /* Missing read/write permission, trying to chmod the file */

    Process su;

    su = Runtime.getRuntime().exec("/system/bin/su");

    String cmd = "chmod 666 " + device.getAbsolutePath() + "\n"

    + "exit\n";

    su.getOutputStream().write(cmd.getBytes());

    if ((su.waitFor() != 0) || !device.canRead()

    || !device.canWrite()) {

    throw new SecurityException();

    }

    } catch (Exception e) {

    e.printStackTrace();

    throw new SecurityException();

    }

    }

    最后记得调用生成的.so文件static {

    System.loadLibrary("serial_port");

    }

    SerialPortFinder

    这个类很简单,能用于获取设备的串口信息。通常一个开发板会有几个到十几个的串口。

    两个public方法:public String[] getAllDevices() 获取所有串口名称

    public String[] getAllDevicesPath() 获取所有串口地址

    开始通信

    整个信息发送接收步骤如下:初始化SerialPort 获得权限打开指定串口

    打开ReadThread监听数据返回

    使用SendThread发送数据

    继续发送或者关闭

    为此我们需要写一个SerialHelper来简化代码,以下是核心代码:

    构造函数public SerialHelper(String sPort, int iBaudRate) {

    this.sPort = "/dev/ttyS3";

    this.iBaudRate = 9600;

    this._isOpen = false;

    this._bLoopData = new byte[]{48};

    this.iDelay = 500;

    this.sPort = sPort;

    this.iBaudRate = iBaudRate;

    }

    打开 关闭 串口//打开时打开监听线程

    public void open() throws SecurityException, IOException, InvalidParameterException {

    this.mSerialPort = new SerialPort(new File(this.sPort), this.iBaudRate, 0);

    this.mOutputStream = this.mSerialPort.getOutputStream();

    this.mInputStream = this.mSerialPort.getInputStream();

    this.mReadThread = new SerialHelper.ReadThread();

    this.mReadThread.start();

    this.mSendThread = new SerialHelper.SendThread();

    this.mSendThread.setSuspendFlag();

    this.mSendThread.start();

    this._isOpen = true;

    }

    // 关闭线程 释放函数

    public void close() {

    if (this.mReadThread != null) {

    this.mReadThread.interrupt();

    }

    if (this.mSerialPort != null) {

    this.mSerialPort.close();

    this.mSerialPort = null;

    }

    this._isOpen = false;

    }

    两个线程 发送线程private class SendThread extends Thread {

    public boolean suspendFlag;

    private SendThread() {

    this.suspendFlag = true;

    }

    public void run() {

    super.run();

    while(!this.isInterrupted()) {

    synchronized(this) {

    while(this.suspendFlag) {

    try {

    this.wait();

    } catch (InterruptedException var5) {

    var5.printStackTrace();

    }

    }

    }

    SerialHelper.this.send(SerialHelper.this.getbLoopData());

    try {

    Thread.sleep((long)SerialHelper.this.iDelay);

    } catch (InterruptedException var4) {

    var4.printStackTrace();

    }

    }

    }

    public void setSuspendFlag() {

    this.suspendFlag = true;

    }

    public synchronized void setResume() {

    this.suspendFlag = false;

    this.notify();

    }

    }

    读取线程private class ReadThread extends Thread {

    private ReadThread() {

    }

    public void run() {

    super.run();

    while(!this.isInterrupted()) {

    try {

    if (SerialHelper.this.mInputStream == null) {

    return;

    }

    byte[] buffer = new byte[512];

    int size = SerialHelper.this.mInputStream.read(buffer);

    if (size > 0) {

    ComBean ComRecData = new ComBean(SerialHelper.this.sPort, buffer, size);

    SerialHelper.this.onDataReceived(ComRecData);

    }

    } catch (Throwable var4) {

    Log.e("error", var4.getMessage());

    return;

    }

    }

    }

    }

    其他函数见代码,包括数值和文本发送 波特率的设置等等。

    实战一个串口数据调试助手

    下面使用封装的SerialHelper来完成整个数据发送接收。界面随便搞一下:

    然后开始逻辑代码。首先实例化SerialPortFinder 实现数据接收写入列表serialPortFinder = new SerialPortFinder();

    serialHelper = new SerialHelper() {

    @Override

    protected void onDataReceived(final ComBean comBean) {

    runOnUiThread(new Runnable() {

    @Override

    public void run() {

    Toast.makeText(getBaseContext(), FuncUtil.ByteArrToHex(comBean.bRec), Toast.LENGTH_SHORT).show();

    logListAdapter.addData(comBean.sRecTime+":   "+FuncUtil.ByteArrToHex(comBean.bRec));

    recy.smoothScrollToPosition(logListAdapter.getData().size());

    }

    });

    }

    };

    然后利用SerialPortFinder找到所有的串口号,列出来所有的波特率 ,都传给spinnerfinal String[] ports = serialPortFinder.getAllDevicesPath();

    final String[] botes = new String[]{"0", "50", "75", "110", "134", "150", "200", "300", "600", "1200", "1800", "2400", "4800", "9600", "19200", "38400", "57600", "115200", "230400", "460800", "500000", "576000", "921600", "1000000", "1152000", "1500000", "2000000", "2500000", "3000000", "3500000", "4000000"};

    SpAdapter spAdapter = new SpAdapter(this);

    spAdapter.setDatas(ports);

    spSerial.setAdapter(spAdapter);

    SpAdapter spAdapter2 = new SpAdapter(this);

    spAdapter2.setDatas(botes);

    spBote.setAdapter(spAdapter2)

    打开串口btOpen.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    try {

    serialHelper.open();

    btOpen.setEnabled(false);

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    });

    数据发送(两种数据发送格式):文本类型if (serialHelper.isOpen()) {

    serialHelper.sendTxt(edInput.getText().toString());

    } else {

    Toast.makeText(getBaseContext(), "搞毛啊,串口都没打开", Toast.LENGTH_SHORT).show();

    }Hex类型if (serialHelper.isOpen()) {

    serialHelper.sendHex(edInput.getText().toString());

    } else {

    Toast.makeText(getBaseContext(), "搞毛啊,串口都没打开", Toast.LENGTH_SHORT).show();

    }

    最后记得关闭一下串口咯@Override

    protected void onDestroy() {

    super.onDestroy();

    serialHelper.close();

    }

    好的 ,完事了。 测试一下。连线开机:

    发串口信息

    同时设备也滴塌滴塌的响了,完美。

    一些要说的

    虽然整个JNI移植过程非常简单,但是问题出现了。如果大家使用的3.0版本的AS、会发现默认的JNI使用Cmake而不是.mk文件配置的。

    所以又增加了一个难度,为了方便大家。我把所有关于串口的资源打包成aar 文件,大家直接使用即可。

    谷歌android串口开发 aar文件,地址如下所示:https://download.csdn.net/download/lw_zhaoritian/9961190

    使用过程

    aar文件导入lib文件夹。

    gradle文件repositories {

    flatDir {

    dirs 'libs'

    }

    }

    dependencies {

    implementation(name: 'serialport-1.0.1', ext: 'aar')

    }

    完成。

    总结

    基本的串口通信到此结束。到了实际生产,更多的要解决多线程上的逻辑问题。设备的各种状态以及突发状况的处理等等。所以串口通信成功只是一个小小的开始,更多的问题还在后面。github地址如下所示:https://github.com/HuRuWo/SerialPortHelper

    展开全文
  • 上海耀华地磅串口开发(C#)耀华地磅通用的型号为XK3190-DS3q1和电脑采用DB9接线方式,RS232协议传输。如果需要转接接线正常后我们开始通过C#遍历计算机所有的串口设备打开串口接下来,我们在SerialPort控件的接收...

    耀华地磅通用的型号为XK3190-DS3q1和电脑采用DB9接线方式,RS232协议传输。

    首先连接线如图:
    上图为DB9,母头共九个接线孔
    上图为DB9,母头共九个接线孔

    如果需要转接

    如果电脑没有RS232接口,可使用RS232转USB连接线,建议采用质量较好的连接线。也可以采用RS232的PCI转接板,转接板可以支持多个磅头连接。

    在这里插入图片描述
    串口转USB线,串口连接磅头,USB口连接电脑。
    接线以后可以在设备管理器查看串口驱动是否运行正常。

    接线正常后我们开始通过C#遍历计算机所有的串口设备

    using System.IO.Ports;

    ///
    /// 获取本机所有端口
    ///
    ///
    public static List loadComPorts()
    {
    List portsList = new List();
    string[] ports = SerialPort.GetPortNames();
    if (ports != null)
    portsList = ports.ToList();
    return portsList;
    }

    打开串口

    返回的串口名称是字符串,我们可以直接打开串口了,我们可以使用定时器,每隔一段时间检查串口是否打开,如果没有打开则尝试自动打开。这里用到了SerialPort控件。
    //PORT 设置的参数名称为空
    if (string.IsNullOrEmpty(PortName))
    {
    rtxlog.AppendText(DateTime.Now.ToString(“mm:ss”) + “地磅端口名称错误” + PortName );
    return;
    }

    //检查参数,如果没有设置则设置为默认值
    if (String.IsNullOrEmpty(Vars.baud)) Vars.baud = “9600”;
    if (String.IsNullOrEmpty(Vars.dsite)) Vars.baud = “8”;
    if (String.IsNullOrEmpty(Vars.ssite)) Vars.baud = “1”;
    if (String.IsNullOrEmpty(Vars.parity)) Vars.baud = “无”;

    if (!serialPort1.IsOpen)
    {
    try
    {
    serialPort1.PortName = GlobalVars.Port;
    serialPort1.BaudRate = Convert.ToInt32(Vars.baud);
    serialPort1.DataBits = Convert.ToInt32(lVars.dsite);
    //停止位字符串转换为控件接受的格式
    string tzw = Vars.tzw;
    if (tzw.Equals(“1”))
    serialPort1.StopBits = StopBits.One;
    else if (tzw.Equals(“1.5”))
    serialPort1.StopBits = StopBits.OnePointFive;
    else if (tzw.Equals(“2”))
    serialPort1.StopBits = StopBits.Two;
    //校验位字符串转换为控件接受的格式
    string jyw = GlobalVars.parity;
    if (jyw == “无”)
    serialPort1.Parity = Parity.None;
    else if (jyw == “奇校验”)
    serialPort1.Parity = Parity.Odd;
    else if (jyw == “偶校验”)
    serialPort1.Parity = Parity.Even;
    serialPort1.Open();
    }catch (Exception exp)
    {
    LogHelper.Err("打开端口失败: " + exp.Message);
    }
    }
    else
    {
    SetPontStatus("已打开端口 " + serialPort1.PortName, Color.Green);
    }

    接下来,我们在SerialPort控件的接收数据方法中获取数据。

    private string _recv_string = “”;
    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
    int idx_last = _recv_string.LastIndexOf("");
    if (idx_last == -1) return;
    string leftstr = _recv_string.Substring(0, idx_last + 1);
    _recv_string = _recv_string.Substring(idx_last + 1);

       if (!leftstr.EndsWith("")) return;
       int _idx = leftstr.LastIndexOf("+");
       if (_idx == -1) return;
       string lastitem = leftstr.Substring(_idx + 1, leftstr.Length - _idx - 5); 
       leftstr = "";
       decimal weight_value = StringUtil.parseDecimal(lastitem);
    

    }

    获取的数据格式如下,每一个数据单元包括特殊起止位字符

    在这里插入图片描述
    如上图所示,所受到的字符串是其中的一部分,所以有拼接过程。
    在这里插入图片描述
    我们准备一个字符串,地磅每次传输的数据要追加到字符串后面,然后尝试去除最后一个完整的数据单元,并且计算出来实际公斤数。
    如果地磅设置了按吨位传输,则计算出来的数据是吨位数。

    展开全文
  • SpringBoot串口开发简单案例

    千次阅读 热门讨论 2021-01-04 12:45:34
    标题 SpringBoot实现串口读取和发送数据 1,根据本地运行环境,下载对应的RXTX文件(下载地址:http://fizzed.com/oss/rxtx-for-java) 2,本地构建SpringBoot项目,pom.xml文件 <?xml version="1.0" encoding=...

    标题 SpringBoot实现串口读取和发送数据

    1,根据本地运行环境,下载对应的RXTX文件(下载地址:http://fizzed.com/oss/rxtx-for-java
    2,本地构建SpringBoot项目,pom.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.4.0</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.zkjd.bd</groupId>
        <artifactId>spring-boot-rxtx</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>spring-boot-rxtx</name>
        <description>SpringBootRxtx</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>cn.qqhxj.common</groupId>
                <artifactId>spring-boot-starter-rxtx</artifactId>
                <version>1.3.1-RELEASE</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    

    3,application.yml配置文件

    serialport:
      baud-rate: 115200
      port-name: COM1
    

    4,项目结构
    在这里插入图片描述

    5,项目中的代码(CodeConvertUtil和ProtocolUtil可以私发,因为代码较多)

    • SerialBeanConfig
    package com.zkjd.bd.springbootrxtx.config;
    
    import cn.qqhxj.common.rxtx.reader.AnyDataReader;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @Author: wangtao
     * @CreateTime: 2021-01-27 08:56
     * @Description: 将AnyDataReader放入Spring容器下进行管理
     */
    @Configuration
    public class SerialBeanConfig {
    
        @Bean
        AnyDataReader anyDataReader(){
            return new AnyDataReader();
        }
    }
    
    • CustomDataProcessor
    package com.zkjd.bd.springbootrxtx.processor;
    
    
    import cn.qqhxj.common.rxtx.processor.SerialDataProcessor;
    import com.zkjd.bd.springbootrxtx.util.CodeConvertUtil;
    import com.zkjd.bd.springbootrxtx.util.ProtocolUtil;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    
    import java.io.UnsupportedEncodingException;
    
    /**
     * @Author: wangtao
     * @CreateTime: 2021-01-26 20:02
     * @Description: 自定义串口数据处理类,该数据为解析后返回的数据
     */
    
    @Component
    @Slf4j
    public class CustomDataProcessor implements SerialDataProcessor<String> {
    
        @Override
        public void process(String s) {
            try {
                //进行报文分割
                String[] ds = ProtocolUtil.splitInstruct(s);
                //用户地址(设备卡号),去首位0
                String sender = ds[1].trim().replaceAll("^(0+)", "");
                //通信电文内容
                String content = ds[4].trim();
                //混合传输
                if(content.startsWith("A4")){
                    content = CodeConvertUtil.hexStr2StrByGbk(content.substring(2));
                }
                System.out.println("报文内容===========>"+s);
            } catch ( UnsupportedEncodingException e) {
                log.error("转换异常");
            }
        }
    }
    
    • CustomStringSerialDataParser
    package com.zkjd.bd.springbootrxtx.parser;
    
    import cn.qqhxj.common.rxtx.parse.StringSerialDataParser;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    
    import java.io.UnsupportedEncodingException;
    
    /**
     * @Author: wangtao
     * @CreateTime: 2021-01-27 10:41
     * @Description: 自定义串口解析类
     */
    @Slf4j
    @Component
    public class CustomStringSerialDataParser extends StringSerialDataParser {
    
        @Override
        public String parse(byte[] bytes) {
            String str = "";
            try {
                str = new String(bytes,"GBK");
                log.info("解析后的数据为===>"+str);
            } catch (UnsupportedEncodingException e){
                log.error("格式转化错误");
            }
            return str;
        }
    }
    
    • SpringBootRxtxApplication
    package com.zkjd.bd.springbootrxtx;
    
    import cn.qqhxj.common.rxtx.DefaultSerialDataListener;
    import cn.qqhxj.common.rxtx.SerialContext;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    
    @SpringBootApplication
    public class SpringBootRxtxApplication {
    
        public static void main(String[] args) throws Exception {
            SpringApplication.run(SpringBootRxtxApplication.class, args);
            SerialContext.setSerialPortEventListener(new DefaultSerialDataListener());
        }
    }
    

    本人研究串口代码也是研究了好几天,就当辛苦费吧,购买之后,还有非SpringBoot版本的串口源码提供下载案例全部源码

    展开全文
  • 宁波科力地磅串口开发(C#) 宁波科力地磅和电脑采用DB9接线方式,RS232协议传输。 (上图为DB9,母头共九个接线孔) 如果电脑没有RS232接口,可使用RS232转USB连接线,建议采用质量较好的连接线。也可以采用RS232的...

    宁波科力地磅串口开发(C#)

    宁波科力地磅和电脑采用DB9接线方式,RS232协议传输。

    (上图为DB9,母头共九个接线孔)
    如果电脑没有RS232接口,可使用RS232转USB连接线,建议采用质量较好的连接线。也可以采用RS232的PCI转接板,转接板可以支持多个磅头连接。

    (串口转USB线,串口连接磅头,USB口连接电脑)

    接线以后可以在设备管理器查看串口驱动是否运行正常。

    接线正常后我们开始通过C#遍历计算机所有的串口设备。
    using System.IO.Ports;

    ///
    /// 获取本机所有端口
    ///
    ///
    public static List loadComPorts()
    {
    List portsList = new List();
    string[] ports = SerialPort.GetPortNames();
    if (ports != null)
    portsList = ports.ToList();
    return portsList;
    }

    返回的串口名称是字符串,我们可以直接打开串口了,我们可以使用定时器,每隔一段时间检查串口是否打开,如果没有打开则尝试自动打开。这里用到了SerialPort控件。
    //PORT 设置的参数名称为空
    if (string.IsNullOrEmpty(PortName))
    {
    rtxlog.AppendText(DateTime.Now.ToString(“mm:ss”) + “地磅端口名称错误” + PortName );
    return;
    }

    //检查参数,如果没有设置则设置为默认值
    if (String.IsNullOrEmpty(Vars.baud)) Vars.baud = “9600”;
    if (String.IsNullOrEmpty(Vars.dsite)) Vars.baud = “8”;
    if (String.IsNullOrEmpty(Vars.ssite)) Vars.baud = “1”;
    if (String.IsNullOrEmpty(Vars.parity)) Vars.baud = “无”;

    if (!serialPort1.IsOpen)
    {
    try
    {
    serialPort1.PortName = GlobalVars.Port;
    serialPort1.BaudRate = Convert.ToInt32(Vars.baud);
    serialPort1.DataBits = Convert.ToInt32(lVars.dsite);
    //停止位字符串转换为控件接受的格式
    string tzw = Vars.tzw;
    if (tzw.Equals(“1”))
    serialPort1.StopBits = StopBits.One;
    else if (tzw.Equals(“1.5”))
    serialPort1.StopBits = StopBits.OnePointFive;
    else if (tzw.Equals(“2”))
    serialPort1.StopBits = StopBits.Two;
    //校验位字符串转换为控件接受的格式
    string jyw = GlobalVars.parity;
    if (jyw == “无”)
    serialPort1.Parity = Parity.None;
    else if (jyw == “奇校验”)
    serialPort1.Parity = Parity.Odd;
    else if (jyw == “偶校验”)
    serialPort1.Parity = Parity.Even;
    serialPort1.Open();
    }catch (Exception exp)
    {
    LogHelper.Err("打开端口失败: " + exp.Message);
    }
    }
    else
    {
    SetPontStatus("已打开端口 " + serialPort1.PortName, Color.Green);
    }

    接下来,我们在SerialPort控件的接收数据方法中获取数据。我们写一个简单的判断,如果是宁波科力的地磅,则将读取到的字节流使用该方法处理。
    private string _recv_string = “”;
    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
    int len = serialPort1.BytesToRead;
    Byte[] readBuffer = new Byte[len];
    serialPort1.Read(readBuffer, 0, len);

      if ("宁波柯力D2002".Equals(Vars.PontName))
      {
           RECV_NBKL_D2002(readBuffer);
      }
      serialPort1.DiscardInBuffer();
    

    }

    ///
    /// 宁波科力D2002
    ///
    ///
    private void RECV_NBKL_D2002(byte[] readBuffer)
    {
    string str_read = Encoding.Default.GetString(readBuffer);
    _recv_string += str_read;
    //取出最后一个完整的数据段,并将历史数据清空 EG +047190010
    if (!_recv_string.EndsWith("")) return;
    int _idx = _recv_string.LastIndexOf("+");
    if (_idx == -1) return;
    string lastitem = _recv_string.Substring(_idx + 1, _recv_string.Length - _idx - 5); //称重数据
    _recv_string = “”;
    //将传入的千克转化为吨
    decimal dValue = StringUtil.parseDecimal(lastitem)/1000M;
    lastitem = dValue.ToString(“F2”);
    }

    大致意思是我们准备一个字符串,地磅每次传输的数据要追加到字符串后面,然后尝试去除最后一个完整的数据单元,并且计算出来实际吨位数。

    这里有一个情况,车辆上磅以后,吨位数持续传递到电脑中,所以上述方法会一直在运行中,实际上屏幕只需要0.1秒延时显示已经很精准了。如果电脑配置很低,建议该方法只追加字符串,另外创建一个Timer分析字符串,总知不建议在DataReceived方法中写入太多处理逻辑,将分析算法放在另一个线程中。

    展开全文
  • android 串口开发

    2020-12-25 18:40:37
    FT312D有参考。
  • 该博文是博主第一次接触串口通信做的...1. 介绍首先来了解一下什么是串口串口串行接口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface) 是指数据...
  • 一:串口通信简介前段时间因为工作需要研究了一下android的串口通信,网上有很多讲串口通信的文章,我在做的时候也参考了很多文章,现在就将我学习过程中的一些心得分享给大家,由于串口开发涉及到jni,所以开发环境...
  • 这半年主要做的项目是跟串口相关的,俗语说,好记性不如乱笔头,觉得有必要把这些东西自己重新捋一下。第一次接触这个项目的时候,对于串口一无所知,只有自己在网上慢慢...于是现在准备把一个菜鸟接触串口开发的的...
  • Android串口通信开发

    2021-07-14 14:20:07
    文章目录一、前言三、线圈、寄存器四、第三方开发资源五、参考链接: 一、前言 ​ 串口通信主要用于物联网设备中,采用的协议一般为ModBus协议,这是一种悠久的通信技术。在Android中的使用的通信协议如果是自己编译...
  • Android - 串口快速开发

    2021-07-08 16:34:16
    简单使用,但缺少了一点灵活性(只能修改波特率和串口路径,其余按默认值来) 1、添加依赖 build.gradle(:app) —> dependencies{ 添加 } implementation 'tp.xmaihh:serialport:2.1' 2、配置 public static ...
  • 串口开发都是和C语言写的下位机配套,C语音有UInt16、Int16、UInt8、UInt32等数据类型,涉及到负数的时候,如Int8,Int16,Int32等数据类型和Java转换会出现一些问题1.如果是UInt16 用的是16位的寄存器下面得到16位的...
  • Python pyserial 串口开发

    2021-11-11 21:50:29
    在上一篇 《Python pyserial 串口工具》 中介绍了pyserial的简单用法。这篇章主要介绍实践过程中遇到的一些问题。 import serial import serial.tools.list_ports port_list = list( ) 使用上面的 serial.tools....
  • 1.发现USB设备 UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); UsbManager是负责管理USB设备的类,该类的主要方法有: ... } } 好了,这些就是usb转串口通信开发流程
  • QT多线程串口开发总结 1、优势 使用多线程技术可以充分发挥CPU的性能,我们在主线程上面绘制UI和一些简单的工作(信号之间的传递等等)、在子线程中完成庞大数据的处理。 2、串口类构建 在串口类中封装串口的一...
  • 串口调试工具软件具有一般串口助手的基本功能,同时提供了诸多增强功能。可生成功能按钮,不必记住输入调试命令;可生成通信调试按钮,不必与其它设备联调即可完成通信测试;集成了自定义软件在线升级功能,不必再...
  • 1. 串口基础概念 USART数据格式一般分为启动位、数据帧、可能的奇偶校验位、停止位,如图4.34所示。 启动位:发送方想要发送串口数据时,必须先发送启动位。 数据帧:发送的数据内容,数据的Bit位。有8位数据字长...
  • STM32:串口开发基础READEME 串口通信: STM32的串口通信接口: UART(通用异步收发器)、USART(通用同步异步收发器) 而对于大容量STM32F10x系列芯片,分别有3个USART和2个UART。、 SPI、I2C、USART、CAN、USB、 USB...
  • STC15 多串口开发

    2021-01-03 23:02:30
    本文档为个人博客文档系统的备份版本、... 我们现在需要同时使用串口1和串口2,上面主要讲解了串口1,下面来说一下串口2,下面是串口2的相关寄存器。 其实这个和串口1差不多,我们这里就简单的通过例程来进行说明 ...
  • 记一个串口开发,弄了两天的问题,希望对大家有帮助 错误信息 #AfatalerrorhasbeendetectedbytheJavaRuntimeEnvironment: # #EXCEPTION_ACCESS_VIOLATION(0xc0000005)atpc=0x0000000180005b00,pid=13012,tid=0x...
  • 后面的文章《STM32使用DMA接收串口数据》和《STM32使用DMA发送串口数据》讲解了如何使用DMA辅助串口收发数据,使用DMA的好处在于不用CPU即可完成串口收发数据,减轻CPU负担,在串口通信频繁且不想频繁中断的应用中...
  • 最近做了Ubuntu系统下关于Java Rxtx 串口开发的项目,对于Rxtx有一些经验和大家分享一下。 获取系统可用串口,可以设置屏蔽掉ttyUSB0-ttyUSB3(因为可能被系统占用,也可以不屏蔽).开发主要针对USB-SerialPort,直接...
  • 摘要:基于Embedded Linux系统的嵌入式设备使用跨平台GUI开发工具Qt来开发嵌入式应用已经非常普遍,本文就以分别通过原生C语言方式和使用Qt QSerialPort控件方式来进行RS232/RS485串口应用的开发示例。‍‍1).简介‍...
  • 标题:Qt如何快速的开发一款界面简洁的串口调试助手,打包可执行程序 文章目录标题:Qt如何快速的开发一款界面简洁的串口调试助手,打包可执行程序一、首先创建一个空的项目二、在Ui界面设置自己的专属界面三、设计...
  • 需要在win7上通过串口控制光源,因为没有对应的串口接口,所以使用了 PL2303的串口转USB线。 使用的API是CreateFileA 遇到的问题 1 看得到串口,但是一直打开失败,GetLastError=433 433这个错误码在微软的error ...
  • SpringBoot WARNING: RXTX Version mismatch Jar version = RXTX-2.2 下载RXTX文件地址:...使用SpringBoot进行串口开发遇到的问题: 按照下图将文件放到对应JD目录下 重新启动项目,警告问题消失 ...
  • 微软在.NET中对串口通讯进行了封装,我们可以在.net2.0及以上版本开发时直接使用SerialPort类对串口进行读写操作。 为操作方便,本文对SerialPort类做了一些封装,暂时取名为SerialPortClient。 SerialPort类的vb...
  • 一、搭建开发环境(1)安装JDK,配置环境变量;(详略)(2)下载AndroidStudio并双击打开安装;下载地址:https://developer.android.google.cn/studio/其他教程:https://developer.android.google.cn/studio/intro/二、...
  • device.canWrite()) { //device.canRead() device.canWrite() 返回都flase 估计就是串口权限问题了 我是找开发商 开权限的 throw new SecurityException(); } } catch (Exception e) { e.printStackTrace(); throw...
  • Android串口通信

    2021-02-26 14:44:10
    前段时间因为工作需要研究了一下android的串口通信...网上讲的很多案例都是基于手机端的串口通信Demo,但是在实际开发过程中,串口通信主要用于开发板应用的开发,即不是我们常见的手机android应用,而基于开发板的...
  • 1.监听COM口启动程序报错 Could not initialize class gnu.io.RXTXCommDriver异常 是因为需要在jre/bin目录中添加rxtxParallel.dll、rxtxSerial.dll文件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 159,076
精华内容 63,630
关键字:

串口开发

友情链接: 1.rar