Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

SerialPort vb.net

Pagina: 1
Acties:

  • Willie-wortel
  • Registratie: Mei 2002
  • Laatst online: 13-11 12:01
In vb.net hebben we een SerialPort toegevoegd aan het formulier, nu merken we dat de ontvangen data vertraagd en verlaat binnenkomt!?

Op internet is er vrij weinig over te vinden......

We gebruiken:

code:
1
Private Sub SerialPort1_DataReceived


hierin sturen we alleen de data naar een tekstveldje, af en toe komen er ook rare duizendtallen voorbij!? De decimale waarde kan eigenlijk alleen maar maximaal 255 zijn.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:43
Tja, als je zo weinig info geeft (en ook geen vraag stelt), kunnen we je hier ook maar weinig helpen.

Dus: geef eens wat meer specifieke info. Wat is 'vertraagd & verlaat binnenkomen' ? Heb je de boel al eens gedebugged, en uitgezocht waar het probleem zou kunnen zitten ?

https://fgheysels.github.io/


  • Willie-wortel
  • Registratie: Mei 2002
  • Laatst online: 13-11 12:01
we versturen data met een microcontroller naar de PC op 115200bps. We weten zeker dat deze data goed is (gecontroleerd).

In vb6 lukt dit allemaal makkelijk met MSComm control.

Alleen met vb.net en Serialport krijgen we het volgende probleem:

Met de microcontroller sturen we steeds een decimale waarde oplopend van 1 tot 250, nu zou je verwachten dat we deze ook in het tekstvakje te zien krijgen, dit is wel zo, maar "vertraagd"!

Als we de microcontroller resetten wordt er ook geen data meer in het tekstvak geschreven, laten we de microcontroller hierna weer beginnen zien we weer getallen verschijnen, alleen zou je als eerste getal een 0 verwachten, dit is niet zo!!!!! er volgt eeerst een reeks oude data!?

Het is net of er op een langzame snelheid een buffer wordt geleegd. Ook zien we af en toe die rare duizendtallen.

onze code:

code:
1
2
3
4
5
6
7
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        ontvangen = SerialPort1.ReadChar

        TextBox18.Text = TextBox18.Text & ontvangen & " "

end sub

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Als je met de HyperTerminal verbinding maakt met het apparaat, krijgt je dan ook de informatie vertraagd? En hoe weet je dat de gegevens vertraagt zijn (waar baseer je dat op)?

Uit de MSDN:
The DataReceived event is not gauranteed to be raised for every byte received. Use the BytesToRead property to determine how much data is left to be read in the buffer.
Misschien werkt het beter als je de data uitleest via de ReadByte of ReadLine methode in een loop.

[ Voor 16% gewijzigd door Niemand_Anders op 22-10-2008 11:56 ]

If it isn't broken, fix it until it is..


  • Willie-wortel
  • Registratie: Mei 2002
  • Laatst online: 13-11 12:01
de data komt met hyperterminal of serialwatcher niet vertraagd binnen. We baseren dit op het tekstvakje.

[ Voor 19% gewijzigd door Willie-wortel op 22-10-2008 11:59 ]


  • Willie-wortel
  • Registratie: Mei 2002
  • Laatst online: 13-11 12:01
net even gecontroleerd, wanneer we BytesToRead uitlezen staan er inderdaad meer bytes in de buffer. Wat is nu een goede manier om hiermee om te gaan?

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Je kunt bijv. de Read methode gebruiken om een byte array te vullen. de grootte van die array kun je baseren op de waarde van BytesToRead.

Maar duik eens even in de MSDN. Het uitlezen van een seriele poort is niet heel erg veel anders dan van een stream. En probeer ook eens wat.. Plaats eens een breakpoint op je event en roep eens via de quickwatch enkele verschillende methodes aan.. Programmeren kan ook een avontuur zijn!

If it isn't broken, fix it until it is..


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Niemand_Anders schreef op woensdag 22 oktober 2008 @ 13:01:
Het uitlezen van een seriele poort is niet heel erg veel anders dan van een stream.
Je kan ook de BaseStream property gebruiken en dan heb je gewoon een stream.

[ Voor 37% gewijzigd door Woy op 22-10-2008 14:11 ]

“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.”


  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 15:06
Wat belangrijk is, is dat je ook een /n karakter mee stuurt vanuit de uC. Doe je dit niet, zal de buffer van je RS232 poort op je pc pas later geleegd worden bijvoorbeeld pas als er nieuwe data binnenkomt. Overigens hebben jullie nu wel een vrij hoge bitrate gekozen voor de data overdracht. Als jullie die niet echt nodig hebben is het aan te raden die wat lager te zetten (hoeft niet voor problemen te zorgen, maar kan het wel doen).

  • Willie-wortel
  • Registratie: Mei 2002
  • Laatst online: 13-11 12:01
kan je hier een voorbeeld van geven?

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 15:06
Willie-wortel schreef op woensdag 22 oktober 2008 @ 14:17:
kan je hier een voorbeeld van geven?
Gewoon aan de string die je van de uC naar de PC stuurt '\n' toevoegen. Dit zal waarschijnlijk op het volgende lijken:

printf("%d", waarde);

wat dan het volgende moet worden:

printf("%d\n", waarde);

Het kan ook nog wel eens zijn dat er ook een \r bij moet.

Edit: Zie nu overigens dat je de backslash moet gebruiken voor een escape char, dus \n en \r.

[ Voor 10% gewijzigd door Invisible_man op 22-10-2008 14:26 ]


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 14-11 21:45

voodooless

Sound is no voodoo!

Die \r of \n zorgt er echt niet voor dat de buffer van de seriële poort geleegd gaat worden richting het asynchrone event. Het is wel makkelijker om dit dan met een readline te lezen, maar als dat niet gewenst is, is dat natuurlijk een onnodig iets.

Je kunt dus:
- de leesbuffer kleiner zetten
- waarschijnlijk is er ook een timeout voor het event, zodat het event gevuurd kan worden ook al is de buffer nog niet helemaal vol
- werk synchroon met streams
- ... er is vast nog wel iets anders te verzinnen ;)

Do diamonds shine on the dark side of the moon :?


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:54
Gewoon pollen dus, dat werk tenminste.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 14-11 21:45

voodooless

Sound is no voodoo!

farlane schreef op woensdag 22 oktober 2008 @ 19:23:
Gewoon pollen dus, dat werk tenminste.
Of gewoon een blocking read gebruiken ;)

Do diamonds shine on the dark side of the moon :?

Pagina: 1