Java 未正确发送到串行端口

Posted

技术标签:

【中文标题】Java 未正确发送到串行端口【英文标题】:Java not sending correctly to Serial Port 【发布时间】:2013-08-05 06:01:28 【问题描述】:

我正在为我的老学校为他们的上课铃创建一个程序,并且我正在使用 java。目前在我的 arduino 上,我有一个程序,当它从串口接收到一个数字时,它会打开铃铛,持续多久。该程序可在串行监视器中运行,但不能在 Java 中运行。这是我的 2 个程序:

import java.io.OutputStream;

import gnu.io.SerialPort;



public class Main 
    public static void main(String[] args) throws Exception 
        SerialPort sP = Arduino.connect("COM3");

        Thread.sleep(1500);

        OutputStream out = sP.getOutputStream();

        Thread.sleep(1500);

        out.write("3000".getBytes());
        out.flush();
        Thread.sleep(1500);
        out.close();
    

还有我的 Arduino conenct 程序;

import gnu.io.*;

public class Arduino 
    public static SerialPort connect(String portName) throws Exception 
        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);

        if(portIdentifier.isCurrentlyOwned()) 
            System.out.println("ERROR!!! -- Port already in use!");
        else
            CommPort commPort = portIdentifier.open("XBell", 0);

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

                return serialPort;
            else
                System.out.println("wait wat");
            
        
        return null;
    

这是 Arduino 代码:

int Relay = 13;
//The pin that the relay is attached to
int time;
//Creates temp variable

void setup() 
    //Initialize the Relay pin as an output:
    pinMode(Relay, OUTPUT);
    //Initialize the serial communication:
    Serial.begin(9600);


void loop() 
    while(true) 
        //Check if data has been sent from the computer:
        if (Serial.available()) 
            //Assign serial value to temp
            time = Serial.parseInt();
            //Output value to relay
            digitalWrite(Relay, HIGH);
            delay(time);
            digitalWrite(Relay, LOW);

        
    

如果您能告诉我我做错了什么,那将非常有帮助。谢谢!

【问题讨论】:

您确定该数字是要编码为 text 的吗? 我以前也这样做过,但由于硬盘故障,我丢失了那个程序。 对于相同的输入?这听起来像是通过串行端口传递数字的一种奇怪的方式......此外,您没有说明出了什么问题。大概它不起作用,但是它以什么方式不起作用?门铃不响吗?响铃太久?响铃时间太短? 在 arduino 上,我目前正在使用端口 13 上的内置 LED 进行调试。当我连接时,它会快速闪烁几次,我猜是连接,然后它就再也没有做任何事情了。 好吧,如果没有看到在 Arduino 上运行的代码,我们真的不知道为什么会这样...... 【参考方案1】:

一些问题。

Java 代码集 38400,Arduino 9600 波特。

无法确保 getBytes() 为您提供 ASCII。它将返回您的默认编码受到一堆警告。通常,您不能指望这种方法,并且应该始终更喜欢对编码进行显式控制。有无数人被这个烧死,这里是just one random reference。试试 getBytes("UTF-8")

您没有定义数字结尾的终结符。您可能认为发送了“3000”,但您应该认为发送了“3”,然后是“0”,然后是“0”,然后是“0”。在 Arduino 方面,对 Serial.available() 的调用可以按此顺序在任何时间发生。因此,当仅收到“3”时,代码可以到达 parseInt() 行。 Arduino 通过 loop() 比单个字符传输时间快得多。在每秒 9600 位和 10 位的字符 N81 下,1 个字符在网络上移动的时间超过 1 毫秒。在 16 MHz 时钟下,Arduino 将通过 loop() 多次旋转。您需要更改命令协议以包含终止符,并且只有在您拥有完整编号时才使用 parseInt()。

【讨论】:

非常感谢,我在 getBytes 中添加了“UTF-8”,效果很好! +1 并接受答案。

以上是关于Java 未正确发送到串行端口的主要内容,如果未能解决你的问题,请参考以下文章

串行端口未正确刷新

我如何知道要发送到串行端口的内容? [复制]

Python/MatPlotLib:无法在 y 轴上打印正确的数据

如何强制串行端口写入方法在发送数据之前等待线路清除?

可以在网站上使用 pySerial 打开并将数据发送到本地计算机上的串行端口吗?

需要帮助了解发送字节到串行端口