Ad
Varmvattenberedare från Indol
Bäst online casino i Sverige
Energibutiken.se smarta varor på nätet, leverans till dörren
Annonsera i Värmepumpsforum, klicka här för att ställa e-postfråga och få mer info.
140x140vpforum-11.gif
kontakta oss för pris!
 

Författare Ämne: Läsa COM-port i C (FreeBSD & gcc)  (läst 2045 gånger)

0 medlemmar och 1 gäst tittar på detta ämne.

Utloggad Alexander Pettersson

  • Expert på värmepump
  • ****
  • Stad/land: Örebro
  • Antal inlägg: 334
  • Karma +0/-0
  • Kön: Man
  • KISS Keep It Simple Stupid!
    • VP-Dygn
Läsa COM-port i C (FreeBSD & gcc)
« skrivet: 17 september 2010, 13:09:41 »
Behöver hjälp med att förstå ett par rader C-kod  :)
Försöker läsa in en sträng tex "+18\n\r" från en COM port.
Problemet är att jag får inte med sista tecknet \r
Vilket resulterar i att nedanstående kod hänger sig.

Triggar jag på näst sista tecknet som kommer in på COM-porten dvs \n.
Då rullar det vidare men nästa gång jag läser av porten kommer det ett \r först..

char buffer[255];  /* Input buffer */
char *bufptr;      /* Current char in buffer */
int  nbytes;       /* Number of bytes read */

Bla bla bla mycket kod. Sedan.

/* read characters into our string buffer until we get a NL */
bufptr = buffer;
while ((nbytes = read(fd, bufptr, buffer + sizeof(buffer) - bufptr - 1)) > 0)
{
      bufptr += nbytes;
      if ( bufptr[-1] == '\r')
            break;
}

Alla förslag, tips och idéer mottages! Även glada tillrop!  :)
/Nibe 1110-4, 500L VVB 2-kammrör, ytjord 200m lera, VV-cirk, lågtempradiatorer och golvvärme. 8 000kWh/år. Lite hushållsel.

Utloggad purjo__

  • Jag har i princip doktorerat på Bosch/IVT Rego800 och CanBus.
  • Guldmedlem
  • Dignitär inom värmepump
  • ******
  • Stad/land: Gävleborg
  • Antal inlägg: 13217
  • Karma +21/-11
  • Kön: Man
  • Utbildad elektroingenjör. Arbetar inom IT
SV: Läsa COM-port i C (FreeBSD & gcc)
« Svar #1 skrivet: 17 september 2010, 13:32:40 »
read läser ju och fyller hela bufferten på en gång, eller till EOF. därför skall du väl inte ha read'en i while-loopen. Räcker det inte att göra så här?

Kodstycke: [Välj]
nbytes = read(fd, bufptr, sizeof(buffer);
Då får du hela textsträngen i buffer med EOF på slutet och hela loopen blir överflödig.

Din loop skulle iofs funka om du talade om för read att läsa ett tecken i taget:
Citera
while ((nbytes = read(fd, bufptr, 1)) > 0)
men det känns bara onödigt komplicerat...
Bor i pastorsvillan tillhörande ett gammalt missionshus
Villan: Timmerhus byggt 1878. 1.5  plan, bya 100 / boa 160 kvadrat, 2-glasfönster, självdragsventilation. Vattenburen värme med elpanna + braskamin. Förbrukning ca 35MWh + en mindre mängd ved.
Kyrkan: Timmerstomme, bya 300 / boa 490 kvadrat, 78 kvadrat 1-glasfönster med innerbågar... Byggt 1876. Direktverkande el på 45kW. Förbrukning ca 5MWh för att hålla frostfritt på toaletten och köket samt tvättmaskin.
Gävleborg.


Ju mer man vet desto mindre förstår man.

Utloggad Alexander Pettersson

  • Expert på värmepump
  • ****
  • Stad/land: Örebro
  • Antal inlägg: 334
  • Karma +0/-0
  • Kön: Man
  • KISS Keep It Simple Stupid!
    • VP-Dygn
SV: Läsa COM-port i C (FreeBSD & gcc)
« Svar #2 skrivet: 17 september 2010, 17:33:25 »
Jag var nog lite otydlig. fd är en COM-port och inte en fil (så en EOF lär ju inte komma. eller?).

Jag kör i raw mode med en read-timeout (VTIME) på en sec.

Efter lite tester visade det sig att
Kodstycke: [Välj]
nbytes = read(fd, bufptr, sizeof(buffer);Fungerade utmärkt MEN det blir fortfarande något tecken kvar!?

Om jag läser igen en extra gång efteråt och slänger datat så är COM-porten tom.

Hmm kan det vara så att read läser tills den hittar \n eller \r?
Iom att båda kommer så måste jag köra read två ggr och andra gången finns då bara \r.. Hmm låter logiskt.

Kan nog leva med det.. (roligt när svaren mognar undertiden man skriver..)

 Thumbsup Så tusen tack för svaret! :)
/Nibe 1110-4, 500L VVB 2-kammrör, ytjord 200m lera, VV-cirk, lågtempradiatorer och golvvärme. 8 000kWh/år. Lite hushållsel.

Utloggad purjo__

  • Jag har i princip doktorerat på Bosch/IVT Rego800 och CanBus.
  • Guldmedlem
  • Dignitär inom värmepump
  • ******
  • Stad/land: Gävleborg
  • Antal inlägg: 13217
  • Karma +21/-11
  • Kön: Man
  • Utbildad elektroingenjör. Arbetar inom IT
SV: Läsa COM-port i C (FreeBSD & gcc)
« Svar #3 skrivet: 17 september 2010, 17:52:34 »
Rent spontant känns det som att 'read' läser till EOF eller full buffert medans 'readline' läser till newline (/n)... Men, det var ett tag sen jag hackade C...
Bor i pastorsvillan tillhörande ett gammalt missionshus
Villan: Timmerhus byggt 1878. 1.5  plan, bya 100 / boa 160 kvadrat, 2-glasfönster, självdragsventilation. Vattenburen värme med elpanna + braskamin. Förbrukning ca 35MWh + en mindre mängd ved.
Kyrkan: Timmerstomme, bya 300 / boa 490 kvadrat, 78 kvadrat 1-glasfönster med innerbågar... Byggt 1876. Direktverkande el på 45kW. Förbrukning ca 5MWh för att hålla frostfritt på toaletten och köket samt tvättmaskin.
Gävleborg.


Ju mer man vet desto mindre förstår man.

Utloggad purjo__

  • Jag har i princip doktorerat på Bosch/IVT Rego800 och CanBus.
  • Guldmedlem
  • Dignitär inom värmepump
  • ******
  • Stad/land: Gävleborg
  • Antal inlägg: 13217
  • Karma +21/-11
  • Kön: Man
  • Utbildad elektroingenjör. Arbetar inom IT
SV: Läsa COM-port i C (FreeBSD & gcc)
« Svar #4 skrivet: 17 september 2010, 21:16:32 »
'getline' menade jag såklart. Man skall inte tänka på sånt här när man står med frugan på H&M's sminkavdelning...  :D

Spelar det nån roll om du får med /r eller inte? Det tecknet ställer ju bara till det om man inte kör Windows... Eller är det för att det inte skall ligga kvar och störa nästa läsning?
« Senast ändrad: 17 september 2010, 21:20:50 av purjo__ »
Bor i pastorsvillan tillhörande ett gammalt missionshus
Villan: Timmerhus byggt 1878. 1.5  plan, bya 100 / boa 160 kvadrat, 2-glasfönster, självdragsventilation. Vattenburen värme med elpanna + braskamin. Förbrukning ca 35MWh + en mindre mängd ved.
Kyrkan: Timmerstomme, bya 300 / boa 490 kvadrat, 78 kvadrat 1-glasfönster med innerbågar... Byggt 1876. Direktverkande el på 45kW. Förbrukning ca 5MWh för att hålla frostfritt på toaletten och köket samt tvättmaskin.
Gävleborg.


Ju mer man vet desto mindre förstår man.

Utloggad Alexander Pettersson

  • Expert på värmepump
  • ****
  • Stad/land: Örebro
  • Antal inlägg: 334
  • Karma +0/-0
  • Kön: Man
  • KISS Keep It Simple Stupid!
    • VP-Dygn
SV: Läsa COM-port i C (FreeBSD & gcc)
« Svar #5 skrivet: 19 oktober 2010, 15:34:49 »
Tusen tack för hjälpen..

Jag har fått till det :-)

Ja det låg kvar och störde nästa läsning.. Men det var konsekvent så jag fick göra en extra 'blindläsning'.

/A
/Nibe 1110-4, 500L VVB 2-kammrör, ytjord 200m lera, VV-cirk, lågtempradiatorer och golvvärme. 8 000kWh/år. Lite hushållsel.

Vill du annonsera klicka här! Varmvattenberedare från Indol
 


Annonser

Right Block

Vibrationsdämpare
Besök vår webshop, klicka här!
Energioffert.se
Energibutiken.se smarta varor på nätet, leverans till dörren
luftvärmepumpar, tillbehör, installationsmaterial, vi har allt!
Annonspriser

Online just nu!

Ad
Varmvattenberedare från Indol
Bäst online casino i Sverige
Energibutiken.se smarta varor på nätet, leverans till dörren
Annonsera i Värmepumpsforum, klicka här för att ställa e-postfråga och få mer info.
140x140vpforum-11.gif
kontakta oss för pris!