Strings, hoe te gebruiken

algemene C code
Gebruikers-avatar
Berichten: 3
Geregistreerd: 03 Okt 2017, 14:45

Strings, hoe te gebruiken

Berichtdoor Faramir » 04 Okt 2017, 08:49

Hallo,

Allereerst ben ik heel blij dit forum gevonden te hebben!
Met behulp van een Arduino Uno en het LCD Keypad Shield (Velleman VMA203) wil ik mijn scanner gaan bevragen.
Die scanner laat op het display wel de tag zien van het betreffende kanaal maar niet van de betreffende geheugenbank.
Via de seriële poort kan ik die wel opvragen door MWxx naar de scanner te sturen.
De scanner antwoord dan met een string waarin de gevraagde informatie zit.
Een voorbeeld van een antwoord is "20MW05 PT0 TTMUAC".
Het gaat mij in dit voorbeeld om "05" (het banknummer) en alles na TT (de banktag).
Die banktag is maximaal 12 tekens lang.
Nou heb ik gekeken hoe ik met strings moet omgaan maar daar zijn veel verschillende manieren voor.
Ik moet in elk geval delen uit het antwoord van de scanner halen alvorens die op het LCD venster van het shield te laten zien.
Hoe ik delen uit het antwoord moet filteren is me helaas niet duidelijk geworden en daarbij heb ik hulp nodig.

Stapsgewijs had ik het volgende bedacht:


INIT FASE
01. Zet "Bank: " op 0,0 van LCD Display
02. Zet "Tag: " op 1,0 van LCD Display
03. Configureer seriële interface op 155200-8-N-1
04. Zet initiele waarde van BANKNR string op "00"
05. Zet initiele waarde van INTERROGATOR string op "MW00"
06. Zet initiele waarde van BANKTAG string op ""
07. Zet initiele waarde van REPLY string op ""

LOOP FASE
01. Wis regel 0 vanaf pos 7
02. Kies met behulp van de UP en DOWN knop de gewenste bank (00-39, roulerend) en laat de huidige waarde van de keuze zien op regel 0,7 (BANKNR)
02. Stel na indrukken van de SELECT knop INTERROGATOR in op "MW" aangevuld met BANKNR -> MWxx (xx = gekozen nummer)
03. Stuur INTERROGATOR naar de seriele poort
04. Luister naar het antwoord
05. Begint de antwoordstring niet met "20" dan negeren
06. Bepaal BANKNR via extractie 5e en 6e character uit het antwoord voor weergave op LCD regel 1 positie 7
07. bepaal BANKTAG via string van positie 14 tot einde antwoord voor weergave op LCD regel 1 positie 6
08. plaats BANKNR op 0,7
09. Plaats BANKNR op 1,6
10. plaats BANKTAG op 1,10

Ik ben helemaal nieuw in C dus vergeef me aub beginnersfouten.
Als ik op het juiste spoor geholpen kan worden zou dat helemaal te gek zijn!
Bij voorbaat bedankt!

John

Advertisement

Gebruikers-avatar
Berichten: 1771
Geregistreerd: 06 Aug 2016, 01:03

Re: Strings, hoe te gebruiken

Berichtdoor Koepel » 04 Okt 2017, 14:19

Hallo, welkom op dit forum.

Je zou kunnen beginnen met een eenvoudige 'c' en 'c++' cursus.

Probeer niet meteen naar het resultaat toe werken. Probeer eerst eens van alles uit.
Heb je het voorbeeld "Blink" al geprobeerd ?
Daarna kun lezen van de seriële poort van de computer proberen. In de Arduino IDE zit een seriële monitor, daar kun iets intypen. Dat is een seriële poort die via de USB kabel loopt waarmee de Arduino met de computer verbonden is.
Vervolgens kun een andere sketch maken om het display te proberen.
Vervolgens weer een andere sketch, om droog te oefenen met de tekst. Zet het in een array, en haal er de juiste tekens uit.

Je hebt eigenlijk een verkeerd Arduino board gekozen om aan een scanner te verbinden.
De Arduino Uno heeft maar één seriële poort, en die wordt gebruikt om de sketch te uploaden en voor de seriële monitor.

Wat voor poort heeft die scanner ? Een RS-232 ? Dan heb je een module nodig die er normale ttl-level signalen van maakt.

Het lijkt er een beetje op dat je wilt dat wij jouw sketch gaan maken. Kun je binnen een paar dagen het display werkend krijgen ?

Gebruikers-avatar
Berichten: 3
Geregistreerd: 03 Okt 2017, 14:45

Re: Strings, hoe te gebruiken

Berichtdoor Faramir » 04 Okt 2017, 16:22

Dank voor je reactie en je welkom!
De Arduino Uno wordt ook gebruikt om met een oude HF ontvanger te communiceren zij het met wat electronica erbij.
Die interface heb ik ook gemaakt maar helaas bleek mijn ontvanger te zijn gemodificeerd met een andere poort en software.
De software in kwestie heb ik er niet bij en na vele pogingen ben ik maar gestopt om die te zoeken. Dus een Arduino Uno is beschikbaar.

Mijn scanner (AOR AR-DV1) heeft een seriële poort die verpakt wordt in een USB bus.
Binnen Windows is dan een COM-poort beschikbaar, in Linux komt het ttyUSB device erbij. Met bv PuTTY kan ik dan eenvoudig commando's via COM/ttyUSB naar de scanner sturen.
De Arduino heeft een USB aaansluiting dus ik ging ervan uit dat als de Arduino aan de scanner hangt, er via een USB kabel contact kan worden gemaakt.
De noodzaak van de TTL-level signalen had ik niet verwacht, dat is dus een extra stap die gemaakt moet worden.
Trap ik dus in een oude val: assumption is the mother of all f**k-ups...
Tot nu toe ben ik bezig geweest met wat LED's en met een Blinkenlight shield. Dat kon ik redelijk volgen. "Blink" zegt me zo op het eerste gevoel niets.
De Arduino site kan ik niet zo goed volgen, daar zitten teveel verwijzingen in voor mij, dan raak ik de draad kwijt.
Met de voorbeelden bij het LCD shield is het redelijk te volgen wat er gebeurt.
Er zijn hele basale sketches om de display te gebruiken en de knop routines kom ik volgens mij ook wel uit. Vandaar mijn focus op de strings.

Ik heb wel het een en ander bekeken via het Internet over C maar het wordt me niet duidelijk hoe met strings om te gaan. Er wordt afgeraden om iets als een string te gebruiken, een char benadering zou beter zijn. Het beste lijkt een string te zijn die als een array wordt gedefinieerd. Iets als substring zoals in Excel werd vermeld bij die string aanpak maar daar was men dus niet enthousiast over. Enkele voorbeelden heb ik bekeken maar die haalden maar één teken uit een string en ik moet dingen achter elkaar gaan zetten... Dood spoor dus.

Dat stappenplan is meer om te kijken of ik in de goede richting blijf denken over de aanpak. Mijn hersens zijn niet zo soepel meer (50+) dus ik was nog niet verder gekomen dan het uitelkaar halen van een string. Dat is mijn eerste stap, de rest komt later (evenals een ander bord als dat nodig is).
Wat ik juist NIET wil is dat er iets kant-en-klaar gemaakt wordt, dan snap ik er immers nog niets van! Een voorbeeldje zou ik geweldig vinden maar voor de rest is het een project voor de winteravonden.
Toen de Stille Oceaan nog lawaai maakte heb ik wat gestoeid met Clipper dus echte programmeerkennis heb ik niet.
Is er een beginnerscursus C die je kunt aanbevelen of eventueel een goed leerboek? Ik wist trouwens niet dat C++ ook kon met Arduino. Raad je me eerst C aan of juist eerst C++?

Gebruikers-avatar
Berichten: 4836
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Strings, hoe te gebruiken

Berichtdoor nicoverduin » 04 Okt 2017, 17:55

Door de ontbrekende garbage collection is string af te raden. Je loopt de kans dat het geheugnopgebruikt is terwijl er nog zat is. Een char array is dus beter
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 1771
Geregistreerd: 06 Aug 2016, 01:03

Re: Strings, hoe te gebruiken

Berichtdoor Koepel » 04 Okt 2017, 18:36

Een usb toetsenbord is een usb device.
Een usb muis is een usb device.
Wanneer je dat toetsenbord met de muis verbindt, dan gebeurt er niets.
Een computer is een usb host. Het besturingssysteem heeft ook allerlei drivers voor een muis en een toetsenbord.

Je scanner is een usb device als een seriële poort.
Een Arduino Uno is een usb device als een seriële poort.
Dus je scanner aan de Arduino Uno verbinden is hetzelfde als een muis aan een toetsenbord verbinden.

Er bestaat een usb host shield. Sommige Arduino boards hebben twee usb poorten, waarvan er eentje een usb host is.
Een Arduino Due heeft een usb host, maar ik zie er geen support voor een seriele poort bij staan: https://www.arduino.cc/en/Reference/USBHost.

Een Raspberry Pi is een linux computer, die is ook usb host, net als een computer.

Het omzetten naar ttl-level signalen is alleen nodig bij RS-232. Want die kan voltages tot +15 en -15V gebruiken.

Wanneer je schrijft dat een Arduino Uno beschikbaar is, dan klinkt dat een beetje raar. Je hoeft maar één keer geen appeltaart bij de koffie te nemen, en je hebt al geld voor een Uno clone: https://www.aliexpress.com/item/1pcs-New-2016-UNO-R3-ATmega328P-CH340G-MicroUSB-Compatible-for-Arduino-UNO-Rev-3-0-hei/32689124737.html.
Die goedkope bordjes hebben in Windows nog een extra driver nodig: http://www.wch.cn/download/CH341SER_EXE.html.


De meeste 'c' en 'c++' cursussen gaan er meteen te diep op in.
Je kunt hier doorheen scrollen en eens op een link klikken: https://www.arduino.cc/en/Reference/HomePage.
Een eenvoudige cursus weet ik helaas niet.

Gebruikers-avatar
Berichten: 4836
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Strings, hoe te gebruiken

Berichtdoor nicoverduin » 04 Okt 2017, 19:46

De studenten (UVA) waar ik mee werk hebben c geleerd in een maand (basis kennis) via cs50 van harvard. As woe krijgen ze een eerste kennismaking met arduino. En pointers beginnen ze al aardig te begrijpen:)
Ps. Op edx.org is ook een gratis cs50 cursus. Alleen hebben we hier wat extra spelregels omtrent style testen en memory gebruik
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 2389
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Strings, hoe te gebruiken

Berichtdoor shooter » 05 Okt 2017, 09:54

in een array kun je wel 1 char eruit halen en die dan combineren met een volgende (dan kun je testen of dit gelijk is aan TT en zo voorts, dus van een array maak je dan een andere door te knippen en weer plakken.
paul deelen
shooter@home.nl

Berichten: 147
Geregistreerd: 15 Dec 2012, 21:02
Woonplaats: Delfzijl

Re: Strings, hoe te gebruiken

Berichtdoor FPCUser » 05 Okt 2017, 11:29

Betreft het leren van C/C++ zou je eens kunnen kijken op de volgende site:
http://c-stem.ucdavis.edu/

En dan naar C-STEM studio. Daarin zit een C/C++ interpreter :) en (ook leuk) Ch aruino.
Voor een raspberry pi is het gratis.
Je kan een image downloaden -C-STEMbian-of het in een bestaande installatie toevoegen.

In ch Aruino zitten twee tekstboeken (PDF), het verschil tussen beide is
Differences Between ”Learning Arduino in Ch for the Absolute
Beginner” and ”Learning Arduino in C”

There are two versions of this textbook, one that teaches how to program an Arduino in the C programming
language and another that teaches how to program the Arduino in the C/C++ interpretor Ch. The idea
behind creating these two versions was so that the material would be engaging and understandable to
student of different programming backgrounds and skill-sets. The ”Learning Arduino in Ch for the Absolute
Beginner” book was designed for those students with the smallest amount of programming experiences, such
as for the absolute beginner students in middle school. The ”Learning Arduino in C” book was designed for
student with slightly more experience, though still beginners, and has a target age range of students in high
school or college.


link naar documentatie van Ch:
http://www.softintegration.com/products/chprofessional/

Gebruikers-avatar
Berichten: 98
Geregistreerd: 23 Dec 2011, 00:11
Woonplaats: Enschede

Re: Strings, hoe te gebruiken

Berichtdoor bigred » 06 Okt 2017, 08:33

Ik heb een tijd geleden zoiets gemaakt om de frequentie van mijn Kenwood TS2000 uit te lezen:

Code: Alles selecteren
long previousMillis = 0;


void setup() 
{
  Serial.begin(9600);
  Serial1.begin(9600); 
}

void loop()                     
  {
  rs232tx();
  if (Serial1.available()) {
      String data = Serial1.readString();
      int startfreq = (data.indexOf('A') +2);
      int endfreq = (data.indexOf(';', startfreq));
      String freq = data.substring(startfreq,endfreq);
      Serial.print(data);

  }
}

void rs232tx() {
    long interval = 100;
    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > interval) {
      previousMillis = currentMillis;
      Serial1.println("FA;");
      Serial.println("");
    }
}


Bij mij zit de gevraagde data tussen de A + 2 en de ; (de A en de ; zijn altijd hetzelfde in de string die ik van de kenwood terug krijg).
Omdat dit een simpel proefje was heb ik een Arduino mega gebruikt, die heeft meerdere serial aansluitingen vandaar de serial en serial1.

Gebruikers-avatar
Berichten: 3
Geregistreerd: 03 Okt 2017, 14:45

Re: Strings, hoe te gebruiken

Berichtdoor Faramir » 09 Okt 2017, 08:36

Met de aangedragen informatie kan ik ruim vooruit!
De voorbeeldcode is heel leerzaam en de cursus- en boektips geven ruime mogelijkheden.
Jullie allemaal geweldig bedankt!!

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Google Adsense [Bot] en 1 gast