繁体   English   中英

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

[英]Raspberry: How to check remaining bytes in serial port's write buffer

我在做什么:

实现RS-485协议,我必须:

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

详细信息包括为什么必须将写入引脚设置为高和低,为什么正好是 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 库,它没有检查缓冲区中剩余字节的功能。 肮脏的解决方案是等待一个恒定的 DELAY_M 毫秒但是这个恒定的时间在不同的环境、不同的硬件和......

查看 Pi4J 的代码,在本机实现 (JNI) 中,它正在调用 WiringPi 的 API。 WiringPi 依次将串口视为一个普通的 linux 文件并写入该文件。 同样,WiringPi 没有提供检查缓冲区中剩余字节的方法。 那么它必须是 Linux-Hardware-Kernely 的事情,不一定是 Pi4j 的责任。 那么:如何查看树莓派串口缓冲区中的剩余数据? 这是/dev/ttyAMA0

PS:Pi4j 中的串行接口有一个方法 flush() 与此文档:

强制传输串行端口传输缓冲区中的任何剩余数据。 请注意,这不会强制传输数据,而是将其丢弃!

更新:

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

另请注意, 该文章可追溯到 2013 年,并且gpio_setfunc甚至无法编译。 它需要一些在任何地方都没有的奇怪脚本。 但是请使用apt-cache search gpio查看 apt-get 软件包列表,您会找到所需的工具。

您可以将接收启用保持为低电平,这意味着您可以接收自己的传输。 这样您就知道传输何时完成,然后可以将 Tx 启用设为低电平。 然后只需从响应中过滤您的传输。

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

 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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM