Hantera rs232 "kommandon" i pic

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Hantera rs232 "kommandon" i pic

Inlägg av Bosen »

Jag har en 16f648a som jag skickar lite data till via rs232.
Kommunikationen funkar som den ska, men jag skulle vilja veta något sätt att ta hand om "kommandon".

Vi säger att jag skickar ett kommando via terminalen: pos 100
där pos är kommandot och siffrorna är ett decimalt tal.
På piclist så hittade jag en kod för att omvandla ascII tecken till ett decimalt tal så den biten kan jag nog lösa. Men jag vill hamna vid en speciell label när pic:en "ser" kommandot pos... sen kan jag ju börja läsa av siffrorna.
Givetvis så skulle jag ju vilja hamna vid en annan label när pic:en inte "känner igen" ett kommando som skickas, så jag kan skicka tillbaka: "felaktigt kommando" till terminalen.

Programmeringsspråk: MPASM

Hur brukar ni göra??? några tips??
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hantera rs232 "kommandon" i pic

Inlägg av sodjan »

Menar du att skicka "pos" som "p", "o" och "s" ?
Eller att skicka något tecken eller värde som betyder "pos" ?

Men generellt så är det väl bara att "titta" på det som har skickats och göra
vad som måste göras.

Se till att varje komplett "kommando" avslutas på ett konsekvent sätt
så att du vet när det är dags att titta på det (fram tills dess så är det
bara att spara undan det som koller in), t.ex med ett CR eller liknande.

Det finns också en fördel att försöka hålla sig till skrivbara ASCII tecken,
det gör det hela mycket enklare att felsöka genom att hänga på en terminal.

> Men jag vill hamna vid en speciell label när pic:en "ser" kommandot pos... sen kan jag ju börja läsa av siffrorna.

Vänta tills du har ett komplett kommando i bufferten, innan dess finns det ingen
anledning att hoppa någonstans alls, det bara rör till det hela.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Hantera rs232 "kommandon" i pic

Inlägg av vfr »

Japp! Börja med att definiera ditt paketformat. Det låter pretantiöst, men behöver egentligen inte vara så märkvärdigt. Det du absolut måste ha med är ett sluttecken. Annars vet inte den mottagande mikrokontrollern när den skall sluta läsa av DET paketet. Det kan vara så enkelt som ett CR. Sedan kan det vara bra att ha med även ett starttecken och kanske någon checksumma. Adressering om det är flera enheter på bussen samtidigt. Annars skippa det.

När du har definierat slutecknet så gör som sodjan skriver, läs in allt i en buffert och tolka inte förrän hela paketet är inläst. Dock får man hålla koll på så att man inte överskrider max buffertlängd om det skulle komma in skräp. Sedan är det bara att gå igenom bufferten från början och jämföra det som står där med vad du förväntar dig.
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Hantera rs232 "kommandon" i pic

Inlägg av Bosen »

jag vill skicka kommandot som 'p' 'o' 's' ' ' '1' '0' '0'.
Skrivbara tecken är givet för min del eftersom jag vill skicka det från hyperterminalen (eller iallafall ett likande terminalprogram).

Blir det ett CR automatiskt när jag skickar något från hyperterminalen?? jag menar, jag trycker ju ändå på [enter] för att skicka kommandot.

För er som undrar så är tanken att jag skall skicka ett värde som motsvarar positionen där ett R/C servo skall ställa sig!
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Hantera rs232 "kommandon" i pic

Inlägg av vfr »

Japp! Hyperterminalen, eller vilken terminal som helst, skickar bara det du säger åt den att skicka. Alltså de tangenter du trycker. Trycker du 'p' 'o' 's' ' ' '1' '0' '0' <enter>, så skickar den precis det! :)
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: Hantera rs232 "kommandon" i pic

Inlägg av speakman »

Sen den där <enter> kan ju däremot betyda lite olika: http://en.wikipedia.org/wiki/Newline
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hantera rs232 "kommandon" i pic

Inlägg av sodjan »

[Enter] skickar "Carriage Return", ja. http://en.wikipedia.org/wiki/Carriage_return
(Speakman har också en poäng...)

Vissa terminaler (eller ibland i ekot tillbaka) lägger till ett LF för att
även få nästa rad på en ny rad. CR flyttar bara markören tillbaka till
början på samma rad, normalt. För PIC'en spelar det igen roll, man det
kan påverka hur det ser ut i Hyperterminalen...

> jag vill skicka kommandot som 'p' 'o' 's' ' ' '1' '0' '0'.

Varför inte bara ett ensamt "p" ? Har du fler kommandon som börjar på "p" ?

Du har bara 1 servo just nu ?
När du ändå håller på så vore det enkelt att lägga till ett "servo nummer",
det blir mer jobb senare att lägga till det.

Jag skulle också använda ett tecken som "syns" istället för ett "space", något i stil med :

"p", ":", "1", ":", "1", "2", "3" eller "p:1:123" ihopskrivet, där den första ettan är servonummer.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hantera rs232 "kommandon" i pic

Inlägg av Icecap »

Jag använder mycket ofta ett protokoll som är ganska enkelt men som ger lite overhead:
STX (0x02)
Kommando i text (värde)
Någon avdelare (';')
Värde i text (behövs inget värde duger '0' fint)
ETX

Man kan självklart expandera så mycket man vill med undervärden osv, något jag rent faktisk har använd i vissa sammanhang.

En "block" kan alltså se ut som följer:
STX "124;273" ETX (utan några mellanslag och " och STX/ETX är ASCII-värden 02h/03h)

Interruptrutinen som "tar emot" kan då reagera på de specifika tecken:
STX nollar input-buffern
ETX konverterar värden och sparar dom i de valda variabler ("Command" & "Data" kanske), sedan flaggas det för att en block har tagits emot och behöver exekveras.
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Hantera rs232 "kommandon" i pic

Inlägg av Bosen »

Jag är inte riktigt med på vad du menar icecap, men när du använder STX så har vi väl frångått detdär med skrivbara tecken?!?

Däremot funderade jag lite på detdär med starttecken! Det hadde ju varit ganska smidigt (och snyggt) att alltid börja ett kommando med ett "!" (utropstecken) och sedan avsluta med CR.
Man skulle ju då kunna tänka sig att om man skall "fråga" MCU:n något så skriver man ett "?" (frågetecken) som starttecken istället. Man får då 2 starttecken, men håller man sig bara till dom så borde det väl inte vara några problem?!?

Bufferten däremot?:
Går det att spara bufferten i en lookup table? Det tycker jag verkar smidigt att hantera.... men hur gör man enklast för att göra detta?

Jag tänkte för enkelhetens skull bara ha en buffert på 9 tecken till att börja med....
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hantera rs232 "kommandon" i pic

Inlägg av Icecap »

Hyperterminal:
STX = Ctrl-B
ETX = Ctrl-C

Ganska skrivbart...
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Hantera rs232 "kommandon" i pic

Inlägg av Bosen »

nja... jo... det är väl skrivbart.....
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Hantera rs232 "kommandon" i pic

Inlägg av vfr »

Jag kan hålla med om att STX/ETX känns lite mittemellan textprotokoll och binära protokoll. Det finns många protokoll som är uppbyggda på detta sätt. Det är väl det närmaste man kan komma en generell ASCII blockstandard. Inte för att det är så mycket standard ändå...

Annars tycker jag din tanke med '!' och '?' låter rätt bra. Det känns dessutom rätt bekant på något sätt. Förmodligen något protokoll som jag har sett på liknande sätt.

Vad menar du med lookuptabell i sammanhanget? På vilket sätt skulle det skilja sig från en vanlig buffert?
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Hantera rs232 "kommandon" i pic

Inlägg av Bosen »

nja... det kändes som att det hadde varit lätt att hantera om varje tecken från bufferten låg som en rad i en lookup-table. Men jag har nog missat hur man skall lägga upp en buffert. Jag tänkte att man sparar varje tecken i en variabel. så om man har en buffert på 9 tecken så blir det 9 variabler:
char1
char2
char3
char4
char5
char6
char7
char8
char9


Men det kanske finns något annat sätt???
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hantera rs232 "kommandon" i pic

Inlägg av Icecap »

Buffer res 9

Och visst är STX/ETX lite "binärt" i ASCII-text sammanhanget men det är med flit. Dels är de enkla att skriva/läsa i HyperTerminal men samtidig får ingen andra tecken vara under 0x20. Hade jag vald t.ex. '!' eller liknande kunde detta ställa till en hel del problem då jag även använder protokollet till att överföra text i vissa fall, detta hade då gjort just dessa tecken i texten omöjliga om inte man skulle ställa till en del knas.

Med STX/ETX är detta knappast ett problem. Men visst, om man bara överför värden i form av tal här man ju egentligen alla andra karaktärer än '0'-'9' som kontrolltecken men principen blir ändå det samma: specifika data till att starta och sluta en block, allt däremellan ska bara samlas in i en buffer.
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Hantera rs232 "kommandon" i pic

Inlägg av Bosen »

kan man göra en lookup table som ser ut såhär?:

Kod: Markera allt

goto $ + BUFFER_COUNT
retlw       char1
retlw       char2
retlw       char3
retlw       char4
retlw       char5
retlw       char6
retlw       char7
retlw       char8
retlw       char9

Altså med variabels istället för rena '!' eller 0x13 eller liknade???

Hoppas ni fattar vad jag menar.....
Skriv svar