Buffra bestämt antal tecken från Serial till ett värde.

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Buffra bestämt antal tecken från Serial till ett värde.

Inlägg av orvar-e »

Har en HC12 radiomodul, i grund koden får man ut ett tecken i taget. Men jag skulle vilja samla ihop fyra tecken eller hur många som behövs för stunden till ett värde.
Hur beter jag mig då. Har försökt och tror mig förstå att. På billigare radiomoduler använder man biblioteket virtualwire.h och stringar och arrys och får till just det jag önskar.
Önskar att få till liknande på H12 modulen.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Buffra bestämt antal tecken från Serial till ett värde.

Inlägg av sodjan »

Har du någon specifikation över hur dataströmmen ser ut?
Hur vet man vad som är ett "värde"?
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Buffra bestämt antal tecken från Serial till ett värde.

Inlägg av Icecap »

Nu är det kanske mobbning - men den funktion borde du klara att fixa själv.

Alt. 1:
1: Du ska ha en buffer med plats nog för de tecken du ska ta emot (kallar den "InBuf"). Du ska även ha en räknare som håller reda på antal tecken (kallar den "InCnt").
2: För varje tecken:
InBuf[InCnt] = Input_Byte;
InCnt++;
InBuf[InCnt] = 0;
3: När ett tal är tagit emot bör det vara ett sätt att kolla det på, kanske det kommer ett komma.

Kod: Markera allt

if(Input_Byte == ',')
  {
  Value = atoi(InBuf);
  // Put Value somewhere
  InCnt = 0; // Börja om igen
  }
Denna beskrivning är ganska rudimentär, man bör lägga till att man inte överstiger buffern storlek osv. men principen är ganska OK.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Buffra bestämt antal tecken från Serial till ett värde.

Inlägg av orvar-e »

Finns inga dumma frågor bara .......... du känner till resten.
Jag kom ingenstans och lösningarna jag hade kändes inte bra.
Ska testa ........

Sodjan .........
Så här ser den mest avskalade koden för radio modulen ut.
I mitt fall är jag nöjd när jag samlat in 5 - 6 tecken från HC12.
Starttecken - adress - meddelande - sluttecken.
Eller starttecken över med int värde över 99 funkar både som adress och start.

Kod: Markera allt

/*
#include <SoftwareSerial.h>

const byte HC12RxdPin = 4;                  // Recieve Pin on HC12
const byte HC12TxdPin = 5;                  // Transmit Pin on HC12

SoftwareSerial HC12(HC12TxdPin,HC12RxdPin); // Create Software Serial Port

void setup() {
  Serial.begin(9600);                       // Open serial port to computer
  HC12.begin(9600);                         // Open serial port to HC12
}

void loop() {
  if(HC12.available()){                     // If Arduino's HC12 rx buffer has data
    Serial.write(HC12.read());              // Send the data to the computer
    }
  if(Serial.available()){                   // If Arduino's computer rx buffer has data
    HC12.write(Serial.read());              // Send that data to serial
  }
}
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Buffra bestämt antal tecken från Serial till ett värde.

Inlägg av sodjan »

OK, det där är ju bara lite programkod som (kanske) implementerar något slags protokoll.
Jag tänkte mer om det fanns en specifikation över protokollet.

Eller är det kanske så att du har kontroll över båda ändar så att du kan
fixa vilket eget protokoll som du vill? Är det inte givet vilket tecken
som är "starttecken" och "sluttecken"? Kan du välja det själv?

> Eller starttecken över med int värde över 99 funkar både som adress och start.

Sorry, jag förstår inte vad det står. Eller hur "99" ska tolkas. Decimalt? Hex?
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Buffra bestämt antal tecken från Serial till ett värde.

Inlägg av orvar-e »

Ja, jag har kontroll på både sändare och mottagare. 99 var tänkt som decimalvärde.

Har testat det Icecap skrev men är väl för puckad för att få till det.
Jag förstår precis hur du menar, men har svårt att omsätta det i smidig kod.
Får prova vidare när jag är lite mindre seg i roten.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Buffra bestämt antal tecken från Serial till ett värde.

Inlägg av Icecap »

Kod: Markera allt

void __attribute__ ((interrupt)) RS232_A_Rx_ISR(void)
  {
  // Recieve interrupt (if enabled)
  _UBYTE Incoming;
  Incoming = SCI1.RDR; // A read empties the Rx-buffer and removes the interrupt
  switch(Incoming)
    {
    case STX:
      RS232_A.Rx.In = 0;
      break; // STX
    case ETX:
      RS232_A.Rx.Chars = RS232_A.Rx.In;
      if(RS232_A.Rx.In) RS232_A.Rx.Flag = MESSAGE_TIMEOUT;
      RS232_A.Rx.In = 0;
      break; // ETX
    default:
      if(RS232_A.Rx.In < sizeof(RS232_A.Rx.Buffer) - 1)
        {
        RS232_A.Rx.Buffer[RS232_A.Rx.In++] = Incoming;
        RS232_A.Rx.Buffer[RS232_A.Rx.In]   = 0;
        }
    break;
    }
  }
Ett exempel från verkligheten. Jag utgår ifrån att du har en definierat STX hhv. ETX -tecken (Start TeXt hhv. End TeXt).
Koden är en interruptrutin som flaggar till main-loop att det ska fixas med data via flaggan 'RS232_A.Rx.Flag'.

Den har i övrigt en timer som räknar ner den till noll efter en viss tid så att ett inkommande block har en time-out varefter det försvinner - men det är nog lite överkurs just nu.
Skriv svar