gpt4 book ai didi

java - 通过 USB 从 Java 程序读取时,Arduino 出现 Serial.readbytes() 问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:29:47 27 4
gpt4 key购买 nike

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

我当前的 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 只是打印出一个空行。如果我首先使用串行窗口为 Arduino 准备“hiya”,那么当执行 java 时,它将返回到空白行。

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

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

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

最佳答案

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

关于java - 通过 USB 从 Java 程序读取时,Arduino 出现 Serial.readbytes() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15869609/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com