Kommunikationsprotokoll exvis. över CANbus, EIA485 osv.

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Kommunikationsprotokoll, CANbus, över EIA485 osv.

Inlägg av blueint »

Klassiskt misstag:

Kod: Markera allt

int ch;
ch = 'ä';
printf("0x%X\n", ch );
ch är en 32-bit signed. Som ges värdet av 'ä' vilket uppfattas som negativt. Det fyller resten av 32-bits mängden till "1". När sedan resultatet skall skrivas är pannkakan fullbordad.

Korrekt metod:

Kod: Markera allt

unsigned char ch;
ch = 'ä';
printf("0x%02X\n", (int)ch );
Användarvisningsbild
toffie
Inlägg: 1922
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

Re: Kommunikationsprotokoll, CANbus, över EIA485 osv.

Inlägg av toffie »

Haha, lugn nu sodjan! :P
När blueint svarade på tråden 12:27 så fick jag det i mobilen, för jag hade redan gått ut. Men jag tänkte att jag skulle ta en titt på det och läsa lite om hur det fungerade med signed och unsigned.

För integer så kan man ju göra uint exempelvis och de gör väl så man bara kan ha värden från noll och uppåt, en längre bit än om man har signed int vilket gör att det går mindre åt positiva hållet men lika långt åt negativa hållet. Jag glömmer bort mig med dem, men har för mig att det var så.

I övrigt, jo jag såg ju det, men hade ingen direkt aning om varför, jag tänkte mest att det kanske skulle vara så. Jag utökade inte från 8 till 16 bitars visning, den kod jag har vägrar visa endast åtta bitar :P Det är kod som jag haft ett tag och inte har någon aning om vart jag fick den ifrån. Jag försökte ändra om det i funktionen men fick bara de två mellersta grupperna om 4 att visas istället för de två sista åt höger. Hur som helst, så just den biten har jag inte skrivit, men jag har haft den i gömmorna rätt länge.

Ska testa ändringen nu, så får vi se vad som händer :D Tack blueint!
sodjan
EF Sponsor
Inlägg: 43289
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Kommunikationsprotokoll, CANbus, över EIA485 osv.

Inlägg av sodjan »

Man använder aldrig signed till variabler som enbart ska innehålla "text".
Användarvisningsbild
toffie
Inlägg: 1922
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

Re: Kommunikationsprotokoll, CANbus, över EIA485 osv.

Inlägg av toffie »

När du säger det så kommer jag ihåg det, har inte programmerat C på länge. Känner mig väldigt rostig plus att jag kan ju givetvis inte super mycket. För något år sen däremot kunde jag en hel del och höll på med ett program liknande spelserver och klienter.

Det var superskoj med mysql koppling och allt möjligt :P Kommer inte ihåg mycket av det dock :(


Hur som helst, en uppdatering av programmet!
Bild

Nu har jag lyckats fixa så endast 8-bitar visas av det binära, samt att jag stuvat om lite i koden. Använder även unsigned char på input variabeln så nu fungerar ÅÄÖ samt övriga tecken som de ska i 8-bitar :P

Laddas ner här nu!
Användarvisningsbild
jesse
Inlägg: 9241
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Kommunikationsprotokoll, CANbus, över EIA485 osv.

Inlägg av jesse »

sodjan skrev:Man använder aldrig signed till variabler som enbart ska innehålla "text".
Det är ju lite lustigt, egentligen, eftersom "strängar" i C består av arrayer med char, som just är signed. Annars får man definiera dem som unsigned char. Själv har jag gjort så (för AVR) att jag använder typen uint8_t istället för char.

BIT är vad du är intresserad av. Var är det du ska läsa av bitarna? Skickar du data från din PC till en AVR som ska tolka bitarna eller är det tvärt om?

När man tolkar bitar i en AVR kan man göra på många sätt. Skriver du i C kan du t.ex. göra så här:

Kod: Markera allt

uint8_t byte = 0b00110010;

#define BIT0 1
#define BIT1 2
#define BIT2 4
#define BIT3 8
#define BIT4 16
#define BIT5 32
#define BIT6 64
#define BIT7 128

#define check_bit(byte,bit) (byte and bit)

//senare i programmet vill du veta om BIT4 är satt:

if (check_bit(byte, BIT4)) {
    // Gör något
}
Givetvis döper du bitarna till det de ska vara till, istället för BIT0, BIT1 etc:

Kod: Markera allt

uint8_t controlbits = 0b00001000;

#define MOTOR_ON 1
#define TEMP_HIGH 2
#define STOP_ALL 4

if (check_bit(controlbits, MOTOR_ON) {
    stoppa_motor();
}
sodjan
EF Sponsor
Inlägg: 43289
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Kommunikationsprotokoll exvis. över CANbus, EIA485 osv.

Inlägg av sodjan »

> eftersom "strängar" i C består av arrayer med char, som just är signed.

Och "char" är ju ett lite korkat namn, eftersom det i praktiken betyder "byte" och
inte "tecken". Och dessutom är det inte säkert att ett "tecken" är just 8 bitar idag... :-)
Dessutom, om nu char från början var tänkt till just "tecken/text" så hade ju unsigned
varit ett bättre default läge. Men å andra sidan så har ju många "over there"
lite svårt att tänka längre än till 7 bitar. :-)

Mycket strul hade undvikits om C hade haft en färdig/separat datatyp för text/strängar.
Användarvisningsbild
jesse
Inlägg: 9241
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Kommunikationsprotokoll exvis. över CANbus, EIA485 osv.

Inlägg av jesse »

Men det är också tur att det inte är lika komplicerat som i t.ex. Java, där du har en enorm massa data kring en sträng eller text om hur den ska tolkas, vilket språk den är på, vilket land den ska läsas i , vilket format den sparas i.... Det hade inte funkat särskilt bra i en AVR... Att skriva ut en "Java-sträng" 10 tecken hade antagligen fyllt upp hela flashminnet med olika metoder och förutom de 10 tecknen (som tar upp 20 bytes) ska en massa annan data hängas på, så det blir väl några hundra bytes eller så... (nu spekulerar jag , men enkelt är det inte).

Det tråkiga är ju att all mjukvara och standarder utvecklas för 7-bitars 'amerikansk' standard, sedan måste man trixa med diverse undantag för att Å,Ä och Ö ska fungera. Dessutom har de inte ens kunnat enas om vilka värden dessa tecken ska representeras med, så man får ha flera ASCII-tabeller...
sodjan
EF Sponsor
Inlägg: 43289
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Kommunikationsprotokoll exvis. över CANbus, EIA485 osv.

Inlägg av sodjan »

Nej, OK. Jag tänkte inte på AVR/PIC eller liknande specifikt. Utan mer på
språket C som sådant. Och Java kan jag inte med alls... :-)

Python har dock lite liknande "problem" där Unicode är default encoding för strängar.

> Dessutom har de inte ens kunnat enas om vilka värden dessa tecken ska representeras med, så man får ha flera ASCII-tabeller...

Det som har klarat sig längst är "DEC Multinational Character Set", DEC-MCS, som kom
någongång under 80-talet, först implementerat i terminalen VT-220. Det som idag kallas
ISO-8859-1 är i princip samma sak, skilljer bara på 4 tecken (och inget är åäÖÅÄÖ).
Det är också samma som Unicodes lägsta 256 "code-points".
http://en.wikipedia.org/wiki/Multinatio ... racter_Set
Användarvisningsbild
toffie
Inlägg: 1922
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

Re: Kommunikationsprotokoll, CANbus, över EIA485 osv.

Inlägg av toffie »

jesse skrev:
sodjan skrev:Man använder aldrig signed till variabler som enbart ska innehålla "text".
Det är ju lite lustigt, egentligen, eftersom "strängar" i C består av arrayer med char, som just är signed. Annars får man definiera dem som unsigned char. Själv har jag gjort så (för AVR) att jag använder typen uint8_t istället för char.

BIT är vad du är intresserad av. Var är det du ska läsa av bitarna? Skickar du data från din PC till en AVR som ska tolka bitarna eller är det tvärt om?

När man tolkar bitar i en AVR kan man göra på många sätt. Skriver du i C kan du t.ex. göra så här:

Kod: Markera allt

uint8_t byte = 0b00110010;

#define BIT0 1
#define BIT1 2
#define BIT2 4
#define BIT3 8
#define BIT4 16
#define BIT5 32
#define BIT6 64
#define BIT7 128

#define check_bit(byte,bit) (byte and bit)

//senare i programmet vill du veta om BIT4 är satt:

if (check_bit(byte, BIT4)) {
    // Gör något
}
Givetvis döper du bitarna till det de ska vara till, istället för BIT0, BIT1 etc:

Kod: Markera allt

uint8_t controlbits = 0b00001000;

#define MOTOR_ON 1
#define TEMP_HIGH 2
#define STOP_ALL 4

if (check_bit(controlbits, MOTOR_ON) {
    stoppa_motor();
}
Hej jesse, tack för ditt bidrag!
Det jag ska använda det till är kommunikation i båda riktningar. Antingen mellan AVR och PC eller mellan AVR och AVR. Så samtliga delar ska prata samma språk. AVR noderna kommer ju sköta sig självt, men om man behöver felsöka exempelvis så ska man kunna koppla in en dator på nätverket som kan lyssna av och skicka trafik in på nätet.

Att namnge bitarna har jag tänkt på, har sett det i flera exempel, bara att jag inte kommit dit. Men jag tycker det verkligen är en smart grej. Att ha en funktion som;

Kod: Markera allt

if (check_bit(byte, BIT4)) {
    // Gör något
}
påverkas väl inte av om exempelvis hela byten är satt till 1 inte sant? Du har säkert inte kollat på min kod, men jag lägger in lite här, bara för att jämföra.

Kod: Markera allt

// Check if a specific bit is set
int is_in_use(char datacheck, int bit_num)
{
    return datacheck & 1<<bit_num;
}
Nu vet jag inte om datatyperna är "korrekta", men det fungerar! :P Hur som, min funktion är väl i stort sett likvärdig med vad din "check_bit" funktion skulle göra, inte sant?


Jag vill inte rätta eller så, det är mest för att jag inte ska förvirra bort mig som jag frågar om följande;

Kod: Markera allt

#define MOTOR_ON 1

if (check_bit(controlbits, MOTOR_ON) {
    stoppa_motor();
}
Den koden frågar ju funktionen check_bit om controlbits variabeln har bit 1 satt. Med satt menas väl 1? Eller hög? Med din fråga så vill man att om motorn är igång, så ska den stängas av. Har jag förstått det rätt? Det är med största sannolikhet ingen kod som är tagen från något verkligt projekt så du har säkert bara svängt ihop det.

Men jag frågar därför att när jag läste det först så tänkte jag att om motor_on var 1 så borde väl motorn startas. Dvs, att en kontrollbyte kom in till processorn med information om att bit 1 var på och att då motorn skulle startas. Man kan väl säga att du istället menade tvärtom i din kod, om jag förstår rätt :P


Jag känner mig så dum, jag kan ju IF satser och jag vet ju hur man skriver funktioner osv. Har jobbat med PHP som på många sätt liknar C, även om mycket är olika också. PHP har ju som sodjan säger, något som C inte har, en färdig/separat datatyp för text/strängar. ( även om du inte pratar om PHP direkt sodjan ;)) Det gör ju att programmering i PHP är smidigare på många sätt för att snabbare få till lösningar, tycker jag som är van vid det. För er, om ni skulle börja med det helt från början, kanske skulle tycka tvärtom :D

Jag tror inte heller att ni försöker dumförklara mig eller tror att jag inte kan någonting, inte så. Jag har bara lite svårt att uttrycka mina tankar/funderingar ibland ;) Vilket säkert gör att folk missförstår mig, plus att jag ofta missförstår kod tills jag kan köra den och se vad som händer. Sen tar jag gärna tillfället i akt att fråga (vilket resulterar i många frågor ;)) när ni som faktiskt kan så långt mycket mer än mig har möjlighet att ge era synpunkter och idéer, jag uppskattar verkligen den tid ni har gett mig i mina frågor! :)
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Kommunikationsprotokoll exvis. över CANbus, EIA485 osv.

Inlägg av blueint »

Ett tips:

Kod: Markera allt

ch = (unsigned) 'ä';
Användarvisningsbild
jesse
Inlägg: 9241
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Kommunikationsprotokoll exvis. över CANbus, EIA485 osv.

Inlägg av jesse »

Nej, det där med 'motor on' hade jag bara hittat på.

MOTOR_ON = 1 kan ju betyda att motorn är på, eller så kan det betyda "sätt på motorn".... helt olika information.

Jag håller just nu på med att underhålla en gammal kod i AVR-assembler till ett kylskåp , där jag just kollar om motorn är på - då ska den stängas av om temperaturen är tillräckligt låg! Så jag hade nog det i baktanken när jag skrev.

Vad och hur man gör beror ju på funktionen. I ditt fall kanske en AVR skickar kommando till en annan AVR "sätt på motorn" och då blir det ju som du tänker.
Användarvisningsbild
toffie
Inlägg: 1922
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

Re: Kommunikationsprotokoll exvis. över CANbus, EIA485 osv.

Inlägg av toffie »

Ah du ser, jag bara krånglar till det för mig ;)
Skriv svar