JavaRaspberry:如何检查串口写入缓冲区中的剩余字节
我在做什么:
在实施RS-485协议时,我必须:
- 将写入引脚设置为
high
,并进入写入模式李> - 将我的数据(16字节长度)写入串行端口李>
- 再次将我的pin码设置为
low
,并进入读取模式李> - 等待16个字节到达李>
- 结束传输李>
详细信息包括为什么写入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(更多关于这些标志here和here),但它还没有工作。我的示波器在CTS和RTS引脚上没有显示信号
还要注意the article可以追溯到2013年,而且gpio_setfunc
甚至不会编译。它需要一些在任何地方都不可用的奇怪脚本。但是一定要用apt-cache search gpio
查看apt-get-packages列表,您会找到所需的工具
# 1 楼答案
您可以将接收启用保持在低位,这意味着您可以接收自己的传输。这样,您就知道传输何时完成,然后可以将Tx enable(发送启用)设置为low(低)。然后只需从响应中过滤您的传输
例如,对于您的传输例程:
以及接收: