Closed mygaochunming closed 5 years ago
有时候是先显示返回的数据,再弹出“与串口通讯中断”
这个中断信息是串口事件监听中回调的,出现这个中断提示后,还能正常继续通信吗?
@alidili 感谢你的回答。我也不知道具体什么情况……
我想请教下,串口得到数据时触发事件。是刚接收到第一个字节就触发事件还是全部接受完成后再发送时间?
@alidili 刚才那个问题我用串口调试工具试了一下,好像一接收到数据就触发事件了
我试了一下,好像只有“串口有有效数据”事件触发了,其他事件的触发条件是什么呢?
当检测到串口缓冲区内存在数据时,就会触发DATA_AVAILABLE事件,其他的事件一直没用到,所以也不太了解触发的时机
@alidili 我在读取串口数据的时候,为什么有的时候读取到一半就返回了呢?
比如,发过来2048个字节,有时候读到几百个字节的时候就返回了
发送端检测说中途没有中断传送
把缓冲区大小改大一点试试,或者用串口调试助手接收一下发送端发送的数据,看看有没有断
/**
* 从串口读取数据
*
* @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;
}
@alidili 通过串口调试工具发现数据是完整的,在网上搜了下,有好多说会中断,但都没说为什么。
大部分的解决办法是先sleep 50ms。
我处理的方式是通过通讯协议中定义的长度来判断是否接收完整,不完整再去读。这样偶尔不完整的就会再去读一遍,那些一次就能接收完成的就不需要了
@alidili 我这打成exe的时候,一到in.read这句就闪崩。请教一下,是否出现过这种情况,如何解决的呢?
前面的openPort是没有问题的
而且在in.read之前我先打印了一下in.available()。数据长度是能打印的,且是正确的
只有打成exe的时候才会crash吗,有没有混淆过,会不会是混淆引起的,没有遇到过这种情况
@alidili 应该是打包的问题,我之前用的maven的javafx-maven-plugin插件打的包,可以直接打成exe文件,但是跑起来有问题。后来我先打成jar包,然后再通过exe4j打成exe就好了。具体原因也不清楚。
我也遇到和你一样的问题了,打包成exe。串口接收到一条数据或发送一条数据后,jvm就直接崩了。
先打成jar包,再打包成exe试试
确实是打包的原因,现以解决。我实践总结了下: https://blog.csdn.net/qq_29428909/article/details/122103131?spm=1001.2014.3001.5501
每次发送数据都是先弹出“与串口通讯中断”,然后再返回数据,请问这是什么情况?