Är det en loop som läser av värdet på COMporten?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Är det en loop som läser av värdet på COMporten?

Inlägg av BEEP »

Al_Bundy skrev:Nej. Vi är olika subgrupper som jobbar med varandra. Jag är på hårdvarusidan och resten är på PC:sidan. Jag vet inte exakt vad dom håller på med, men jag vet om att de har inte lyckats få kunna ta emot alla värden jag skickar, bara ett.
För att kolla om det är mjukvaran på datorn som strular så öppnar du en seriell terminal för att se om tecknen från µC kommer fram hela och fina. Terminalen laddar du ner från nätet.

Edit:
Glöm inte att avsluta deras program på datorn innan du öppnar terminalen!
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Är det en loop som läser av värdet på COMporten?

Inlägg av Icecap »

Al: ni måste kommunicera med varandra, inte bara koppla en ledning mellan!

Man "ska" designa sådan kommunikation efter att den kan brytas och kopplas ihop på ett slumpmässigt sätt och ändå komma i synk snabbt.

Jag gör det vid att använda block och nästan alltid "challenge - responce", alltså "Hörru, jag vill ha ett värde!" - "jupp, här får du".

Jag använder nästan alltid ASCII-kommunikation, alltså text. detta för att isolera de ramar jag använder: STX & ETX (se ASCII tabell).

Jag bygger upp ett block så att det ser ut ung. såhär:
STX <adress> <avskiljare> <vilken typ data> <avskiljare> <Data> <avskiljare> <Checksum> ETX

Mellanslag är bara för tydlighetens skull och skickas inte med.
STX är 0x02, ETX är 0x03.
<adress> har jag gärna hexadecimalt - när det behövs, behöver jag inte det är det inte med.
<avskiljare> är ett tecken som inte är numerisk och som skiljer de olika fält från varandra, t.ex. ','.
<vilken typ data> kan vara bra om det kan finnas enheter som skickar utan att tillfrågas, det kan också vara enklare att behandla inkommande data. Kan såklart undvaras om man inte behöver det.
<Data> är just de data som behövs.
<Checksum> är oftast en ihopräkning av alla bytes från första byte efter STX till sista byte omedelbart innan checksumman trunkerat till en byte. Den skriver jag ut i hexadecimal, 2 siffror med leading-zero.

Min mottagning av kommunikationen är då enkel:
Kommer det en STX nollställer jag ingångspekaren. Detta betyder i grunden att buffern töms.
Kommer det en ETX ger jag en flagga ett värde. Den flaggas värde räknas ner av en timer-interrupt till noll, detta betyder att om inte meddelandet är behandlad inom en viss tid "försvinner" det. Därmed kommer skiten inte att låsa sig och man kan köra igen efter timeout. När den flagga är aktiv kommer alla mottagna bytes att kastas!

Om det INTE är varken STX eller ETX läggs de inkomna bytes i en input-buffer och den kollas såklart så att den inte kan bli överfylld.

Detta är vad som händer i mottagningsinterrupten.

I main-loop finns det en rutin som kollar om flaggan är icke-noll. Är den det brukar jag att kopiera inputbuffern till en arbetsbuffer bara för att jag har minne nog. Sedan nollar jag flaggan och mottagningen kan alltså ske medan jag behandlar de inkomna data.

Första steg är såklart att kolla checksumman mot verkligheten, är de lika är saken biff.
Sedan kommer tolkningen av de data som överförs, där har jag ofta använd atoi() och jobbat vidare med det.

Om data är halva paket som råkar "samlas ihop" kommer checksumman sannolikt att gnälla, försvinner det ett halvt paket ligger det bara i buffern men när nästa hela kommer nollas buffern igen och den synkar direkt.

Man kan nog göra det smartare men jag har använd detta sätt i många år och det fungerar skitbra för mig.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är det en loop som läser av värdet på COMporten?

Inlägg av Al_Bundy »

Tackar för ditt långa inlägg. Vi använder inte oss av ASCII, utan vanliga strängar + StringtoInt/Float då det är inte vi som ska använda oss av programmet. De som ska köra programmet har 0 koll på just det där med ASCII osv. Så vi försöker hålla oss så "simpla" som möjligt, trots att det kan krångla till det lite.

Vi har lyckats ha kommunikation sedan länge. Det var bara en inställning i LabView som krånglade till det bara. Just nu så ska vi bara få det flöda på med att vi skickar värden till vara dra för att ha det som ett kvitto på vart varje process står någonstans.

När en process är klar. Då skickar jag OK1. Då inväntar datorn på OK1 innan den får fortsätta osv OK2 osv.
Al Bundy är inte dum serru, trots att jag inte kan SAOL utantill ;)
Däremot så uppmanar jag ta mina texter med en nypa salt. Jag må skriva "hit och dit" och låta IQ-befriad, men det har med att jag har aldrig hållit på med sånt här förut och det gäller även att våra subbgrupper fungerar bra med varandra så vi förstår vad vi gör.
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Är det en loop som läser av värdet på COMporten?

Inlägg av Icecap »

ASCII är text :doh:

Läs igen, försök förstå något någon gång...
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är det en loop som läser av värdet på COMporten?

Inlägg av Al_Bundy »

Oj, felordval av mig igen.
Vi skickar strängar t.ex "434.45" för att min subgrup som jag jobbar med vet inte hur man skickar bytes direkt via serial. Inte mitt fel direkt. Dom har inte hittat en lösning på det än.
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Är det en loop som läser av värdet på COMporten?

Inlägg av Icecap »

Att skicka binäre värden är i grunden enkelt - men inte speciellt intuitivt. Och det är en bitch att "sniffa" för att se om det kommer fram...

Därför använder jag ASCII (text) som dataöverföring.

Mitt projekt med labb-displayen (http://elektronikforumet.com/forum/view ... =3&t=74522) använder just detta. När jag tryckar på endera av de 4 knappar kommer det en textsträng från displayen till vem-som-är-i-andra-ändan:
STX "00" "0" ETX

I hex:
0x02 0x30 0x30 0x03

Detta betyder, byte för byte:
* STX, start text. Rensar inputbuffern hos mottagaren.
* '0' MSB av adressen (max. 255 adresser möjliga).
* '0' LSB av adressen. Adressen är hexadecimal.
* '0' Knapp noll. De andra knappar ger '1', '2' hhv '3'.
* ETX, end text. Detta får mottagaren att fatta att nu är det slut på det roliga, börja jobba.

Om jag ändrar enhetens adress (är såklart ställbar mellan 0x00 och 0xFE då 0xFF är gruppkall) syns det såklart på adressbyten.

Om jag t.ex. skriver tillbaka till displayen:
Rad 1: " Intensitet: xxx% "
Rad 2: " Colour: xx "

kommer textsträngen som skickas att se ut som följer:
STX "00" 0x04 " Intensitet: xxx% " 0x05 " Colour: xx " ETX
Då utan citationstecken och mellanslag utanför citationstecken. Det blir ju bara en lång textsträng med ett par kontrolltecken inbäddad.
0x04 0xh 0x05 placerar cursorn på översta rad, första position hhv. understa rad, första position.

Så om ni ska överföra värden ska det vara något tecken som skiljer blocken ifrån varandra. Det kan vara CRLF eller annat, dock gillar jag CRLF då det med sniffning på ett terminalprogram blir så snyggt uppradat.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: Är det en loop som läser av värdet på COMporten?

Inlägg av Andax »

En sak att tänka på om man skickar data seriellt till en PC med Windows är att den vid uppstart eller inkoppling av USB seriedongel försöker avgöra om det är en seriemus som kopplats in. Om det skickas en massa binära saker just då kan musen börja hoppa runt helt okontrollerat. Har själv råkat ut för det. Finns en hel del att läsa på nätet om det. Går att åtgärda.
Skriv svar