(RuntimeException e) met Serial port, Processing

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 01:14
ik probeer in processing.org een programma te schrijven die de laatste comport af scant naar een stukje arduino

nu werkt dat perfect, zolang het apparaat maar aangesloten is.
via

Java: 1
1
 myPort = new Serial(this, Serial.list()[Serial.list().length-1], 9600);

wat mijn laatste seriele poort opent

nu wil ik dus een andere actie ondernemen wanneer de arduino niet is aangesloten. (bijvoorbeeld melding met niet verbonden)

de arduino is zo ingesteld dat hij elke 100ms "Sync_"+datum verstuurd (zodat ik de firmware versie kan detecteren.

de arduino zou altijd de laatst aangesloten compoort zijn.

in processing heb ik nu.

Java: 1
1
2
3
4
5
6
7
8
while(OutTime<10){  // probeer maximaal 10 keer
try{ myPort = new Serial(this, Serial.list()[Serial.list().length-1], 9600); 
Data=myPort.readStringUntil('\n'); 
if(Data.contains("Sync")){print(" Device found "); 
  printArray(Serial.list()); print(" Connected ");   connected =1; OutTime=11; }}
catch (RuntimeException e) {   OutTime=OutTime+1; print(" No device found "); }
}
  if(connected==1){// wanneer er verbinding is


het probleem is nu dat ik steeds de melding krijg , No device found, ook wanneer ik mijn arduino wel aansluit.


nu heb ik ondekt dat mijn
Java: 1
1
 if(Data.contains("Sync")){

een null pointer exception op levert


maar waneer ik dat vervang met
Java: 1
1
if(Data=="Sync120116"){
heb ik nog steeds geen verbinding

[ Voor 3% gewijzigd door itcouldbeanyone op 12-01-2016 11:06 ]

Ben niet slim, maar wel dom

Alle reacties


Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 16-07 18:04

Douweegbertje

Wat kinderachtig.. godverdomme

Met de [ code ] tags zal je formatting wat beter zijn. Nu is het lastig te lezen.

In elk geval heb ik er geen ervaring mee, maar ik zou gewoon checken of er een verbinding zit in "myPort" in plaats van daadwerkelijk naar de data te kijken.


edit;
en dit is gewoon een vraag toch, of wil je wel een discussie.

[ Voor 13% gewijzigd door Douweegbertje op 12-01-2016 10:34 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:56

Creepy

Tactical Espionage Splatterer

En wat voor Exceptie is het nu precies? Print die eens uit, dan weet je in elk geval om wat voor Exceptie het gaat. En uiteraard zul je moeten gaan debuggen. Zo zeg je bijv
"de arduino zou altijd de laatst aangesloten compoort zijn."
maar heb je al gechecked dat dat ook altijd klopt?

Ik heb je topic veranderd van discussie naar vraag. Zou je zelf je code netjes willen maken en in een code blok willen zetten i.p.v. quote?

[ Voor 19% gewijzigd door Creepy op 12-01-2016 10:42 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 01:14
Creepy schreef op dinsdag 12 januari 2016 @ 10:41:
En wat voor Exceptie is het nu precies? Print die eens uit, dan weet je in elk geval om wat voor Exceptie het gaat. En uiteraard zul je moeten gaan debuggen. Zo zeg je bijv
[...]
maar heb je al gechecked dat dat ook altijd klopt?

Ik heb je topic veranderd van discussie naar vraag. Zou je zelf je code netjes willen maken en in een code blok willen zetten i.p.v. quote?
heb al veranderd.

ja de poortnummer klopt altijd.
alleen de try[] en Exception[] functie werkt niet.


als ik de exception print krijg ik : null

en dat komt doordat mijn Data.contains("Sync") functie niet werkt
verander ik dat in Data=="Sync_120116" (wat de arduino verstuurd om zich te identificeren )

dan krijg ik : Error opening serial port COM9: Port busy

[ Voor 14% gewijzigd door itcouldbeanyone op 12-01-2016 11:16 ]

Ben niet slim, maar wel dom


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
itcouldbeanyone schreef op dinsdag 12 januari 2016 @ 10:09:
nu heb ik ondekt dat mijn
Java: 1
1
 if(Data.contains("Sync")){

een null pointer exception op levert
Dat betekent dus dat Data null is. De read levert waarschijnlijk niks op.
itcouldbeanyone schreef op dinsdag 12 januari 2016 @ 11:11:
[...]
dan krijg ik : Error opening serial port COM9: Port busy
Doordat je nu een == comparison gebruikt i.p.v. een member function van string zal er geen null-pointer optreden ( maar nog steeds false returnen want null == "string" resulteert in false ), en in de tweede loop probeer je de serial port dan nogmaals te openen, maar dat werkt niet omdat je hem nog open hebt.

Het is overigens niet slim om telkens de poort opnieuw te openen. Als het de eerste keer gelukt is kun je beter op dezelfde instance blijven lezen. Het kan immers zo zijn dat je midden in een regel geconnect bent. Dan zal je connectie check altijd falen, en bij de volgende connect kan je prima weer midden in een regel binnenvallen. Op die manier ga je nooit goede verbinding krijgen.

Beter doe je iets als het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
while(MaxTries > Tries)
{
    var port;
    try
    {
         port = Connect();

         //Lees eerst tot een newline, op dat moment weet je dat de volgende regel volledig is
         var str = port.ReadLine();
 
         //Lees volledige regel
         str = port.ReadLine();
         if(str == "SYNC21334") { /*connected*/ }
         else { /* geen geldige start string*/ }


    }
    catch(Exception ex)
    {
          Tries++;
    }
    finaly
    {
          if(port != null && port.Connected)
               port.Disconnect()
    }
}

Op de een of andere manier zul je ieder geval iets van Framing of Synchronisatie toe moeten passen op het lezen van je stream, want je weet nooit wanneer jij precies in de stream binnen valt.

[ Voor 50% gewijzigd door Woy op 12-01-2016 12:07 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Viper®
  • Registratie: Februari 2001
  • Niet online
Woy schreef op dinsdag 12 januari 2016 @ 11:57:
[...]

Dat betekent dus dat Data null is. De read levert waarschijnlijk niks op.


[...]
Dit

Je zou een if (Data != null) of een String.IsNullOrEmpty kunnen toevoegen om je null value af te vangen.

Verder zal de functie myPort = new Serial(this, Serial.list()[Serial.list().length-1], 9600); buiten de loop gezet moeten worden.
Je probeert namelijk nu binnen je loop een tweede keer dezelfde poort uit te luisteren.

Met een netstat -a(b) kan je een lijst krijgen van port listeners.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je de connect volledige buiten de loop plaatst probeer je natuurlijk maar 1 keer te connecten. Ik kan mij voorstellen dat je dat wel meerdere malen wil proberen ( Bijvoorbeeld als een andere applicatie de poort gelocked heeft ).

Maar je moet inderdaad wel zorgen dat je die poort dan ook goed sluit.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Viper®
  • Registratie: Februari 2001
  • Niet online
Ik ken de code inderdaad niet, ik ging er vanuit dat hij een poort listener aanmaakt, maar volgens mij houdt hij inderdaad de poort niet vast.
Dus volgens mij moet hij inderdaad binnen de loop :$

Kwam deze nog tegen: https://learn.sparkfun.co...ino-to-processing/discuss

Via MyPort.available() kun je waarschijnlijk opvragen of er bytes[] beschikbaar zijn om te lezen oid.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//Here's my code:

//The error I get is: ArrayIndexOutOfBoundsException:3

//My Arduino is on COM3

// Notes/comments were to myself.  Not meant to be insulting. I am just learning.


//Uncomment, (remove the forward slashes) cut and Paste this first section into Arduino:
//void setup ()
//{
//  //initialize serial communication at 9600 baud rate
//  Serial.begin(9600);
//}
//
//void loop()
//{
//  //send "Hello World!" over the serial port
//  Serial.println ("Hello World");
// wait 100 milliseconds so we don't drive ourselves crazy
//  delay (100);
//}
//********************************************************************************************

//Cut and Paste from here down into Processing

import processing.serial.*;

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

void setup() 
{
 String portName = Serial.list()[3]; //change the 0 to a 1 or 2 etc. to match your port
 myPort = new Serial(this, portName, 9600);
}
   void draw()
    {
      if ( myPort.available() > 0) 
      {  // If data is available,
      val = myPort.readStringUntil('\n');         // read it and store it in val
      } 
    println(val); //print it out in the console
    }

//***********************************************************************************************

//If you're not sure which port your Arduino is on. Open a new Processing sketch, 
// uncomment (remove the forward slashes at the start of each line) 
//cut, paste and run the following into Processing to get a list of ports:
//
//import processing.serial.*;
// void setup() {
// println(Serial.list());
//}
Pagina: 1