Snabb fråga serial.available *KLART*

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Henry
Inlägg: 23623
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Snabb fråga serial.available *KLART*

Inlägg av Henry »

Vill bara ha det bekräftat, så hur fungerar serial.available och då tex i nedan exempel?

Kod: Markera allt

if (Serial.available() > 0) {
}
1. Data läses in vid första bit och sparas i bufferten tills ingen mer data kommer och först då blir ovan kod sann och går vidare.

2. Det blir sant direkt vid första bit oavsett om all data kommit eller ej.

Jag gissar på och hoppas att 1 stämmer?
Senast redigerad av Henry 15 april 2020, 15:05:31, redigerad totalt 1 gång.
svanted
Inlägg: 5084
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Snabb fråga serial.available

Inlägg av svanted »

jag tror på 2...
den blir sann bara det finns 1 bit i bufferten, sen är det upp till koden att läsa den och tömma den.
om den fylls på eller inte spelar ingen roll.

edit:
obs det är inget svar, vill se om jag har rätt bara.
hummel
Inlägg: 2269
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Snabb fråga serial.available

Inlägg av hummel »

Antar att det gäller arduino. Gissar att den blir större än noll när minst en hel byte data finns tillgänglig att hämta.
Användarvisningsbild
Henry
Inlägg: 23623
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Snabb fråga serial.available

Inlägg av Henry »

Arduino ja, tänker då tex en string, många tecken, så vid första tecknet/byten så blir ovan sann och inte efter att allt kommit?
Senast redigerad av Henry 15 april 2020, 12:25:59, redigerad totalt 1 gång.
Shimonu
Inlägg: 295
Blev medlem: 21 oktober 2015, 22:44:33

Re: Snabb fråga serial.available

Inlägg av Shimonu »

Känner mig ganska säker på att det är antingen första byten eller efter en timeout efter att den slutat ta emot något. Man ska inte räkna med att det finns kompletta meddelanden utan man får bygga upp meddelandet själv och verifiera

.
Borre
Inlägg: 4572
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: Snabb fråga serial.available

Inlägg av Borre »

Arduino.cc har bra dokumentation som förklara alla funktioner, så läs här:
https://www.arduino.cc/reference/en/lan ... available/

Speciellt första stycket:
Get the number of bytes (characters) available for reading from the serial port. This is data that’s already arrived and stored in the serial receive buffer (which holds 64 bytes).
Så har en byte hamnat i buffern blir din kod sann, oavsett vad som kommer eller inte kommer senare.
hummel
Inlägg: 2269
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Snabb fråga serial.available

Inlägg av hummel »

Henry skrev:Arduino ja, tänker då tex en string, många tecken, så vid första tecknet/byten så blir ovan sann och inte efter att allt kommit?
Hur skulle den veta när din andra enhet skickat klart meddelandet?
Användarvisningsbild
Henry
Inlägg: 23623
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Snabb fråga serial.available

Inlägg av Henry »

Tja tänkte det kanske var baserat på max storleken på bufferten och den säg var som en array som stegas igenom och lägger vardera bit/byte i vardera steg och när bufferten kommit till sista steget så sätts den först då oavsett om de sista stegen var tomma eller ej.

Men jag läste nyligen att serial.available verkar låsa programmet eller nåt och då förlorar man ju extremt mycket tidmässigt om allt skall sparas först för att sedan ges tillgång till och således finns det då en fullt naturligt förklaring till att det bör vara som 2.

This is data that’s already arrived and stored in the serial receive buffer (which holds 64 bytes).

Jo har sett det men tog det lite som att det var datan som redan sparats i bufferten, alltså all mottagen info.

Men då vet jag, tack boys. :)
Borre
Inlägg: 4572
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: Snabb fråga serial.available

Inlägg av Borre »

Henry skrev:This is data that’s already arrived and stored in the serial receive buffer (which holds 64 bytes).

Jo har sett det men tog det lite som att det var datan som redan sparats i bufferten, alltså all mottagen info.
Ja, det är det.
Tänk dig din vanliga postlåda, stoppa i en liten tomtenisse som när du frågar hinom talar om hur många brev som finns i den.
Frågar du om det finns mer än 0 brev och det ligger ett eller flera brev i postlådan svarar tomtenissen ja på frågan.
Tomtenissen vet inte hur många brev som kommer nästa gång postbilen kommer, bara hur många brev som finns där vid den tidpunkt du frågar honom.
Användarvisningsbild
Henry
Inlägg: 23623
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Snabb fråga serial.available

Inlägg av Henry »

Get the number of bytes (characters) available for reading from the serial port.

Skulle lagt till denna text med i ovan, alltså som jag läste det att alla tecken blivit nedsparade i bufferten och att man därefter kan läsa ut dom, men så är det alltså inte vet jag ju nu.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Snabb fråga serial.available

Inlägg av sodjan »

> så vid första tecknet/byten så blir ovan sann och inte efter att allt kommit?

Vad är "allt"? Och hur 17 ska Arduinon kunna veta vad som är "allt"???

I lite mer avancerade system så kan man ju ha I/O rutiner där man
t.ex. i anropet/läsningen kan ha sätta olika alternativ:
- Man anger en "terminator", d.v.s. att tecken som avslutar läsningen. <CR>, <ETX> eller liknande.
- Man anger en timeout då I/O avslutas, med eller utan data.
- Man anger ett antal tecken som läses in varefter I/O avslutas.
- Man anger att I/O avslutas direkt oavsett om det finns data att hämta eller inte.

Men i en Arduino så är det mer att du kan fråga "finns det någonting alls?" och
om det gör det så kan du hämta det. Men du vet inte om det var "allt" förrns
du med hjälp av rutiner i din egen kod har tittat på det du fick tillbaka.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Snabb fråga serial.available

Inlägg av sodjan »

> alltså som jag läste det att alla tecken blivit nedsparade i bufferten och att man därefter kan läsa ut dom,

Jo, så är det sannolikt, om serial.available ger ett antal tillbaka.
Men Arduinon kan ju inte veta om det är "allt", bara hur mycket den har i bufferten just nu.

Det är definitionen av begreppet "allt" som du hakar upp dig på... :-) Hur definieras det?
Användarvisningsbild
rvl
Inlägg: 5806
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Snabb fråga serial.available

Inlägg av rvl »

Första inlägget talade om bit och inte byte, på den nivån har processorn koll på om "allt" för en byte kommit och bygger upp byten i en intern buffer innan den går vidare till den 64 byte långa buffern, vars fyllnadsgrad man kan fråga.
Användarvisningsbild
Henry
Inlägg: 23623
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Snabb fråga serial.available

Inlägg av Henry »

Användandet av bit var mer bara en tanke för att visa på minsta mängd info, men intressant det där.

Sodjan: tänkte innan att om tex bufferten alltid blivit full på ett eller annat sätt oavsett om det så bara var en bit och inte bara för att just datan var inhämtad, som den ju som sagt inte kan veta, och således då först satt sant efter det vilket i så fall varit baserat på baudraten.

Men som jag skrev så vet jag nu att den inte funkar på det viset utan att den funkar så att "nu har första biten av infon kommit av vad som än är på väg, så du vet, men om det är allt eller inte har jag inte den blekaste om jag bara tar emot".

Jo det finns absolut olika varianter, har satt det så att så fort data detekterats väntar den några få ms så garanterat allt sparats ned. Sedan en timeout på säg en 10 ms vilket gör att bufferten raderas efteråt så inget är kvar till nästa gång. Nej det är inte direkt tidskritiska grejer.
hummel
Inlägg: 2269
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Snabb fråga serial.available

Inlägg av hummel »

Minsta mängd data är fortfarande en byte med den diskuterade funktionen. Det kommer röra till det om du forsätter med bit. En seriell kommunikation består oftast av startbit, data bitar och paritetsbitar för varje mottagen byte du kan läsa med funktionen.
Skriv svar