Sida 1 av 3

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

Postat: 27 november 2014, 18:12:29
av Al_Bundy
Hej!

Under en lång tid mellan seriell kommunikation mellan uC och PC så har jag fått värdet 47 tillbaka från uC till PC.
Exempelvis så skickar jag ett värde, ett stort och långt värde i form av textsträng och massa andra värden där i textsträngen.

Min uC kapar upp denna textsträng och sedan delar in dessa i variabler, som konverteras till float.
Men jag tänker skicka tillbaka dessa variabler till min PC för att bekräfta att jag har fått rätt värden.

Men ibland får jag bara värdet 47 tillbaka. :| Helt random.
Men oftast så fungerar det :) Vi har löst problemet igenom att den kollar om den har fått rätt värden. Om inte => skicka igen.

Vad brukar detta bero på?

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

Postat: 27 november 2014, 18:18:43
av sodjan
"47", är det decimal eller som hex?
Hur ofta är "ibland"?
1 gång av 2?
1 gång av 100?
Mer sällan?

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

Postat: 27 november 2014, 18:31:17
av Icecap
"Vad brukar detta bero på?"
Först och främst: Dåligt kommunikationsprotokoll!
Därnäst: Dålig programmering.

Ett bra protokoll bör vara uppbyggd så att det finns en entydig startsekvens och en entydig stoppsekvens.
Däremellan kommer data samt en checksumma.

Checksumman kan t.ex. vara en addition av alla bytes i data-delen, det kan vara en XOR av dom eller annat man kan hitta på. Självklart kan man köra med CRC18 eller CRC32 men det kan kännas lite överkurs.

Jag brukar skiva värden som siffror, alltså ville värdet 47 bli skickat som '4' (0x34) och därefter '7' (0x37). Checksumman ville då bli 0x34 + 0x37 = 0x6B och den hade jag skickat som 2 siffror i HEX.

Oftast inleder jag ett block med STX (0x02) och avslutar med ETX (0x03).

I protokollet bör det vara definierat om ett block som godtas ska ha en acknowledge tillbaka eller om det bara ska kastas av mottagaren. Har man ett kommunikationsförfarande som begär värdet och får svar kan den då bara begära värdet igen om det blev fel på vägen.

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

Postat: 27 november 2014, 18:33:06
av Al_Bundy
sodjan skrev:"47", är det decimal eller som hex?
Hur ofta är "ibland"?
1 gång av 2?
1 gång av 100?
Mer sällan?
"47\r\n" står det.

Ibland: 1 av 7 gånger.

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

Postat: 27 november 2014, 18:34:58
av Al_Bundy
Icecap skrev:"Vad brukar detta bero på?"
Först och främst: Dåligt kommunikationsprotokoll!
Därnäst: Dålig programmering.

Ett bra protokoll bör vara uppbyggd så att det finns en entydig startsekvens och en entydig stoppsekvens.
Däremellan kommer data samt en checksumma.

Checksumman kan t.ex. vara en addition av alla bytes i data-delen, det kan vara en XOR av dom eller annat man kan hitta på. Självklart kan man köra med CRC18 eller CRC32 men det kan kännas lite överkurs.

Jag brukar skiva värden som siffror, alltså ville värdet 47 bli skickat som '4' (0x34) och därefter '7' (0x37). Checksumman ville då bli 0x34 + 0x37 = 0x6B och den hade jag skickat som 2 siffror i HEX.

Oftast inleder jag ett block med STX (0x02) och avslutar med ETX (0x03).

I protokollet bör det vara definierat om ett block som godtas ska ha en acknowledge tillbaka eller om det bara ska kastas av mottagaren. Har man ett kommunikationsförfarande som begär värdet och får svar kan den då bara begära värdet igen om det blev fel på vägen.
Vi har löst problemet igenom att man läser resultatet som man har skickat. Då kan man avgöra om det är bra eller inte.

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

Postat: 27 november 2014, 18:35:56
av Icecap
Då kvarstår dålig programmering.

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

Postat: 27 november 2014, 18:39:47
av Al_Bundy
Du gillar verkligen att kasta skit på min kod utan ens har sett den :P

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

Postat: 27 november 2014, 18:41:36
av sodjan
> "47\r\n" står det.

Står vardå?

Är det alltså texten "47" eller värdet 47 ?

Men tja, någonstans ifrån kommer det ju... :-)

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

Postat: 27 november 2014, 18:42:10
av Klas-Kenny
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..

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

Postat: 27 november 2014, 19:01:28
av Miramithe
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.

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

Postat: 27 november 2014, 19:18:42
av Icecap
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.

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

Postat: 27 november 2014, 19:50:29
av Al_Bundy
sodjan skrev:> "47\r\n" står det.

Står vardå?

Är det alltså texten "47" eller värdet 47 ?

Men tja, någonstans ifrån kommer det ju... :-)
Texten blir det.
Men det är så klart ett värde. När jag skickar ett värde blir det en sträng.

Mystisk gåta. Precis som filmen 47.

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

Postat: 27 november 2014, 19:55:03
av Agwan
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.
Så var det ju inte riktigt. Icecap började ju med att slänga ur sig några förolämpningar vilket ju är perfekt om man vill att den som ställt frågan skall hamna i en sinnesstämning som inte passar för att ta emot efterkommande information, sedan svarade han på en fråga som inte ställts. Han såg ut att svara på frågan hur ett bra protokoll bör vara uppbyggt, inte på om det fanns någon anledning till att just siffran 47 eller möjligen någon annan konstant siffra skulle returneras. Icecaps svar "Då kvarstår dålig programmering." kan ju inte direkt ses som konstruktivt.

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

Postat: 27 november 2014, 19:56:51
av Al_Bundy
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
          }
        }
      }

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

Postat: 27 november 2014, 20:05:40
av Miramithe
Agwan skrev:
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.
Så var det ju inte riktigt. Icecap började ju med att slänga ur sig några förolämpningar vilket ju är perfekt om man vill att den som ställt frågan skall hamna i en sinnesstämning som inte passar för att ta emot efterkommande information, sedan svarade han på en fråga som inte ställts. Han såg ut att svara på frågan hur ett bra protokoll bör vara uppbyggt, inte på om det fanns någon anledning till att just siffran 47 eller möjligen någon annan konstant siffra skulle returneras. Icecaps svar "Då kvarstår dålig programmering." kan ju inte direkt ses som konstruktivt.
Nu syftar jag på trådar tidigare, där vid olika tillfällen al vill ha hjälp men behandlar många av svaren som skit och förkastar de eller helt enkelt inte läser dom förstår icecap helt och hållet.