【问题标题】:Arduino trouble with Serial.readbytes() when reading from a Java program over USB通过 USB 从 Java 程序读取时,Arduino 出现 Serial.readbytes() 问题
【发布时间】:2013-04-10 01:03:33
【问题描述】:

我正在使用Arduino Uno。我遇到Serial.readbytes() 的奇怪行为。 Arduino 通过 COM4 上的 USB 供电和通信。我在 64 位 Windows 7 上运行 Eclipse

我当前的 Arduino 代码如下所示;延迟是为了让我可以启动和停止我的 Java 服务并查看 Arduino IDE 中的串行窗口,inputBuffer 是一个字符数组。

char inputBuffer[10];   // For incoming serial data
void setup() {
    Serial.begin(9600); // Opens serial port, sets data rate to 9600 bit/s.
}

void GetTemp(){
    int temp = 123;
    Serial.print(temp);
}

void loop() {
    if (Serial.available() > 0) {
        Serial.readBytes(inputBuffer, Serial.available());
        delay(5000);
        Serial.print("I got this ->");
        Serial.print(inputBuffer);
        Serial.println("<-");
    }
    delay(5000);
    Serial.println("delay");
    Serial.println(inputBuffer[0], DEC);
}

这是我的 Java 端的代码。我从 Two way communcation with the serial port 修改它。这只是在开始时发送一个字节数组。

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.IOException;
import java.io.OutputStream;

public class TwoWaySerialComm
{
    public TwoWaySerialComm()
    {
        super();
    }

    void connect ( String portName ) throws Exception
    {
        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
        if ( portIdentifier.isCurrentlyOwned() )
        {
            System.out.println("Error: Port is currently in use");
        }
        else
        {
            CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);

            if ( commPort instanceof SerialPort )
            {
                SerialPort serialPort = (SerialPort) commPort;
                serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

                OutputStream out = serialPort.getOutputStream();

                (new Thread(new SerialWriter(out))).start();
            }
            else
            {
                System.out.println("Error: Only serial ports are handled by this example.");
            }
        }
    }

    public static class SerialWriter implements Runnable
    {
        OutputStream out1;

        public SerialWriter ( OutputStream out )
        {
            this.out1 = out;
        }

        public void run ()
        {
            try
            {
                byte[] test = ("H567").getBytes();//testing string to send
                this.out1.write(test);
            }
            catch ( IOException e )
            {
                e.printStackTrace();
            }
        }
    }

    public static void main ( String[] args )
    {
        try
        {
            (new TwoWaySerialComm()).connect("COM4");
        }
        catch ( Exception e )
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

当我运行它时,我的 Arduino 只是打印出一个空白行。如果我首先使用串行窗口准备带有“hiya”的 Arduino,那么当执行 java 时,它将返回到一个空行。

由于每次我发送“H567\r\n”时 char 数组都会被覆盖,然后在串行窗口中键入 sent “hiya”,额外的换行符仍在执行,所以我知道字符正在被存储不知何故。

另一个测试是将最后一个Serial.prinln() 更改为Serial.println(inputBuffer[0], DEC)。使用串行窗口,结果符合预期,但从 Java 中它只打印出“0”。来自 Arduino 与 Java 代码的串行通信非常棒,而不是从 Java 代码到 Arduino。我该如何解决这个问题?

根据建议,我尝试阅读 Serial.available() 而不是固定的最大值 10。没有发生任何变化。

【问题讨论】:

  • 您使用的是哪个版本的 RXTX?您使用的是哪个版本的 Java?
  • 你能发布你所有的Java代码吗?最好用SSCCE 包装得漂亮整洁。
  • 您必须原谅我,但我在 SSCCE 上遇到了问题,我现在睡眠不足。
  • RXTX 是我相信的 2.1-7 我找到了 64 位 dll
  • Jre7,我现在正在更改代码,

标签: java io serial-port usb arduino


【解决方案1】:

我找到了解决方案,但我不确定原因。在启动串行写入线程时,我必须在启动时调用thread.sleep(2000),以便 Arduino 正确读取字符。

【讨论】:

  • 当您打开 arduino 的串行端口时,它会重置。这就是“thread.sleep(2000)”有效的原因。它让 arduino 有时间完全启动
【解决方案2】:

尝试在out1.write() 之后添加out1.flush()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2019-08-05
    • 2013-09-29
    • 1970-01-01
    相关资源
    最近更新 更多