سؤال

أحاول التواصل بين جهاز الكمبيوتر الخاص بي (Windows 7 باستخدام NetBeans و Rxtx) مع Arduino Pro، باستخدام المنفذ التسلسلي. يعمل Arduino في الواقع بجهاز الكمبيوتر باستخدام كابل FTDI.

يعتمد الرمز على Java SimpleRead.java الموجود هنا.

حاليا Arduino يطبع ببساطة سلسلة عند بدء تشغيله. يجب على برنامج Java الخاص بي طباعة عدد البايتات التي تم قراءتها ثم طباعة المحتويات. يعمل برنامج Java، نوع من ...

إذا كانت السلسلة طويلة (> 10 بايت أو نحو ذلك) سوف ينهار الناتج.

لذلك إذا كنت في اردوينو أنا طباعة

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

قد يبدو إخراج برنامج Java الخاص بي شيءا مثل:

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");
    }
}
هل كانت مفيدة؟

المحلول

البيانات التسلسلية هي مجرد دفق البيانات. اعتمادا على ذلك عند قراءته والتخزين المؤقت الذي يحدث، قد يكون جزء فقط من البيانات متاحا عند قراءته.

نظرا لأنك تستخدم بيانات موجهة نحو الأسطر، فما سترغب في القيام به هو المخزن المؤقت للبيانات حتى ترى Terminator الخط وفقط بعد ذلك معالجة البيانات.

نصائح أخرى

لم أستخدم Java Rxtx، لكنني لعبت مع اردوينو ومعالجة ومن السهل جدا قراءة / كتابة القيم من اردوينو. فيما يلي عينة قراءة تأتي مع المعالجة (ملف> أمثلة> المكتبات> المسلسل> 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
}

*/

بقدر ما أتذكر، فإن Baud Thingy الذي تقوم بإعداده في Arduino عند إنشاء Instantiate Serial مهم جدا. إذا كنت تستخدم 9600 للإرسال على سبيل المثال، يجب عليك استخدام نفس الرقم للاستماع.

من المهم أيضا إرسال معلوماتك بايت, وإلا فسوف تحصل على أشياء مثل r أو n في الطريق.

نسخة أقصر، حاول:

Serial.println(123456789123456789,BYTE);

أبسط الأفضل.

أعتقد أنك بحاجة إلى استخدام أنماط التصميم مدفوعة الحدث لحل هذه المشكلة. أنا نوصيك بشدة لزيارة: http://www.whatisarduino.org/bin/tutorials/java+serial+api+and+arduino.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top