1

我正在使用带有 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>

创建端口:

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

端口写逻辑:

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 commandString =
    // Enter raster mode
    "\u001b*rA"
    // Top margin command 2
    + "\u001b*rT2\0"
    // Page length command 0
    + "\u001b*rP0\0"
    // Print quality command 2
    + "\u001b*rQ2\0"
    // Left margin command 7
    + "\u001b*rml7\0"
    // Set end of page mode command 1
    + "\u001b*rF1\0"
    // Set end of doc mode command 1
    + "\u001b*rE1\0";
    // Raster image data by line (not actual code but demonstrative)
    + "b" + sizeOne + size256One + pixelsOne;
    + "b" + sizeTwo + size256Two + pixelsTwo;
    + "b" + sizeThree + size256Three + pixelsThree;
    // Exit raster mode, clear raster buffer
    + "\u001b*rB\u001b*rC".getBytes();

释放端口:

StarIOPort.releasePort(port);

更新:启用奇偶校验没有帮助。完全没有。事实上,它可能使情况变得更糟。

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

4

0 回答 0