我正在使用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只打印出一个空行。如果我首先使用Serial窗口准备带有“hiya”的Arduino,那么当执行java时,它将返回到空白行。
由于char数组只是在每次发送“H567 \ r \ n”时被覆盖,然后在串行窗口中键入发送“hiya”,其中额外换行仍在执行,所以我知道字符存储不知何故。
另一个测试是将最后Serial.prinln()
更改为Serial.println(inputBuffer[0], DEC)
。使用串行窗口,结果如预期,但从Java它只打印出“0”。串行通信工作非常精彩,来自Arduino与Java代码交谈,而不是从Java代码到Arduino。我该如何解决这个问题?
根据建议,我尝试阅读Serial.available()
而不是固定的最大值10.未经历任何更改。
答案 0 :(得分:2)
我找到了解决方案,但我不确定原因。启动串行写入线程时,我必须在启动时调用thread.sleep(2000)
,以便Arduino正确读取字符。
答案 1 :(得分:0)
尝试在out1.flush()
之后添加out1.write()
。