Buffra bestämt antal tecken från Serial till ett värde.
Buffra bestämt antal tecken från Serial till ett värde.
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.
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.
Re: Buffra bestämt antal tecken från Serial till ett värde.
Har du någon specifikation över hur dataströmmen ser ut?
Hur vet man vad som är ett "värde"?
Hur vet man vad som är ett "värde"?
Re: Buffra bestämt antal tecken från Serial till ett värde.
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.
Denna beskrivning är ganska rudimentär, man bör lägga till att man inte överstiger buffern storlek osv. men principen är ganska OK.
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
}
Re: Buffra bestämt antal tecken från Serial till ett värde.
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.
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
}
}
Re: Buffra bestämt antal tecken från Serial till ett värde.
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?
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?
Re: Buffra bestämt antal tecken från Serial till ett värde.
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.
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.
Re: Buffra bestämt antal tecken från Serial till ett värde.
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;
}
}
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.