当前位置: 首页 > 知识库问答 >
问题:

Arduino在USB上读取Java程序时出现Serial.readBytes()故障

邰昀
2023-03-14

我用的是阿尔杜伊诺式的。我遇到了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端的代码。我修改了它的双向通信与串行端口。这只在启动时发送一个字节数组。

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”,然后在串行窗口中键入发送“hiya”,其中额外的换行仍在执行,所以我知道字符是以某种方式存储的。

另一个测试是将上一个serial.println()更改为serial.println(InputBuffer[0],DEC)。使用Serial窗口,结果与预期的一样,但在Java中,它只是打印出“0”。串行通信从Arduino与Java代码的对话中工作得很好,而不是从Java代码到Arduino。如何修复此问题?

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

共有1个答案

壤驷文华
2023-03-14

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

 类似资料:
  • 我有一辆Arduino UNO。我写了一个脚本来控制连接到Arduino上引脚2、3、4的灯光。使用我的笔记本电脑可以关闭或打开这些灯: 0关闭所有LED 实际上,我只对从笔记本电脑发送数据并相应地闪烁灯感兴趣。 以下是我的计划: 当我打开IDE的串行监视器并写入printf 1时,它工作正常 但是当我关闭串行监视器,并且 所以每次我需要点亮LED时,我必须确保IDE是打开的。 有没有一种方法可以

  • 我正在编写一个简单的C程序,可以从连接到我的Arduino设备的USB端口读取数据。Arduino以9600的波特率输出4字节的数据块。 我希望从Arduino到我的计算机的输入看起来像这样: 136.134.132.130.129.127.126.124.121.119.117.115.113.111. 然而,我得到了这样的结果: 271.274.281..2.4062.4022.40225.4

  • 我想在Android11上读一个OTG USB,我可以在Android9上列出这样的文件: 问题是为什么我在Android 11上可以读取外存,却不能读取OTG USB?我想要能够在Android11上读取USB OTG。

  • 我正在和两个阿杜伊诺斯·莱昂纳多做一个通讯系统。为了传输,我必须将字符串转换成比特,并通过PWM引脚发送。问题是,我该怎么做接收器? 我的想法是在数字引脚中接收数据,这样我就可以将LOW/HIGH转换为'0'和'1',将8位放在字符串中,转换为char,然后我就有了最后的字符串。 如有任何帮助/建议,将不胜感激。 编辑: 我使用PWM是因为我想实现FSK调制,一点一点地发送 我有一些硬件来让通讯系

  • 我在Pycharm上创建了一个项目,将selenium to文件夹添加到我的新项目“selenium”中,并将chromedriver添加到该文件夹中。 我能做什么?