alidili / SerialPortDemo

使用Java实现的串口通信示例,可在Windows、Linux、Mac系统上运行
https://blog.csdn.net/kong_gu_you_lan/article/details/80589859
Apache License 2.0
207 stars 111 forks source link

总是提示“串口链接中断” #2

Closed mygaochunming closed 5 years ago

mygaochunming commented 5 years ago

每次发送数据都是先弹出“与串口通讯中断”,然后再返回数据,请问这是什么情况?

mygaochunming commented 5 years ago

有时候是先显示返回的数据,再弹出“与串口通讯中断”

alidili commented 5 years ago

这个中断信息是串口事件监听中回调的,出现这个中断提示后,还能正常继续通信吗?

mygaochunming commented 5 years ago

@alidili 感谢你的回答。我也不知道具体什么情况……

我想请教下,串口得到数据时触发事件。是刚接收到第一个字节就触发事件还是全部接受完成后再发送时间?

mygaochunming commented 5 years ago

@alidili 刚才那个问题我用串口调试工具试了一下,好像一接收到数据就触发事件了

我试了一下,好像只有“串口有有效数据”事件触发了,其他事件的触发条件是什么呢?

alidili commented 5 years ago

当检测到串口缓冲区内存在数据时,就会触发DATA_AVAILABLE事件,其他的事件一直没用到,所以也不太了解触发的时机

mygaochunming commented 5 years ago

@alidili 我在读取串口数据的时候,为什么有的时候读取到一半就返回了呢?

比如,发过来2048个字节,有时候读到几百个字节的时候就返回了

mygaochunming commented 5 years ago

发送端检测说中途没有中断传送

alidili commented 5 years ago

把缓冲区大小改大一点试试,或者用串口调试助手接收一下发送端发送的数据,看看有没有断

/**
 * 从串口读取数据
 * 
 * @param serialPort
 *            当前已建立连接的SerialPort对象
 * @return 读取到的数据
 */
public static byte[] readFromPort(SerialPort serialPort) {
    InputStream in = null;
    byte[] bytes = {};
    try {
        in = serialPort.getInputStream();
        // 缓冲区大小为一个字节
        byte[] readBuffer = new byte[1];
        int bytesNum = in.read(readBuffer);
        while (bytesNum > 0) {
            bytes = ArrayUtils.concat(bytes, readBuffer);
            bytesNum = in.read(readBuffer);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (in != null) {
                in.close();
                in = null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return bytes;
}
mygaochunming commented 5 years ago

@alidili 通过串口调试工具发现数据是完整的,在网上搜了下,有好多说会中断,但都没说为什么。

大部分的解决办法是先sleep 50ms。

我处理的方式是通过通讯协议中定义的长度来判断是否接收完整,不完整再去读。这样偶尔不完整的就会再去读一遍,那些一次就能接收完成的就不需要了

mygaochunming commented 5 years ago

@alidili 我这打成exe的时候,一到in.read这句就闪崩。请教一下,是否出现过这种情况,如何解决的呢?

前面的openPort是没有问题的

而且在in.read之前我先打印了一下in.available()。数据长度是能打印的,且是正确的

alidili commented 5 years ago

只有打成exe的时候才会crash吗,有没有混淆过,会不会是混淆引起的,没有遇到过这种情况

mygaochunming commented 5 years ago

@alidili 应该是打包的问题,我之前用的maven的javafx-maven-plugin插件打的包,可以直接打成exe文件,但是跑起来有问题。后来我先打成jar包,然后再通过exe4j打成exe就好了。具体原因也不清楚。

Ggbr-TaoLi commented 2 years ago

我也遇到和你一样的问题了,打包成exe。串口接收到一条数据或发送一条数据后,jvm就直接崩了。

alidili commented 2 years ago

先打成jar包,再打包成exe试试

Ggbr-TaoLi commented 2 years ago

确实是打包的原因,现以解决。我实践总结了下: https://blog.csdn.net/qq_29428909/article/details/122103131?spm=1001.2014.3001.5501