【问题标题】:Error: "No error in nativeDrain" caused by OutputStream.flush()错误:由 OutputStream.flush() 引起的“nativeDrain 中没有错误”
【发布时间】:2019-10-15 10:51:24
【问题描述】:

我有以下问题:当我想刷新 OutputStream 时,RxTx 返回错误。 目标是使用调制解调器密钥发送短信。那我哪里错了?

我搜了一下,一无所获,不知道是什么原因造成的!

我认为错误消息来自 RxTx 库,但我不确定。 我已经尝试过不冲洗,但它也不起作用。 所以请帮助我

这是我班级的实际代码:

package fr.ryfax.smscontroller.main;

import java.io.*;
import java.util.ArrayList;

import gnu.io.*;

public class USBModem {

    private CommPortIdentifier PORT_ID;
    private final String PORT;
    private final int BITRATE;
    private final String CENTER;

    private final char ENTER = 13;
    private final char CTRLZ = 26;

    public USBModem(String PORT, int BITRATE, String SMSCENTER) {

        try {
            this.PORT_ID = CommPortIdentifier.getPortIdentifier(PORT);
        }catch(Exception e) {
            this.PORT_ID = null;
            System.err.println("USBModem Error: Unknown port!");
        }

        this.PORT    = PORT;
        this.BITRATE = BITRATE;
        this.CENTER  = SMSCENTER;

    }

    public void sendSMS(String TO, String MSG) throws Exception {

        SerialPort serial         = (SerialPort) PORT_ID.open(this.PORT, 2000);
        //InputStream inputStream   = serial.getInputStream();

        serial.setSerialPortParams(this.BITRATE, //115200
                SerialPort.DATABITS_8,           //Bit de données
                SerialPort.STOPBITS_1,           //Bit d'arrêt
                SerialPort.PARITY_NONE           //Parité
        );
        serial.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); //Flux

        ArrayList<String> commands = new ArrayList<String>();

        commands.add("AT" + ENTER);
        commands.add("AT+CMGF=1" + ENTER);
        commands.add("AT+CSCA=\"" + CENTER + "\"" + ENTER);
        commands.add("AT+CSCA=\"" + TO + "\"" + ENTER);
        commands.add(MSG + CTRLZ);

        sendCommands(commands, serial);

        System.out.println("[MOI] -> [" + TO + "]" + " : " + MSG);
    }

    public void sendCommands(ArrayList<String> commands, SerialPort serial) throws Exception {
        OutputStream outputStream = serial.getOutputStream();
        for(String command : commands) {
            outputStream.flush();
            outputStream.write(command.getBytes());
            Thread.sleep(100);
        }
        Thread.sleep(3000);

        serial.close();
        outputStream.close();
    }
}

Output:

Exception in thread "main" java.io.IOException: No error in nativeDrain
    at gnu.io.RXTXPort.nativeDrain(Native Method)
    at gnu.io.RXTXPort$SerialOutputStream.flush(RXTXPort.java:1248)
    at fr.ryfax.smscontroller.main.USBModem.sendCommands(USBModem.java:61)
    at fr.ryfax.smscontroller.main.USBModem.sendSMS(USBModem.java:53)
    at fr.ryfax.smscontroller.main.Main.main(Main.java:21)

【问题讨论】:

    标签: java sms at-command rxtx


    【解决方案1】:

    outputStream.write 之后调用outputStream.flush 更有意义,所以这样做。说到切换顺序,在serial.close之前调用outputStream.close

    然后找一张大A3纸,一支红笔,写1000遍

    我绝不会使用Thread.sleep 来代替读取解析来自调制解调器的响应。

    我绝不会使用Thread.sleep 来代替读取解析来自调制解调器的响应。

    我绝不会使用Thread.sleep 来代替读取解析来自调制解调器的响应。

    我绝不会使用Thread.sleep 来代替读取解析来自调制解调器的响应。

    ...

    向调制解调器发送 AT 命令时,您必须 read and parse 它发送回给您的所有内容。

    你的第二个AT+CSCA 应该是AT+CMGS,对于那个命令你 必须 wait for the "ready to receive payload data" prompt 在发送 SMS 有效负载之前。

    【讨论】:

      猜你喜欢
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      相关资源
      最近更新 更多