有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaRaspberry:如何检查串口写入缓冲区中的剩余字节

我在做什么:

在实施RS-485协议时,我必须:

  1. 写入引脚设置为high,并进入写入模式
  2. 将我的数据(16字节长度)写入串行端口
  3. 再次将我的pin码设置为low,并进入读取模式
  4. 等待16个字节到达
  5. 结束传输

详细信息包括为什么写入pin必须设置为高和低,为什么确切设置为16个数据包,以及。。。有些硬件实现细节我无法更改


当前解决方案:

// .....

private final Serial serial;
private final GpioPinDigitalOutput pin;
private final long DELAY_M = 2;
private final int DELAY_N = 0

// .....

public boolean send(final byte[] packet) {

  result = false;

  try {
      this.pin.high();
      this.serial.write(packet);
      Thread.sleep(DELAY_M, DELAY_S); // -> THE TROUBLE MAKER
      this.pin.low();
      result = true;
  }

  // ... Now in read mode, recv 16 bytes in a pre-defined time window

  return result;


问题

在进入读取模式(将pin设置为low)之前,我必须等待串行缓冲区中的所有数据传输完毕。我使用的是Pi4J库,它没有检查缓冲区中剩余字节的功能。肮脏的解决方案是等待一个恒定的延迟_M毫秒,但这个恒定的时间在不同的环境、不同的硬件和

查看Pi4J的代码,在本机实现(JNI)中,它调用了WiringPi的API。WiringPi反过来将串行端口视为常规linux文件并写入该文件。同样,WiringPi没有提供检查缓冲区中剩余字节的方法。那么这一定是Linux硬件内核的事情,而不一定是Pi4j的责任。那么:如何检查raspberry串行端口缓冲区中的剩余数据?这是/dev/ttyAMA0

注意:Pi4j中的串行接口有一个方法flush(),包含以下文档:

Forces the transmission of any remaining data in the serial port transmit buffer. Please note that this does not force the transmission of data, it discards it!

更新:

关于@sawdust在评论中指出的内容,我找到了this教程。它启用了所谓的RTS和CTS(更多关于这些标志herehere),但它还没有工作。我的示波器在CTS和RTS引脚上没有显示信号

还要注意the article可以追溯到2013年,而且gpio_setfunc甚至不会编译。它需要一些在任何地方都不可用的奇怪脚本。但是一定要用apt-cache search gpio查看apt-get-packages列表,您会找到所需的工具


共 (1) 个答案

  1. # 1 楼答案

    您可以将接收启用保持在低位,这意味着您可以接收自己的传输。这样,您就知道传输何时完成,然后可以将Tx enable(发送启用)设置为low(低)。然后只需从响应中过滤您的传输

    例如,对于您的传输例程:

     synchronized(mutex) {
         transmitEnable.high();
         awaitingEcho = true;
         expectedEcho = "test\n";
         serial.writeln("test");
     }
    

    以及接收:

    synchronized(mutex) {
        data = event.getAsciiString();
        if (awaitingEcho && data.contains(expectedEcho)) {
            transmitEnable.low();
            data = data.replace(expectedEcho, EMPTY);
            expectedEcho = null;
        }
    }