沐水dev 2019-07-18 12:47 采纳率: 0%
浏览 243

基恩士手持如何通过JS实时获取sato蓝牙打印机的状态,目前只能在打印的时候获取到状态,求救!

function WaitForResponceBTPR2() {
        try {
            var printComplete = false;
            var recvBuffer = new String();
            var sendBuffer = new String();
            var objRecv = new Bt.LibDef.CommSppRecvData("");

            for (var loopCount = 0; loopCount < 10; loopCount++) {
                if (SPPRecv(objRecv, 1, 1) != Bt.LibDef.BT_OK) {
                    //continue;
                }
                recvBuffer = objRecv.data;

                // ACK receive=>Xmit ENQ and re-receive
                if (recvBuffer.charAt(0) == ACK) {
                    sendBuffer = "";
                    sendBuffer = ENQ;

                    if (SPPSend(sendBuffer) != Bt.LibDef.BT_OK) {
                        window.alert("error:1");
                        continue;
                    }
                }
                // NACK reception=>End response processing

                if (recvBuffer.charAt(0) == NAK) {
                    window.alert("error:NAK");
                    break;
                }                             
                // Check STX
                if (recvBuffer.charAt(0) != STX) {
                    loopCount = 0;
                    continue;
                }                   
                // STX reception=>Start telegram reception

                if (SPPRecv(objRecv, 10, 10) != Bt.LibDef.BT_OK) {
                    window.alert("error:3");
                    continue;
                }

                recvBuffer = objRecv.data;
                // Check ETX
                if (recvBuffer.charAt(9) != ETX) {
                    window.alert(recvBuffer.charAt(9) + 2);
                    continue;
                }                   
                // Response processing 1 (ENQ transmission)
                if ((recvBuffer.charAt(2) == "\x47") ||
                        (recvBuffer.charAt(2) == "\x48") ||
                        (recvBuffer.charAt(2) == "\x53") ||
                        (recvBuffer.charAt(2) == "\x54")) {
                    Sleep(200);

                    sendBuffer = "";
                    sendBuffer = ENQ;

                    if (SPPSend(sendBuffer) != Bt.LibDef.BT_OK) {
                        window.alert("error:5");
                        continue;
                    }
                }
                // Response processing 2
                // recvBuffer.charAt(2) 打印机状态代码,打印时获取
                if ((recvBuffer.charAt(2) != "\x00") &&
                                    (recvBuffer.charAt(2) != "\x01") &&
                                    (recvBuffer.charAt(2) != "\x41") &&
                                    (recvBuffer.charAt(2) != "\x42") &&
                                    (recvBuffer.charAt(2) != "\x4E") &&
                                    (recvBuffer.charAt(2) != "\x4D")) {                                     

                    continue;
                }          
                printComplete = true;
                break;
            }

            if (printComplete) {
                window.alert("The printing operation was completed successfully.");
                return;
            }
        }
        catch (e) {
            window.alert("error:" + e);
        }

        window.alert("Printing failed.");
        return;
    }

  • 写回答

1条回答 默认 最新

  • 她嫌我菜呜呜呜 2024-04-17 11:55
    关注

    要实时获取 Sato 蓝牙打印机的状态,你需要修改你的代码,以便定期发送查询打印机状态的指令,并在收到响应时处理状态信息。你当前的代码只在打印时获取状态,因此需要进行一些更改。

    首先,你需要明确了解 Sato 蓝牙打印机的通信协议和指令集,以便正确发送查询状态的指令并解析响应。

    以下是一个基本的修改示例,用于实时查询打印机状态:

    function CheckPrinterStatus() {
        try {
            var objRecv = new Bt.LibDef.CommSppRecvData("");
            var statusCommand = "STATUS\n"; // 发送查询状态的指令,具体指令可能根据 Sato 打印机的规格而有所不同
    
            // 发送查询状态指令
            if (SPPSend(statusCommand) != Bt.LibDef.BT_OK) {
                window.alert("Failed to send status command.");
                return;
            }
    
            // 接收打印机响应
            if (SPPRecv(objRecv, 10, 10) != Bt.LibDef.BT_OK) {
                window.alert("Failed to receive printer response.");
                return;
            }
    
            var printerStatus = objRecv.data;
    
            // 解析打印机状态并处理
            // 这里根据具体的状态代码进行处理,例如:
            // if (printerStatus == "READY\n") {
            //     window.alert("Printer is ready.");
            // } else if (printerStatus == "BUSY\n") {
            //     window.alert("Printer is busy.");
            // } else {
            //     window.alert("Printer status unknown.");
            // }
    
            // 根据实际情况处理打印机状态信息
        } catch (e) {
            window.alert("Error: " + e);
        }
    }
    
    // 定时查询打印机状态
    setInterval(CheckPrinterStatus, 5000); // 每隔5秒查询一次状态
    

    在这个示例中,我们创建了一个名为 CheckPrinterStatus 的函数,它负责发送查询打印机状态的指令,并处理打印机的响应。然后,我们使用 setInterval 函数定时调用这个函数,以便每隔一定时间查询一次打印机状态。

    请注意,这只是一个基本的示例,实际情况可能会更复杂。你需要根据 Sato 打印机的具体规格和通信协议来调整代码,并确保正确处理打印机的各种状态。

    评论

报告相同问题?