2013-08-05 84 views
0

我正在爲我的舊學校爲他們的學校鐘聲創建一份prorgram,並且我正在使用java。目前在我的arduino上,我有一個程序,當它從串行端口收到一個數字時,它會打開鈴聲,說明它的時間長短。此程序在串行監視器中工作,但不在Java中。這些是我的2個程序:Java沒有正確發送到串行端口

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); 

     } 
    } 
} 

如果你能告訴我什麼,我做錯了,這將是非常有益的。謝謝!

+0

你確定這個數字是否被編碼爲* text *? –

+0

我之前就是這麼做的,但是由於硬盤驅動器故障,我丟失了該程序。 – cheese5505

+0

對於相同的輸入?這聽起來像是通過串口傳遞數字的一種奇怪的方式......此外,您沒有指出發生了什麼問題。據推測,它不工作,但以什麼方式*它不工作?鐘不響嗎?戒指太久了?戒指太短了? –

回答

2

有幾個問題。

  • 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毫秒的時間跨過線路。在16MHz的時鐘下,Arduino將多次旋轉循環()。您需要更改命令協議以包含終止符,並且只有具有完整編號的parseInt()纔會包含終止符。

+0

非常感謝,我添加了「UTF-8」getBytes,它完美的工作! +1並接受答案。 – cheese5505

相關問題