Kommunikationsprotokoll exvis. över CANbus, EIA485 osv.

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
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 »

> Vad jag alltså behöver göra är att om jag exempelvis vill skicka ett paket liknande, i ASCII;

"I ASCII" är oegentligt. ASCII handlar om en specifik tolkning av 8-bitars bytes.
När man skriver värden som du gör (i detta fall angivet i hex) så är "i ASCII" lite fel.
Det är inte heller så att texten "abc" behöver enligt just ASCII, det kan lika gärna vara
t.ex EBCDIC, vilket är ett alternativt sätt att koda text som används av t.ex IBM.

Så glöm allt vad som har med ASCII att göra !

'> Så behöver jag skriva kod för att plocka isär de bitarna till binärt exempelvis och använda värdena därifrån,

Nej! Du skriver helt enkelt dina värden till UART'en. Hur du *anger* dina värden beror helt på
den miljö som du programmar i och applikationen. T.ex så ger följande 4 delar assembler kod till PIC
exakt samma slutresultat:

Kod: Markera allt

 movlw  b'01000001'    ; binärt.
 movwf  TXREG
...
 movlw  h'41'          ; hex, samma sak som 0x41...
 movwf  TXREG
...
 movlw  d'65'          ; decimalt.
 movwf  TXREG
...
 movlw  a'A'           ; ASCII.
 movwf  TXREG
...
Du anger helt enkelt det du vill skicka i ett format som passar det aktuella fallet.

> Om jag istället skickar det rent av som bytes,...

OK. En byte kan ju ha alla vänden melan 0 och 255 (decimalt). Helt OK.

> så behöver mottagarprogrammet i processorn och på datorn kunna tolka det rätt

Ja, om det behöver tolkas alls. En normal terminal kommer att tolka det som ASCII.

> och inte omvandla det automatiskt till ASCII värdet av den mottagna byte'n?

Det sker aldrig någon "omvandling". Värdet 0x41 är alltid just det. Om det skickas
till en en terminal som jobber med ASCII så kommer den att *anta* att man ville
att ett "A" skulle visas, så då gör den det. Men det sker aldrig någon omvandling.

Du kan fortfarande inte riktigt skilja värderna i sig från *presentationen* eller
*tolkningen* av värderna. Det är ju två helt skillda saker. För en terminal
betyder t.ex 0x41 just bokstaven "A", men för något annat kan det betyda
"öppna ventil 1", och då har det ju ingenting alls med ASCII att göra...

> Så när jag egentligen har skickat en byte som jag tror ska komma fram som en byte,
> så har jag istället fått ASCII värdet och då blivit förvirrad

Nej. Du har fått exakt samma sak! Det finns inget "istället fått" här. Igen, håll isär
datat i sig från presentationen. Terminalen har fått exakt det du skickade.

> Någon idé om något terminalprogram för windows som klarar av att visa inkommande
> bytes och inte automatiskt omvandlar till ASCII kod? Har kört lite med Putty men har
> inte listat ut ifall det går att göra där.

Det finns några terminalemulatorer som kan ställas om till "hex-dump", men det är inte så vanligt.
Men det spelar inte så stor roll, ser du ett "A" på skärmen så vet du ju värdet... :-)
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 »

Sodjan
Många tack! Måste säga att det känns så otroligt mycket bättre i huvudet efter dina och de andras svar i denna tråd, det känns enormt mycket roligare också.

Det är ganska stor frihet med elektronik, speciellt med tänkande om hur man väljer ett motstånd. Man räknar ut ett värde som kan behövas, sen tar man det. Har man inte just det värdet tar man något annat på ett ungefär.

Bara man fixar så det fungerar, i de flesta delar av elektroniken, så är det ok :P


Det jag tänker mig med att ett hex värde behöver "tolkas" är att jag gärna vill kunna bestämma, "typ" åtta olika värden som då är optimalt att kunna göra med hex. Det jag vill ha ut är ju den binära versionen, 01000001 där åtta olika saker kan ställas på/av.

Visst att jag kan se ett A istället för hex värdet, men det blir fel i bollen när man tänker då ;)
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 »

> "typ" åtta olika värden som då är optimalt att kunna göra med hex.

Du menar att i en viss byte så ska varje bit ha en egen funktion?
Som på/av av någonting t.ex en lysdiod eller ett relä eller liknande ?

> Det jag vill ha ut är ju den binära versionen, 01000001 där åtta olika saker kan ställas på/av.

Ja, men det är ju ingen skillnad. Värdet är detsamma, det är bara olika representation/presentation.

01000001 är ju exakt detsamma som 0x41, bara skrivet på olika sätt.
För t.ex en dator eller en PIC/AVR så spelar det ingen roll vilket du använder.

Om du t.ex skriver 0x41 till en port på en AVR eller PIC så kommer portens bitar
att blir just 01000001.
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 »

Ja absolut, jag vet att man kan skriva ut både binärt och hex direkt på porten och få samma resultat, det är mest bara hur jag i mitt eget tänkande ska kunna lösa bit-informationen för att göra så varje bit betyder något. Jag har aldrig programmerat så här "avancerat" så det är lite svårt att förstå hur jag ska lösa det. Måste bara fundera ut något sätt som känns bra :P

Helst av allt skulle jag vilja ha arrays, men de känns så svåra och klumpiga i C om man jämför med PHP.
Jag måste helt enkelt träna lite mer på det ;)

Kod: Markera allt

Du menar att i en viss byte så ska varje bit ha en egen funktion?
Som på/av av någonting t.ex en lysdiod eller ett relä eller liknande ?
Helt korrekt, fast det kan ju även betyda att en nod vill ha ett svar om binära koden är 01000100 medan den kanske inte behöver ett svar om koden är 01000000.

Det är ju helt upp till hur man vill ha sin konfiguration. Att rakt av jämföra med olika hex, om inkommande paket säger 0xF0 så är det start, om paketet säger 0xE3 så gör det. Det känns som det blir enormt svårt, just eftersom man kan ha 255 olika kombinationer, eller val, eller.. ja.. vad man kallar det ;) Det blir en oändlig massa olika jämförelser man måste göra och då är det ju bättre att direkt visa det i binärt och ta varje bit för sig.

Det är så jag tänker mig att jag ska lösa det iaf. Vet inte om det är dåligt eller bra, men det är en lösning än så länge :D
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 »

Det finns metoder att testa om en viss *bit* är 1 eller 0 i en variabel (t.ex en byte)
i alla (eller i alla fall i de flesta rimliga) språk, om det är *det* man vill göra.

I t.ex PIC assembler så heter instruktionerna BTFSC och BTFSS,
"Bit Test File and Skip if Clear/Set". I C gör man på något annat sätt.

På samma sätt finns det metoder för att sätta/cleara enstaka bitar.

Sen kan man i alla språk göra olika slags definitioner eller macros som
gör att man kan skapa egna "namn" på de individuella bitarna.

> ...då är det ju bättre att direkt visa det i binärt och ta varje bit för sig.

Vad menar du med att "visa det i binärt" ?
Vem (eller vad) ska det "visas" för?
Det känns som du än en gång är ute på fel spår...

Du behöver inte "visa" något alls för någon/något för att testa bitarna.
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, nej jag behöver inte visa det :P Mer visa det mentalt i skallen på mig själv ;)

Ja när du säger det ja, får kolla upp mer det med att kolla direkt om olika bitar är satta till vad.
Vet att jag läst om det, men har aldrig använt det då jag löst det på andra sätt :P
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 »

Nu har jag knåpat ihop ett program för Windows för visning av tecken på olika sätt. Vet inte riktigt hur jag ska beskriva det, men jag tänkte att andra kanske kan få användning av programmet. Source finns bifogat i zip filen och det är helt öppen källkod :)

Nerladdning här; Character Test
Om någon laddar ner programmet, får ni gärna berätta om det fungerar och om ni har nytta av det. Kan inte garantera på något sätt att det fungerar och ger ingen garanti eller support ;) Jag har helt enkelt bara kodat det i VS C++ 2010 Express.

Bild
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 »

Vad betyder BIT: ?
BIN: behöver kanske bara 8 bitar så länge som du enbart jobbar med enstaka bytes.
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 »

BIT betyder satta bitar, så för exempelvis A har man 01000001, dvs bit 0 och 6.
Det är väl kanske lite onödigt vetande, men det kan ju kanske vara bra någon gång när man bara vill se lite snabbt och inte orkar eller kan tänka ut hur det ser ut.

BIN kan ju givetvis bara vara 8 bitars visning på, men ÅÄÖ plus lite andra tecken går över det då de använder de andra åtta bitarna också, eftersom de så fint ska ha prickar :P Det är väl för att de inte "tillhör" de original bytes som kom från början förmodar jag?


Edit..
Det tar en stund att tänka helt klart ;) Men jag kom på att det är ju själva BIT delen som jag är ute efter, det är ju den som jag ska använda för att se om en viss bit i en byte är satt till någonting och därifrån "flagga" till ett svarspaket för exempelvis om avsändar-noden vill ha ett svar tillbaka.

ex. Avsändare skickar 0x3F 0x5D 0x60 0xF3
0x3F är pakethuvud som i binärt blir 0011 1111, där exempelvis bit 2 betyder att ett svarspaket ska skickas tillbaka.

0x5D är adressbyte

0x60 är meddelande, eller förfrågan om ett värde hos mottagaren

0xF3 är slutbyte


Med koden jag skrivit så kan jag då enkelt ta reda på om bit 2 i pakethuvudet är satt till 1, då ska ett svarsmeddelande skickas tillbaka till avsändaren.


Edit igen..
Kanske inte så smart att ha en startbyte som kan ändra skepnad :P givetvis får man ha någon startbyte som i ASCII är ett tecken som aldrig används. Anledningen till att använda ett tecken som inte används för övrigt är för att man skulle kunna skicka längre meddelanden med text, istället för kommandon. Dvs. att man istället för att kolla om bits är satta på själva meddelandet så visas det som ett text-meddelande, vilket kan vara praktiskt om man skickar ut till en display-nod.

Om ni förstår vad jag menar :roll: :D
Senast redigerad av toffie 28 januari 2012, 11:48:39, redigerad totalt 2 gånger.
H.O
Inlägg: 6031
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Re: Kommunikationsprotokoll, CANbus, över EIA485 osv.

Inlägg av H.O »

"Ordinarie/standard" ASCII är ju 7 bitar (alltså 0-127) men sen finns det lite olika dialekter för Extended ASCII vilket då är koderna 128-255. I den vanligaste tabellen (som t.ex Windows använder) är t.ex 134 och 143 koderna för lilla respektive stora 'Å' och de ryms ju båda inom en byte (alltså 8 bitar)...
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 »

Ah, va konstigt för om man tittar på output i programmet för exempelvis bokstaven Ä så ser det ut såhär;

Bild
H.O
Inlägg: 6031
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Re: Kommunikationsprotokoll, CANbus, över EIA485 osv.

Inlägg av H.O »

Det kan ju vara att du och/eller ditt program kör med någon annan kodning - jag vet faktiskt inte - och jag vet inte hur ditt program funkar. Som sagt de 7 nedre bitarna är standard ASCII sen finns det flera 'dialekter'. Sök lite på Extended ASCII så hittar du en hel del info.
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 »

Jag tror dig! Det är säkert min kodning som ballar ur för vissa tecken. Det blir ju samma på § ½ ¤ också, mfl.
Hur som helst, det är ju mest standard tecken jag ska använda, har jag tänkt :roll: :P
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Kommunikationsprotokoll, CANbus, över EIA485 osv.

Inlägg av blueint »

Du använder nog signed för teckenvariabeln. Vilket får koden att tolka ditt "Ä" som ett negativt värde.
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 »

> Hur som helst, det är ju mest standard tecken jag ska använda, har jag tänkt

Och vad är "standard tecken"? Utesluter du då "åäöÅÄÖ"?

Blueint verkar vara det hela på spåret, självklart ska du inte använda
signed variabler, gör du det ?

Men du såg alltså att du fick konstiga svar med t.ex "Ä", men istället för
att fundera på det och faktiskt *fixa* felet, så utökade du visningen från
8 bitar till 16 !? Varför i jösse namn då? Varför inte lösa problemet istället?
Skriv svar