[英]Raspberry: How to check remaining bytes in serial port's write buffer
实现RS-485协议,我必须:
high
并进入写入模式。low
并进入读取模式。详细信息包括为什么必须将写入引脚设置为高和低,为什么正好是 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.