【问题标题】:JSSC writeString return true but device cannot receiveJSSC writeString 返回 true 但设备无法接收
【发布时间】:2017-05-27 13:23:28
【问题描述】:

我正在使用 JSSC 库与我的项目中的硬件设备进行通信。

我的软件和我的团队硬件需要同步工作(我的软件需要显示硬件中当前显示的内容,反之亦然)

一切都与我们团队的面包板完美配合,直到我们将其制成带有按钮的真正 PCB。

我们的团队目前正在为设备使用此 USB 转串口适配器:https://www.sparkfun.com/products/14050

当我们用面包板进行测试时,它是通过 COM3 连接的。当前设备通过 COM5 连接。

我的软件现在只能接收来自设备的数据,并且在我的软件中的按钮被点击时无法发回信号(实际上 writeString 方法返回 true 但我们的设备什么也没收到)

让我们看一下我的软件的一些代码sn-p:

我有这个 CONNECT 按钮来打开端口并建立通信:

private void connectButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
    if (selectedPort != null && selectedPort.isOpened()) {
        // Disconnect
        selectedPort.closePort();
        connectButton.setText("Connect");
    } else { // Connect
        selectedPort = new SerialPort(listPort.getSelectedItem().toString());
        try {
            connectButton.setText("Disconnect");
            selectedPort.openPort();
            selectedPort.setParams(9600, 8, 1, 0, true, false);
            selectedPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT);
            int mask = SerialPort.MASK_RXCHAR;
            selectedPort.setEventsMask(mask);
            selectedPort.addEventListener(new SerialPortReader());
        } catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }
}

我还有一个 jcombobox 可以将字符发送到设备:

private void modeListActionPerformed(java.awt.event.ActionEvent evt) {                                         
    try {
        JComboBox cb = (JComboBox) evt.getSource();
        String selectedItem = (String) cb.getSelectedItem();
        switch (selectedItem) {
            case "VOLTAGE_DC":
                dataMode = VOL_DC;
                selectedPort.writeString("v");
                break;
            case "VOLTAGE_AC":
                dataMode = VOL_AC;
                selectedPort.writeString("V");
                break;
            case "CURRENT_DC":
                dataMode = "CUR_DC";
                selectedPort.writeString("i");
                break;
            case "CURRENT_AC":
                dataMode = "CUR_AC";
                selectedPort.writeString("I");
                break;
            case "RESISTANCE":
                dataMode = RES;
                selectedPort.writeString("r");
                break;
            case "RESISTANCE_CON":
                dataMode = CON;
                selectedPort.writeString("c");
                break;
            default:
                break;
        }
        selectedPort.closePort();
        selectedPort.openPort();
        selectedPort.addEventListener(new SerialPortReader());
    } catch (SerialPortException ex) {
        Logger.getLogger(MainForm.class.getName()).log(Level.SEVERE, null, ex);
    }
}  

我的SerialPortReader

public class SerialPortReader implements SerialPortEventListener {
      @Override
public void serialEvent(SerialPortEvent event) {
    if (event.isRXCHAR() && event.getEventValue() > 0) {
        try {
            byte[] buffer = selectedPort.readBytes(event.getEventValue());
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    update_display_by_buffer(buffer);
            });
        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }
}

回顾几个要点:

  • 我的软件可以在测试时与面包板顺利通信 (COM3)
  • 我的软件现在只能接收数据,但不能与真实设备相反(即使 writeString 方法返回 true)
  • 我们的真实设备与 Putty 完美搭配

这个问题的原因可能是什么?

任何指针将不胜感激。

// 已更新

使用 jSerialComm 库解决问题

结论:

  • RXTX 一团糟。

  • JSSC 库很烂。

【问题讨论】:

    标签: java serial-port jssc


    【解决方案1】:

    我在另一个项目中观察到相同的行为,有时是由于写入串行端口后“未刷新数据”。 JSSC 似乎没有任何冲洗。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多