【问题标题】:Trying to write and read from the same com port, successful at writing, but failing at reading. Wat do?尝试从同一个 com 端口写入和读取,写入成功,但读取失败。做什么?
【发布时间】:2015-10-01 08:54:46
【问题描述】:

我正在尝试从 com 端口获取一些数据,与我正在写入数据的端口相同,但事实证明它很难读取。我设法找到一个简单的代码片段来读取它,但现在,我只读取零。可能是什么原因?

我在下面发送我的代码,并解释它们的预期用途。

private void ReadFromComPortActionPerformed(java.awt.event.ActionEvent evt) {                                                
    try {
        String text = EmulatorInput.getText();
        sendData(text, "COM4");
        String out_Text = Arrays.toString(read());
        EmulatorOutput.setText(out_Text);
        System.out.println(out_Text);
    } catch (IOException ex) {
            Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);
    }
}  

这是一个 JButton,方法名和参数已由 NetBeans 创建。 Code firsts 从输入面板获取文本作为字符串,将其与 com 端口名称一起发送,连接到该端口,并通过它打开输入/输出流,然后将从输入面板获取的字符串写入 OutputStream。然后,我创建一个新字符串,命名为out_Text,并使用read() 方法从端口读取数据。

这里是读取方法;

private byte[] read() throws IOException {
    byte[] buffer = new byte[16];
    int total = 0, read = 0;
    while (total <= 16 && (read = input.read(buffer, total, 16-total)) > 0)  {
        total += read;
    }
    return buffer;
}

在我发布的第一个方法使用read() 将其收敛为一个可以打印为字节数组的字符串后,我最终只得到一个零字节。

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

我对此感到非常困惑,因为我确定我会写信给端口。我什至监控了我写的内容,可以看到当我使用程序向com端口写入数据时,它接收到的数据增加了。

如果有不清楚的地方或者需要更多代码,请通过 cmets 联系。

谢谢。

【问题讨论】:

  • 始终检查您的通讯端口设置。波特率、数据位、奇偶校验等。然后确保您发送的命令实际上会从目标生成响应。
  • 我已经监视了我打开的 COM 端口,看看我是否正在发送一些数据。最终,我做到了,因为每当我运行echo message &gt; COM#(请注意# 代表COM 端口号)它表明字节正在通过。我也在 java 代码中做到了这一点,并确认我正在发送数据。确切的问题是,在我发送的第二个代码段中,我无法进入。因为它总是从输入中读取 0(InputStream 类型,创建为 input = port.getInputStream() 另外,我的波特率为 9600,数据位为 8,没有奇偶校验,并得到 1 个停止位。

标签: java serial-port inputstream outputstream


【解决方案1】:

经过几次尝试,我尝试了与jSSC 相同的操作,并设法再次写入。但是,我仍然无法阅读。然后我注意到,我正在创建 pairs com 端口。因此,简单地说,我开始写入一个端口,并从该对的另一个端口接收数据。它就像一个魅力。我不确定同样的想法是否适用于 rxtx 库,但是因为 jSSC 的文档是描述性的,并且因为它易于使用,所以我切换到它,以及我的工作方式。你可以在下面找到我是如何做的,没有代码的详细解释。

PreStep > 开始时,我的 COM6 和 COM7 完好无损。

Step1 > 通过 jSSC 的方法打开两个端口。我将它们构建为 SerialPort,然后设置它们的参数(BaudRate、DataBits 等)。

Step2 > 我开始从控制台获取输入,并将它们写入 COM6。当我监视端口及其中的字节时,每次发送输入时它都会发生变化。

Step3 > 每次按“Enter”发送输入时,我都会从 COM7 对象调用读取方法,它会向控制台发送一个字节数组(Via Arrays. toString(byte[] array) 方法)。

我不知道为什么我不能从我写的同一个端口读取,但是唉,我的问题已经解决了。感谢您花时间阅读此答案。如果您有任何问题,请在此下方发表评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2014-04-07
    • 2021-04-05
    • 2011-04-21
    • 2019-11-13
    相关资源
    最近更新 更多