Seriele poort verbinding

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer een rs232 verbinding op te zetten tussen mijn laptop en een pic16f688. Als ik een rs232 ananlyser gebruik werkt de verbinding prima. Nu probeer ik in C# een programma te schrijven om data over te sturen en te ontvangen. Het sturen gaat prima maar bij het ontvangen krijg ik de foutmelding:
FormatException was unhandled. De indeling van de invoertekenreeks is onjuist.

Ik snap niet waar deze fout vandaan komt.

Code die ik gebruik voor het ontvangen is als volgt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        private void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            InputData = sp1.ReadExisting();
            if (InputData != String.Empty)
            {
                SetText(InputData);
            }
        }

        private void SetText(string text)
        {
            double uitkomst;
            if (this.lblPotmeter.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] {text});
            }
            else
            {
                uitkomst = (10000 / 255) * Convert.ToDouble(text);
                this.lblPotmeter.Text = "Potmeter waarde = " + Convert.ToString(uitkomst) + " ohm";
            }
        }
 


Hij geeft de foutmelding aan bij de regel "this.Invoke(d, new object[] {text});"

Weet iemand wat ik fout doe?

Acties:
  • 0 Henk 'm!

Verwijderd

heb je een delegate aangemaakt ? voor je text veranderen ? het lijkt er op dat die niet overeen komt namelijk

[ Voor 30% gewijzigd door Verwijderd op 21-03-2010 21:11 ]


Acties:
  • 0 Henk 'm!

  • wiho
  • Registratie: Februari 2000
  • Laatst online: 15-09 15:53

wiho

Certified Nerd

De meest voor de hand liggende verklaring is dat text geen geldige representatie van een (floating point) getal bevat, waardoor ToDouble(text) die FormatException gooit.

Laat je niet op het verkeerde been zetten door de asynchrone aanroep via this.Invoke. Wanneer je simpelweg door de code heen stept, lijkt het alleen maar alsof de exception daar optreedt. Zet maar eens een breakpoint op ToDouble() :)

"Pas als het proces gecrashed is, dumpt men de core"


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het lijkt me inderdaad gewoon een kwestie van debuggen. De FormatException treed 99% zeker op de Convert.ToDouble op. Dat had je ook kunnen zien als je de stacktrace van de (Inner)Exception had bekeken

“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!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Gokje: dit is op een Nederlands ingesteld OS en je krijgt een '.' terug. Je kunt dat vrij eenvoudig verhelpen. Daarnaast is die "new object[] {...}" goed overgeschreven uit het MS-voorbeeld, maar is dat niet nodig omdat Invoke een paramarray accepteert. Sowieso zou ik eigenlijk die hele methode SetText weggooien. Wat mij betreft is dat alleen maar onhandig bij het debuggen, en kun je gewoon dit doen: :p
C#:
6
7
8
9
10
11
                double uitkomst = (10000 / 255) * Convert.ToDouble(InputData,
                    System.Globalization.CultureInfo.InvariantCulture);
                BeginInvoke((Action)(() =>
                {
                    lblPotmeter.Text = "Potmeter waarde = " + uitkomst + " ohm";
                }));

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor al jullie reacties. Het lag inderdaad aan de Convert.toDouble Dacht dat ik dat al getest had maar blijkbaar niet |:( . Pedorus met jou code krijg ik dezelfde fout maar dat was te verwachten.

Ik heb zelf nog wat verder geprutst. Lees nu die info af met readByte en zet dit in een double en nu werkt het prima.

Nogmaals bedankt voor jullie reacties.
Pagina: 1