Java 如果writePort超时,星形打印机将打印垃圾

Java 如果writePort超时,星形打印机将打印垃圾,java,linux,centos,serial-port,stario-sdk,Java,Linux,Centos,Serial Port,Stario Sdk,我正在使用StarIO Java SDK的Star Micronics打印机打印一些收据。有时在光栅模式下发送位图数据时,StarIOPort.writePort()方法会超时。但是,此方法不会引发异常,甚至会返回大于0的写入大小。在这种情况下,打印机打印一行随机像素或一吨空行/垃圾文本 我想我可以检测到超时,但我不知道如何从中恢复。据我所知,一旦writePort()返回,打印机就已经打印了垃圾数据。这些超时极为频繁,每次收货发生1-2次。我可以调整波特率,也许可以启用奇偶校验,但我认为这不会

我正在使用StarIO Java SDK的Star Micronics打印机打印一些收据。有时在光栅模式下发送位图数据时,StarIOPort.writePort()方法会超时。但是,此方法不会引发异常,甚至会返回大于0的写入大小。在这种情况下,打印机打印一行随机像素或一吨空行/垃圾文本

我想我可以检测到超时,但我不知道如何从中恢复。据我所知,一旦writePort()返回,打印机就已经打印了垃圾数据。这些超时极为频繁,每次收货发生1-2次。我可以调整波特率,也许可以启用奇偶校验,但我认为这不会完全消除这个问题。我可以防止这些超时,或者至少在不需要重新打印的情况下处理它们吗?我错过了什么

打印机设置:

<JposEntry logicalName="TSP743II_linux_serial">
    <creation factoryClass="com.starmicronics.starjavapos.ServiceInstanceFactory" serviceClass="com.starmicronics.starjavapos.POSPrinterService" />
    <vendor name="Star Micronics" url="www.star-m.jp/eng/index.htm" />
    <jpos category="POSPrinter" version="1.9" />
    <product description="Star receipt printer" name="TSP743II" url="www.star-m.jp/eng/index.htm" />
    <prop name="model" type="String" value="TSP743II" />
    <prop name="portName" type="String" value="/dev/ttyS1" />
    <prop name="portSettings" type="String" value="19200,n,8,1,h" />
    <prop name="ioTimeoutMillis" type="Integer" value="10000" />
    <prop name="doCheckedBlockPrinting" type="Boolean" value="True" />
    <prop name="memorySwitchSetting" type="String" value=":1,0100:4,0002" />
</JposEntry>
端口写入逻辑:

byte[] command = ...;
int totalSizeCommunicated = 0;
while (totalSizeCommunicated < command.length) {
    // This returns > 0 and doesn't throw an exception on timeout!
    totalSizeCommunicated += port.writePort(command,
        totalSizeCommunicated, command.length - totalSizeCommunicated);
}
释放端口:

final String portName = "/dev/ttyS1";
final String portSettings = "19200,n,8,1,h";
final int timeout = 10000;
try {
    port = StarIOPort.getPort(portName, portSettings, timeout);
} catch (StarIOPortException exception) {
    exception.printStackTrace();
}
StarIOPort.releasePort(port);
更新:启用奇偶校验没有帮助。完全事实上,这可能让情况变得更糟


更新2:将波特率减半至9600也会使问题变得更糟。

“我在这里遗漏了什么?”--听起来您发送此数据的速度比打印机接收和处理数据的速度快,即打印机遇到缓冲区溢出,因此产生了垃圾数据。你在使用流量控制吗?大多数打印机需要流量控制。它当前设置为硬件流量控制。我尝试将波特率减半,这似乎使问题变得更糟。我不确定打印机是否需要更快或更慢的数据。请验证打印机和主机是否都设置为HW flow control(硬件流量控制)和相同的控制行。检查电缆。您是否有接线盒或其他监测握手信号的方法(如示波器)?确定打印机的接收缓冲区大小(1KB?)。然后尝试计量发送到打印机的数据(例如,每次写入延迟30秒,每次系统调用512字节)。检查流控制是否中断的方法:禁用所有流控制。若同样的症状持续存在,那个么流量控制并没有像预期的那个样工作。禁用流量控制似乎并没有什么不同。我试过几条不同的电缆,结果还是一样的。然而,测量数据产生了有趣的结果。如果每次写入之间等待30秒,则不会出现超时,但打印机不会打印任何内容。如果我等待1秒,几乎每次写入都会超时。没有等待,我每隔一两KB就有一个超时。有趣的是,端口一次最多只能接受40个字节。“我缺少什么?”--听起来您发送此数据的速度比打印机接收和处理数据的速度快,即打印机正在经历缓冲区溢出,因此是垃圾数据。你在使用流量控制吗?大多数打印机需要流量控制。它当前设置为硬件流量控制。我尝试将波特率减半,这似乎使问题变得更糟。我不确定打印机是否需要更快或更慢的数据。请验证打印机和主机是否都设置为HW flow control(硬件流量控制)和相同的控制行。检查电缆。您是否有接线盒或其他监测握手信号的方法(如示波器)?确定打印机的接收缓冲区大小(1KB?)。然后尝试计量发送到打印机的数据(例如,每次写入延迟30秒,每次系统调用512字节)。检查流控制是否中断的方法:禁用所有流控制。若同样的症状持续存在,那个么流量控制并没有像预期的那个样工作。禁用流量控制似乎并没有什么不同。我试过几条不同的电缆,结果还是一样的。然而,测量数据产生了有趣的结果。如果每次写入之间等待30秒,则不会出现超时,但打印机不会打印任何内容。如果我等待1秒,几乎每次写入都会超时。没有等待,我每隔一两KB就有一个超时。有趣的是,这个端口一次最多只能接受40个字节。
StarIOPort.releasePort(port);