2010-01-05 15 views
12

के बीच सीरियल संचार सीरियल पोर्ट का उपयोग करके, मैं अपने पीसी (नेटबीन्स और आरXTएक्स का उपयोग कर विंडोज 7) के बीच संवाद करने की कोशिश कर रहा हूं। Arduino वास्तव में एक एफटीडीआई केबल का उपयोग कर पीसी से जुड़ा हुआ है।जावा RXTX और Arduino

कोड जावा SimpleRead.Java पर आधारित है पाया here.

वर्तमान में Arduino बस एक स्ट्रिंग बाहर प्रिंट जब यह शुरू होता है। मेरे जावा प्रोग्राम को पढ़ा गया बाइट्स की संख्या मुद्रित करनी चाहिए और फिर सामग्री को मुद्रित करना चाहिए। जावा प्रोग्राम काम करता है, प्रकार ...

यदि स्ट्रिंग लंबी है (> 10 बाइट्स या तो) आउटपुट टूट जाएगा।

तो अगर Arduino पर मैं प्रिंट

Serial.println("123456789123456789"); //20 bytes including '\r' and '\n' 

मेरी जावा प्रोग्राम की तरह कुछ लग सकता है के उत्पादन:

Number of Bytes: 15 
1234567891234 
Number of Bytes: 5 
56789 

या

Number of Bytes: 12 
1234567891 
Number of Bytes: 8 
23456789 

मैं सोच रहा हूँ कि यह एक है समय की समस्या, क्योंकि जब मैं मैन्युअल रूप से डीबगर का उपयोग कर कोड से गुजरता हूं, तो परिणाम स्ट्रिंग हमेशा यह होती है कि यह होना चाहिए: चालू ई 20 बाइट स्ट्रिंग।

मैं विभिन्न चीजों से गड़बड़ कर रहा हूं लेकिन मैं समस्या को ठीक करने में सक्षम नहीं हूं।

यहाँ कोड है कि मुझे समस्याओं दे रही है का हिस्सा है:

static int baudrate = 9600, 
      dataBits = SerialPort.DATABITS_8, 
      stopBits = SerialPort.STOPBITS_1, 
      parity = SerialPort.PARITY_NONE;  

byte[] readBuffer = new byte[128]; 

... 
... 

public void serialEvent(SerialPortEvent event) 
{ 
    if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { 

    try { 
     if (input.available() > 0) { 
      //Read the InputStream and return the number of bytes read 
      numBytes = input.read(readBuffer); 

      String result = new String(readBuffer,0,numBytes); 
      System.out.println("Number of Bytes: " + numBytes); 
      System.out.println(result); 
     } 
    } catch (IOException e) { 
     System.out.println("Data Available Exception"); 
    } 
} 

उत्तर

6

सीरियल डेटा बस डेटा की एक धारा है। जब आप इसे पढ़ते हैं और जो बफरिंग हो रहा है, उस पर निर्भर करते हुए, जब आप इसे पढ़ते हैं तो डेटा का केवल एक हिस्सा उपलब्ध हो सकता है।

चूंकि आप लाइन उन्मुख डेटा का उपयोग कर रहे हैं, आप जो करना चाहते हैं वह डेटा बफर है जब तक आप लाइन टर्मिनेटर नहीं देखते हैं और केवल तब डेटा को संसाधित करते हैं।

+0

किसी कारण से मुझे लगता है कि डेटा एक ही स्ट्रीम में संगत रूप से भेजा जाएगा।पीसी के अंत में, मुझे केवल सीरियल आउटपुट देखने की ज़रूरत है, इसलिए मुझे नहीं लगता कि मैं पूरी आने वाली लाइन को स्टोर करने की कोशिश कर दूंगा और फिर इसे प्रदर्शित करूंगा। मुझे लगता है कि यह केवल डेटा बाइट-बाय-बाइट प्रदर्शित करेगा जैसा कि इसमें आता है। इसलिए मैं ayyte = input.read() का उपयोग करूंगा; input.read के बजाय (readBuffer); धन्यवाद – SharpBarb

+0

@SharpBarb - एक समय में एक बाइट पढ़ने के लिए स्विच करने की आवश्यकता नहीं है। यदि आप वास्तव में ऐसा करना चाहते हैं, तो मैं एक बफर पढ़ने की सिफारिश करता हूं और फिर अपने ऐप के भीतर बस प्रत्येक बाइट को अलग से संसाधित करता हूं। –

3

मैंने जावा RXTX का उपयोग नहीं किया है, लेकिन मैंने Arduino और प्रसंस्करण के साथ खेला है और Arduino से मूल्यों को पढ़ने/लिखना बहुत आसान है। यहाँ पढ़ने नमूना उस के साथ प्रसंस्करण (फ़ाइल> उदाहरण> पुस्तकालय> सीरियल> SimpleRead)

/** 
* Simple Read 
* 
* Read data from the serial port and change the color of a rectangle 
* when a switch connected to a Wiring or Arduino board is pressed and released. 
* This example works with the Wiring/Arduino program that follows below. 
*/ 


import processing.serial.*; 

Serial myPort; // Create object from Serial class 
int val;  // Data received from the serial port 

void setup() 
{ 
    size(200, 200); 
    // I know that the first port in the serial list on my mac 
    // is always my FTDI adaptor, so I open Serial.list()[0]. 
    // On Windows machines, this generally opens COM1. 
    // Open whatever port is the one you're using. 
    String portName = Serial.list()[0]; 
    myPort = new Serial(this, portName, 9600); 
} 

void draw() 
{ 
    if (myPort.available() > 0) { // If data is available, 
    val = myPort.read();   // read it and store it in val 
    } 
    background(255);    // Set background to white 
    if (val == 0) {    // If the serial value is 0, 
    fill(0);     // set fill to black 
    } 
    else {      // If the serial value is not 0, 
    fill(204);     // set fill to light gray 
    } 
    rect(50, 50, 100, 100); 
} 



/* 

// Wiring/Arduino Code 
// Code for sensing a switch status and writing the value to the serial port. 

int switchPin = 4;      // Switch connected to pin 4 

void setup() { 
    pinMode(switchPin, INPUT);    // Set pin 0 as an input 
    Serial.begin(9600);     // Start serial communication at 9600 bps 
} 

void loop() { 
    if (digitalRead(switchPin) == HIGH) { // If switch is ON, 
    Serial.print(1, BYTE);    // send 1 to Processing 
    } else {        // If the switch is not ON, 
    Serial.print(0, BYTE);    // send 0 to Processing 
    } 
    delay(100);       // Wait 100 milliseconds 
} 

*/ 

जहाँ तक मुझे याद है के रूप में, बॉड Arduino में आप सेटअप thingy जब आप का दृष्टांत सीरियल बहुत महत्वपूर्ण है आता है। उदाहरण के लिए भेजने के लिए आप 9600 का उपयोग करते हैं, तो आपको सुनने के लिए उसी नंबर का उपयोग करना चाहिए।

यह भी आपकी जानकारी BYTE के रूप में भेजने के लिए बहुत महत्वपूर्ण है, अन्यथा आपके पास \ r या \ n जैसी चीज़ें होंगी।

छोटा संस्करण, कोशिश:

Serial.println(123456789123456789,BYTE); 

सरल बेहतर है।

+0

हाय, Papplet के बिना काम संसाधित कर सकते हैं? क्योंकि मैं अपने जावा कोड के साथ एकीकृत करने की कोशिश करता हूं ... – wizztjh

+1

@wizztjh आप इसे आजमा सकते हैं: http://www.arduino.cc/playground/Interfacing/Java –

+0

उत्तर के लिए धन्यवाद, @geory मुझे कहना है कि मैं एक एनालॉग प्राप्त करना चाहता हूं जब भी मैं arduino को कुछ भेजता हूं तो Arduino और Arduino से इनपुट एनालॉग मान का जवाब देगा। लिंक में दिए गए कोड के मुताबिक, यह सिर्फ एक चर में सहेजने के बजाय चीज़ को मुद्रित करेगा, मैं चर को एक चर में कैसे स्टोर कर सकता हूं? चूंकि सार्वजनिक सिंक्रनाइज़ेड शून्य सीरियलएवेंट मूल्य वापस नहीं कर सकता है, मुझे लगता है ... – wizztjh

1

मुझे लगता है कि आपको इस समस्या को हल करने के लिए ईवेंट संचालित डिज़ाइन पैटर्न का उपयोग करने की आवश्यकता है। मैं आपको अत्यधिक यात्रा करने की सलाह देता हूं: http://www.whatisarduino.org/bin/Tutorials/Java+Serial+API+and+Arduino