Java Raspberry:如何检查串行端口中的剩余字节';s写入缓冲区 我在做什么:

Java Raspberry:如何检查串行端口中的剩余字节';s写入缓冲区 我在做什么:,java,serial-port,raspberry-pi2,Java,Serial Port,Raspberry Pi2,实施协议时,我必须: 将写入引脚设置为高并进入写入模式 将我的数据(16字节长度)写入串行端口 再次将我的pin设置为低,然后进入读取模式 等待16个字节到达 结束传输 详细信息包括为什么写入pin必须设置为高和低,为什么确切设置为16个数据包,以及。。。有些硬件实现细节我无法更改 当前解决方案: 问题 在进入读取模式(将引脚设置为低电平)之前,我必须等待串行缓冲区中的所有数据传输完毕。我使用的是Pi4J库,它没有检查缓冲区中剩余字节的功能。肮脏的解决方案是等待一个恒定的延迟_M毫秒,但这个

实施协议时,我必须:

  • 将写入引脚设置为
    并进入写入模式
  • 将我的数据(16字节长度)写入串行端口
  • 再次将我的pin设置为
    ,然后进入读取模式
  • 等待16个字节到达
  • 结束传输
  • 详细信息包括为什么写入pin必须设置为高和低,为什么确切设置为16个数据包,以及。。。有些硬件实现细节我无法更改


    当前解决方案:

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

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

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

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

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


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

    您可以将接收启用保持在低位,这意味着您可以接收自己的传输。这样,您就知道传输何时完成,然后可以将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;
        }
    }
    

    RPi是否支持RS-485开箱即用?我认为它需要一个屏蔽/pi帽/转换器/等等@GeorgeProfenza不,这是一个带有MAX-485的定制板,我正在控制该板。板输入是一个GPIO引脚,指示读/写模式,/dev/ttyam0作为串行线。“P.S:串行接口…有一个方法flush()”--您要使用的函数是,它“等待所有写入fd所指对象的输出被传输”。顺便说一句,控制半双工RS-485的RTS线路的首选方法是在设备驱动程序中,但实际上只有少数Linux串行端口驱动程序实现了它(例如)。@sawdust yes似乎是这样。我一直在尝试将它作为一种额外的方法添加到wiringPi和Pi4j中,但它还不起作用。现在就把我的头发拔出来。完成后,我将在github上进行公关。谢谢有没有找到解决这个问题的好办法?我也在为同样的问题挣扎,我现在不能测试,但回声是个天才
    synchronized(mutex) {
        data = event.getAsciiString();
        if (awaitingEcho && data.contains(expectedEcho)) {
            transmitEnable.low();
            data = data.replace(expectedEcho, EMPTY);
            expectedEcho = null;
        }
    }