Hantera rs232 "kommandon" i pic
Hantera rs232 "kommandon" i pic
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??
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??
Re: Hantera rs232 "kommandon" i pic
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.
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.
Re: Hantera rs232 "kommandon" i pic
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.
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.
Re: Hantera rs232 "kommandon" i pic
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!
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!
Re: Hantera rs232 "kommandon" i pic
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! 

Re: Hantera rs232 "kommandon" i pic
Sen den där <enter> kan ju däremot betyda lite olika: http://en.wikipedia.org/wiki/Newline
Re: Hantera rs232 "kommandon" i pic
[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.
(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.
Re: Hantera rs232 "kommandon" i pic
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.
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.
Re: Hantera rs232 "kommandon" i pic
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....
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....
Re: Hantera rs232 "kommandon" i pic
Hyperterminal:
STX = Ctrl-B
ETX = Ctrl-C
Ganska skrivbart...
STX = Ctrl-B
ETX = Ctrl-C
Ganska skrivbart...
Re: Hantera rs232 "kommandon" i pic
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?
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?
Re: Hantera rs232 "kommandon" i pic
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???
char1
char2
char3
char4
char5
char6
char7
char8
char9
Men det kanske finns något annat sätt???
Re: Hantera rs232 "kommandon" i pic
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.
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.
Re: Hantera rs232 "kommandon" i pic
kan man göra en lookup table som ser ut såhär?:
Altså med variabels istället för rena '!' eller 0x13 eller liknade???
Hoppas ni fattar vad jag menar.....
Kod: Markera allt
goto $ + BUFFER_COUNT
retlw char1
retlw char2
retlw char3
retlw char4
retlw char5
retlw char6
retlw char7
retlw char8
retlw char9
Hoppas ni fattar vad jag menar.....