Go Down

Topic: Serielle Datenübertragung Arduino Mikro - Jetson Nano Board (Read 92 times) previous topic - next topic

Da-Issa

Hey Leute,

Ich möchte Sensordaten, welche ich mit einem Arduino Micro auslesen via Micro-USB an mein Jetson Nano Board übertragen.
Das funktioniert allerdings nicht wie gewünscht :(
Am seriellen Monitor funktioniert es perfekt, sobald ich allerdings meinen Arduino an das Jetson Nano Board hänge und das unten zu sehende C-Skript ausführe, wird nichts ausgelesen. Meiner Meinung nach hängt sich das System dann in der "write"-Funktion auf, was läuft da falsch?

Hier der entsprechende Teil des Codes aus Arduino-Seite:

Code: [Select]


String befehl;

void loop() {
 
   performOPC(); // Hier misst ein Sensor und updatet regelmäßig seine Messwerte
   
   if(Serial.available()){
      befehl = Serial.readStringUntil('\n');
 

      if(befehl.equals("irgendwas" == false)){
         performMeasurement();                                 //Auslesen weiterer Sensoren plus
         Serial.flush();
         Serial.read();
      }
   }
}



Und hier das C-Skript:

Code: [Select]


void delay(unsigned int mseconds);
int openConnection(char[], speed_t);


int main(int argc, char *argv[])

//CONNECTION ARDUINO - JETSON

  int fd, n;

  char buf_ard[200] = "";


  /* open serial port Arduino*/
  fd = openConnection("/dev/ttyACM0", B9600);


  /* Everything set up. Now get data from connected devices every 5min */

    /* Send byte to trigger Arduino to send string back */
    write(fd, "0", 1);

    /* Receive string from Arduino */
    sleep(1000);
    n = read(fd, buf_ard, 200);

    /* insert terminating zero in the string */
    buf_ard[n] = '\0';

  /* close stream */
  close(fd);

  return 0;
}




int openConnection(char* str, speed_t baudrate)
{
  int fd;
  struct termios toptions;
  fd = open(str, O_RDWR | O_NOCTTY);
  printf("fd opened as %i\n", fd);

  /* wait for the Arduino to reboot */
  usleep(3500000);

  /* reset serial port settings */
  cfmakeraw(&toptions);
  /* set 115200 baud both ways */
  cfsetispeed(&toptions, baudrate);
  cfsetospeed(&toptions, baudrate);
  /* 8 bits, no parity, 1 stop bits */
  toptions.c_cflag &= ~PARENB;   // No Parity
  toptions.c_cflag &= ~CSTOPB;   // Reset Stop bit to 1
  toptions.c_cflag &= ~CSIZE;
  toptions.c_cflag |= CS8;
  /* Canonical mode */
  toptions.c_lflag |= ICANON;

  toptions.c_iflag &= ~IXON;
  toptions.c_iflag &= ~IXOFF;

  toptions.c_cflag &= ~CRTSCTS;       /* No Hardware flow Control                         */
  toptions.c_cflag |= (CREAD | CLOCAL); /* Enable receiver,Ignore Modem Control lines       */

  /* commit the serial port settings */
  tcsetattr(fd, TCSANOW, &toptions);
  tcflush(fd, TCIFLUSH);
  return fd;
}

void delay(unsigned int mseconds)
{
    clock_t goal = mseconds + clock();
    while (goal > clock());
}


Bin für jeden Hinweis in eine richtige Richtung dankbar :)

Ziel ist es eigentlich mit dem C-Skript (Jetson Nano Board) alle 5 Minuten, wie per Tastatureingabe per seriellem Monitor (was ja funktioniert) eine Ausgabe der Sensordaten vom Arduino zu triggern.

HotSystems

Was für ein C-Script ?
Oder meinst du das Sketch-Fragment.

Warum postest du nicht den kompletten Sketch oder ist der geheim ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

uwefed

Wieso fragst Du nicht irgendwo, wo man das Jetson Nano Board kennt. Hier kennt man nur den Arduino Micro.

Grüße Uwe

Whandall

Wieso fragst Du nicht irgendwo, wo man das Jetson Nano Board kennt. Hier kennt man nur den Arduino Micro.
Wäre nicht "ich kenne den Jetson Nano nicht" eine bessere Antwort/Bemerkung gewesen?


OP:

Der Micro wartet auf ein '\n' was das write nicht liefert, muss also den Timeout abwarten.

Strings auf dem Micro und die blockierende Inputverarbeitung werden dir keine Freude bereiten.

Warum darf der Micro seine Daten nicht selbstständig senden?
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Serenifly

Die Timeout Zeit kann man auch runter setzten. Wenn man dann mit einer höheren Baudrate arbeitet kann das ok sein.
Besser ist es natürlich man schreibt sich seine eigene Funktion die das komplett nicht-blockierend einliest


Das kann nicht funktionieren:
Code: [Select]

if(befehl.equals("irgendwas" == false))

Aktiviere mal die Warnungen ob das nicht angezeigt wird, dass das so nicht passt. String Objekte kann man einfach mit == vergleichen. Also so:
Code: [Select]

if(befehl == "irgendwas")



Was write() genau sendet solltest du aber mal überprüfen. Sendet das wirklich ein LF? Oder musst du das vielleicht selbst liefern? CR + LF wäre auch ein Problem so wie du das machst

Whandall

Auch hat der Jetson Nano nur USB 3 Ports,
ich meine mich zu erinnern das das auch problematisch sein kann.

Wenn aber der Serial-Monitor auf dem Jetson Nano problemlos funktioniert kann es nicht der Port sein.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Go Up