【问题标题】:read from a serial port using even listener in a loop在循环中使用事件侦听器从串行端口读取
【发布时间】:2016-03-16 08:57:54
【问题描述】:

我有一种方法可以将文件内容写入串行端口,然后等待确认消息。我正在尝试使用均匀的侦听器,但是没有消息打印回控制台。 但是,当我在没有事件侦听器的情况下手动以缓慢的速度阅读消息时,消息会很好地返回。 这是我的代码:

public class portConnector {
private static SerialPort SP;


public portConnector(String pName){
    SP = new SerialPort(pName);
}

public static byte[] read(String name) throws IOException{
    File file = new File(name);     
    byte[] bytes = new byte[(int) file.length()];
    FileInputStream inputStream = new FileInputStream(file);
    inputStream.read(bytes);
    inputStream.close();
    return bytes;
}

public void push2rec (File[] LOF){
    try {
        SP.openPort();
        SP.setParams(SerialPort.BAUDRATE_9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        int mask = SerialPort.MASK_RXCHAR;
        SP.setEventsMask(mask); 
        SP.addEventListener(new PortReader(), SerialPort.MASK_RXCHAR);
        for (File f : LOF){
            byte[] rd = read(f.getName());
            SP.writeBytes(rd);
        }
        SP.closePort();
    }
    catch (SerialPortException ex) {System.out.println(ex);} 
    catch (IOException ex) {System.out.println(ex);}
}

private static class PortReader implements SerialPortEventListener {

@Override
public void serialEvent(SerialPortEvent event) {
    if(event.isRXCHAR() && event.getEventValue() == 10) {
        try {
            byte[] buffer = SP.readBytes(10);
            for (byte b : buffer){
                System.out.format("%02X ", b);
            }
            System.out.println("");
        }
        catch (SerialPortException ex) {
            System.out.println("Error in receiving string from COM-port: " + ex);
        }
    }
}}}

“addEventListener”的位置是否正确? 谁能帮我解决这个问题。 任何帮助,将不胜感激。谢谢你。

【问题讨论】:

  • 你在使用javax.comm.*类吗?
  • 不,我正在使用 jssc。
  • 我明白了。我会尝试删除&& event.getEventValue()==10,然后使用byte[] buffer = SP.readBytes(),以使其不那么僵硬。我也不会将SP.closePort() 作为主要流程的一部分。您可以关闭事件侦听器中的端口,从而使其成为有条件的,而不是自动的。在您的代码中,您在发送文件内容后立即关闭它(取消注册侦听器)。
  • 好的。如何将 closePort() 写入事件侦听器?
  • 试过了。没用。我看不出getvalue == 10 是如何影响我的阅读的。消息假设为 10 字节长,getvalue 不应该检查该长度吗?

标签: java serial-port addeventlistener event-listener jssc


【解决方案1】:

第一次触发串行接收事件时,它很可能只有一个字符,因为在一个字符时间内执行了数千条指令。

您需要将每个事件的字符捕获到缓冲区变量中,直到您找到所需的 10 个字符。

您还必须将接收事件与发送的第一个字符同步。这就是为什么大多数串行通信都以 CR 或其他一些已知字符终止的原因。

【讨论】:

  • 好的。但主要问题是我的事件监听器从未触发。因此我不能做任何事情被推出接收器的数据。
  • 我在 even listener 方法中设置了一个断点,但它从未到达。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 2012-02-13
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
相关资源
最近更新 更多