Konstigt värde när jag skickar från uC till PC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
svanted
Inlägg: 5280
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av svanted »

Al_Bundy skrev:
Klas-Kenny skrev:
Al_Bundy skrev:Du gillar verkligen att kasta skit på min kod utan ens har sett den :P
Då får du väl ta och visa upp lite kod då, så folk slipper sitta och gissa..

Miramithe skrev:Fullt förståeligt när icecap flera ggr försökt hjälpa och påpekat fel som du avfärdar eller skiter helt i. Skit ska skit ha heter det.
Han säger bara "Dålig programmering". Hade jag varit lärare så hade det blivit ett IG direkt på en sådan kommentar. :wink:
Icecap skrev: Al: nej, det gör jag inte!
Och det behövs ju inte, du klarar det helt själv, gång efter gång!

Du har fått råd, du avfärder dom och du hade två möjligheter till varför fenomenet uppstår. Du förkastar den ena orsak, alltså kvarstår det bara den andra, så enkelt är det!

Och mina råd är inte för skoj skull, de är baserat på många års erfarenhet i alla möjliga tänkbara sammanhang.
Men du vet ju bättre än alla andra - i vanlig ordning - och då är det ju konstigt att du väldigt ofta inte förstår vad som går fel, inte kan analysera dig fram till det och samtidig vägrar ta råd och lära dig.

I de senaste par dagar haf jag suttit med kommunikation över serielänk - och det har varit en del knas på vägen. Men jag har löst dom steg för steg, analyserat vad som gick och inte gick och nu anser jag att den krypterade kommunikation jag har mellan 5 trådlösa enheter är på god gång. Och ja, det tar tid, det har tagit tid att planera protokollet, krypteringen, hur värden ska överföras osv. men då det jobb var klart var resten ganska enkelt.

Men om du får värdet 47 utan någon specifik orsak är det antingen fel på hårdvaran eller på programmet. Motbevisa det gärna, jag skulle uppskatta att lära något nytt.

Men om ditt "försvar" är att klaga på att jag påpekar det självklara ställer du dig själv i ett riktigt dåligt ljus.
Om du tar och kollar denna kod-del.
PC:n skickar en sträng som ser ut t.ex. "344;345;563;35;34;" och koden delar upp detta till olika delar. Men PC:n vill veta om processorn har fått rätt kod så processorn skickar tillbaka "344;345;563;35;34;" men istället blir det bara....47. Vi har haft en lärare som har hittat på vårt projekt och även han (mycket erfaren PIC-programmerare) förstår inte heller. Han tror att det har något med buffert att göra. Men att det fungerar många gånger förutom fåtal så står han även med frågetecken.

Kod: Markera allt

 static void get_values_from_flik_5()
      {
        int a = 0;
        String text;
        while (a == 0)
        {
          if(Serial.available() > 0)
          {
            text = Serial.readString();
            int firstcolon = text.indexOf(';');
            int secondcolon = text.indexOf(';', firstcolon+1);
            int thirdcolon = text.indexOf(';', secondcolon+1);
            int fourthcolon = text.indexOf(';', thirdcolon+1);
            int firthcolon = text.indexOf(';', fourthcolon+1);
            PHbor = string_to_float(text.substring(0, firstcolon));
            K = string_to_float(text.substring(firstcolon+1, secondcolon));
            Td = string_to_float(text.substring(secondcolon+1, thirdcolon));
            Ti = string_to_float(text.substring(thirdcolon+1, fourthcolon));
            MAX = string_to_float(text.substring(fourthcolon+1, firthcolon));
            Serial.flush();
            Serial.print(PHbor);
            Serial.print(";");
            Serial.print(K);
            Serial.print(";");
            Serial.print(Td);
            Serial.print(";");
            Serial.print(Ti);
            Serial.print(";");
            Serial.print(MAX);
            Serial.print("#");
            Serial.flush();            
            a = 1;                                                                 // Breake loop
          }
        }
      }


Serial.readString och serial.flush måste synkas med inkommade data på NGT sätt
hur kan du fundera på...
om du INTE gör det,
både läser och raderar du inkommet data utan att du vet att det inte är mitt i en överföring...
det har flera redan sagt man jag gör det ändå....
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av Al_Bundy »

Vi löste detta med enkelt protokoll.

Om uC skickar ett fel värde, då ignorerar datorn detta. :)

Om ni undrar alltså.
Användarvisningsbild
carpelux
Inlägg: 1959
Blev medlem: 13 oktober 2007, 12:33:33
Ort: Varnhem

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av carpelux »

Aha, ni kör med SiSu (Skit in, skit ut)
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av Icecap »

Al: en fråga bara.
Det är ju klarlagt att ni inte verkar ha klart för er var ett kommunikationsprotokoll är - och det är väl OK som sådan.
Men vad ville ni uppnå vid att skicka tillbaka värden till sändare?
Ett enkelt förslag:
Det ska skickas 3 olika värden i en sträng (helt OK sätt att göra det på!)
De separeras med något tecken, t.ex. komma (fortfarande väldigt OK)

Tänk om ni hade ett protokoll där det var 4 värden som blev skickad och det sista värde var summan av de 3 övriga.
Då kunde mottagaren enkelt klura ut om strängen höll måttet och omvandla text till värde kan ni ju bevisligen.

Och om strängen var OK kunde mottagaren skicka en ACK (Acknowledge, 0x06, std. ASCII ACK), var den fel kunde mottagaren istället sända NACK (Not Acknowledge, 0x15, std. ASCII NACK). Alltså en enda byte.

När det kom en ACK (en enda byte) kunde Arduinon skicka nästa klump när den var klar och vid NACK skickade den igen, dock max 3 gg eller så.

På detta vis hade ni koll i båda ändar om det gick bra.

Och ja, jag vet att ni föredrar SiSu - men jag försöker förklara hur det kan fungera så att du kan göra något vettigt vid framtida uppdrag.
Senast redigerad av Icecap 6 december 2014, 14:40:20, redigerad totalt 1 gång.
Användarvisningsbild
SeniorLemuren
Inlägg: 8426
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av SeniorLemuren »

Al_Bundy skrev:Vi löste detta med enkelt protokoll.

Om uC skickar ett fel värde, då ignorerar datorn detta. :)

Om ni undrar alltså.
Hur kollar ni att det skickade värdet som kommer fram är rätt? Använder ni LRC eller CRC eller vad?
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av Al_Bundy »

Med tanke på att min andra grupp som jag jobbar mot, kan inte ta emot ASCII värden så jag skickar strängar "" så dem får omvanlda till floats.

Vi har dock inte löst varför det blir 47 ibland. Men vi har infört ett protokoll som använder sizeoff.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av Al_Bundy »

Icecap skrev:Al: en fråga bara.
Det är ju klarlagt att ni inte verkar ha klart för er var ett kommunikationsprotokoll är - och det är väl OK som sådan.
Men vad ville ni uppnå vid att skicka tillbaka värden till sändare?
Ett enkelt förslag:
Det ska skickas 3 olika värden i en sträng (helt OK sätt att göra det på!)
De separeras med något tecken, t.ex. komma (fortfarande väldigt OK)
Att bekräfta som ett kvitto. Men vi sket i det.
Ja. vi separerar med ";".
Tänk om ni hade ett protokoll där det var 4 värden som blev skickad och det sista värde var summan av de 3 övriga.
Då kunde mottagaren enkelt klura ut om strängen höll måttet och omvandla text till värde kan ni ju bevisligen.

Och om strängen var OK kunde mottagaren skicka en ACK (Acknowledge, 0x06, std. ASCII ACK), var den fel kunde mottagaren istället sända NACK (Not Acknowledge, 0x15, std. ASCII NACK). Alltså en enda byte.
Nu använder vi inte oss av ASCII. Den andra gruppen kunde inte det via LabView. Men vi löste det ändå. Eller vi och vi. Den andra gruppen löste det.
Och ja, jag vet att ni föredrar SiSu - men jag försöker förklara hur det kan fungera så att du kan göra något vettigt vid framtida uppdrag.
Yes! SiSu! Precis som skolgången!

Yes. Men som sagt så kunde inte LabView hantera ASCII eller ha någon bra kommuniaktion över hufvudtaget.
LabView måste ta mig fan vara det sämsta att ha kommuniaktion med över USB. Segt, kan lätt få störningar osv. NEJ, vi KÖPTE verkligen LabView för typ 16 tusen kronor.

Jag föredrar hellre typ Microsoft .NET platform istället t.e.x C#, C++.NET eller VB.NET. Så mycket bättre då man har mer kontroll.
Mr Andersson
Inlägg: 1409
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av Mr Andersson »

Ni skickar strängar som inte är ASCII? Intressant, vad har ni då för kodning? UTF-8/16?
jako
Inlägg: 337
Blev medlem: 26 oktober 2006, 18:32:35
Ort: Sandviken

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av jako »

Tycker det är lite taskigt med oerfarna programmerare som kastar skit på LabView. Lär er dataflödesprogrammering ordentligt och försök igen sedan.

Där jag jobbar har vi använt LV sedan mitten av 90-talet och javisst i början tycker man det är skit men när man förstått språkets uppbyggnad så fungerar det mesta riktigt bra. Har ni pratat med supporten om era problem, de brukar vara mycket hjälpsamma.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av Al_Bundy »

Mr Andersson skrev:Ni skickar strängar som inte är ASCII? Intressant, vad har ni då för kodning? UTF-8/16?
Vi skickade bara strängar t..ex "34". Jag ville skicka i ASCII, men andra gruppen kunde inte/visste inte hur man kunde omvandla ASCII till ett tal som man själv kan uppfatta som ett riktigt tal. Så jag fick anpassa mig.
jako skrev:Tycker det är lite taskigt med oerfarna programmerare som kastar skit på LabView. Lär er dataflödesprogrammering ordentligt och försök igen sedan.

Där jag jobbar har vi använt LV sedan mitten av 90-talet och javisst i början tycker man det är skit men när man förstått språkets uppbyggnad så fungerar det mesta riktigt bra. Har ni pratat med supporten om era problem, de brukar vara mycket hjälpsamma.
Jag förespråkade att vi skulle använda oss av .NET för att utveckla programmet då man har mer koll på koden jämfört med LV.
LabView är bra, men vi har haft otroligt mycket problem med det.

Annars så fungerade ATmega som jag programmerade med arduino hur bra som helst! :tumupp:
Men jag har insett nu att serial kommunikation är ganska svårt.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av Icecap »

"Vi skickade bara strängar t..ex "34". Jag ville skicka i ASCII, men andra gruppen kunde inte/visste inte hur man kunde omvandla ASCII till ett tal som man själv kan uppfatta som ett riktigt tal. Så jag fick anpassa mig."

OK - men det är ju ASCII... :doh:

Värden blir skicka i textformat - men det klarar ni/dom inte av?

I vanlig ordning känns det tydligt att du inte riktigt har koll på något vidare alls.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av Al_Bundy »

Jag har koll.
Men om jag skulle t.ex. skicka som vanligt, dvs INTE strängar så kunde den andra gruppen inte ta emot dessa. Jag vet inte, men jag fick anpassa mig.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av Icecap »

"Som vanligt" och "INTE strängar" hänger inte riktigt ihop.

För mig är ung. 95% av alla projekt med seriell kommunikation strängbaserat så vad du räknar för "vanligt" kan jag inte riktigt sätta mig in i.

En möjlighet är ju att du bara sprutar ut bytes - men det är ju inget protokoll som sådan och ger bara möjlighet för att överföra ett värde i form av en byte.

Att göra ett protokoll som överför valfri storlek på block binärt är inte svårt - men det är så förbenat tungt att "sniffa" och se om det blir fel varför ASCII-överföring är det definitivt mest vanliga i min värld. Man jag har gjort det och det är mer effektivt om man ser till hastigheten.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av jesse »

Al_Bundy skrev:Jag har koll.
Men om jag skulle t.ex. skicka som vanligt, dvs INTE strängar så kunde den andra gruppen inte ta emot dessa. Jag vet inte, men jag fick anpassa mig.
Har du koll?

Vad betyder t.ex. "skicka som vanligt"?
Vad är en sträng? Vad innehåller den?
Vad är ett ASCII-tecken?

Eftersom du blandar ihop begreppen så vet varken du eller nån annan vad du egentligen skickar för nåt. Inte konstigt då om det blir svårt att ta emot. Försök för en gång skull göra något genomtänkt och systematiskt. Skriv ner ditt kommunikationsprotokoll på ett begripligt sätt.

Hur börjar meddelandet?
Vad innehåller meddelandet?
Hur avslutas meddelandet?
Det är helt OK att skicka data som strängar, det är ett väldigt vanligt sätt att skicka data på. Men vad är början och slutet på din sträng?
Anta att du ska skicka en sträng med tre siffror "123" som då betyder talet 123. Du skickar det om och om igen.
Den mottagande datorn ser då: "123123123123123123123123123123123123123123123123123....."(i evighet). Var börjar den och var slutar den?
Därför skickar du till exempel tecknet för ny rad <LF>. Eftersom du vet vad ASCII är så vet du att LF är detsamma som 0x0A, eller i C-kod som char '\n'
Den mottagande datorn kommer då att se
123
123
123
123
123
123
123
123
Vill du inte använda mystiska tecken som '\n' så går det lika bra med kommatecken... då blir det
123,123,123,123,123,123,123,123,123

Ska du skicka tre olika data varje gång så kan du använda komma mellan alen och ett '\n' efter sista talet. Då får du
123,456,789
123,456,789
123,456,789
123,456,789
123,456,789

och det går lätt att skilja talen åt.

Om du nu separerar talen med ; (vilket är utmärkt) så hur ser dina strängar ut som du skickar?
Användarvisningsbild
Glenn
Inlägg: 36722
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: Konstigt värde när jag skickar från uC till PC

Inlägg av Glenn »

Al_Bundy skrev: Yes. Men som sagt så kunde inte LabView hantera ASCII eller ha någon bra kommuniaktion över hufvudtaget.
LabView måste ta mig fan vara det sämsta att ha kommuniaktion med över USB. Segt, kan lätt få störningar osv. NEJ, vi KÖPTE verkligen LabView för typ 16 tusen kronor.
Var det inte ett skolprojekt ? INGEN svensk högskola lär betala de summorna för labview, antingen betalar man grovt rabatterade EDU-priser för enstaka installationer, eller så betalar man för en ganska billig sitelicens.

Dessutom kan man som privatperson eller företag kvittera ut en tidsbegränsad testlicens gratis om man vill testa nåt.
Skriv svar