Hallo luitjes,

Ik ben bezig met Dynamic C om een Rabbit microcontroller te programmeren. Nou laat ik via UDP data in, om hiermee vervolgens een proces aan te sturen. De string die binnen komt in bijvoorbeeld dit


[7 karakters nuttige data][en een hoop junk]
1234567asdvdsfds%&

en ik krijg een return value van 7

De controller herkent dus dat er 7 bytes interresante data mee komt, de rest is ouwe meuk van de vorige instructie, of control characters.

Hoe kan ik in (Dynamic) C (Dynamic C en C zijn hetzelfde qua syntax alleen er zijn meer commando's toegevoegd voor de Rabbit aan te sturen), het volgende doen:

Ik wil het aantal nuttige tekens (aantal is opgeslagen in "retval" dat is een variabele), uit de string trekken.

In Visual Basic zou ik het volgende doen:


Test$ = Left$(Test$, Retval)

Hoe doe ik dit in C ?

Groeten
Antoine

Ik weet dat het programmeren is, maar het heeft met uC's te maken dus hopelijk wordt ie niet gesloten :)

$boeiend = substr($test,0,$retval);

mits je een lib hebt die uberhaupt stringfuncties wil ondersteunen, that is ;) Mogelijk heb je dan ook een left() functie?

Heren,

Ik had die library (strings.h), al gevonden, echter ik kon nou niet zeggen dat ik er iets nuttigs van kon zeggen :), dat hele C is nog compleet abracadabra voor mij

Echter Benm,

Mijn variabelen heetten "buf" (daar zit de string in), en "retval" (het nuttige aantal)

Echter die "$"'s moeten die er dan bij staan ?

Ik ga het morgen gelijk proberen :D

Groeten
Antoine

Op 29 september 2003 19:09:03 schreef Antoine:
Heren,

Ik had die library (strings.h), al gevonden, echter ik kon nou niet zeggen dat ik er iets nuttigs van kon zeggen :), dat hele C is nog compleet abracadabra voor mij

Als je die strings.h eens bekijkt kan je zien welke functies beschikbaar zijn. Meestal staat er ook wel commentaar bij zodat je weet wat een functie doet.
Beter is natuurlijk gewoon een reference manual van dat Dynamic C.

Mijn variabelen heetten "buf" (daar zit de string in), en "retval" (het nuttige aantal)

Da's alleen het naampje. Benm gaf ook slechts een voorbeeld. De naam in het voorbeeld kan je dus gewoon vervangen door je eigen naam.

[qoute]
Echter die "$"'s moeten die er dan bij staan ?
[/qoute]

Ik denk dat Benm C een beetje verward met PHP of Perl (daar gebruik je altijd een $ voor een variabele). In C doe je dat niet.

Verder kent mijn oude vertrouwde Borland C++ 3.11 de functie substr niet. Deze functie bestaat wel in PHP en mogelijk in Perl (zo bekend ben ik niet met Perl). Het zou kunnen dat deze functie wel aanwezig in jou library. Dat moet je maar even checken.

De functie strncpy is ANSI C (een standaard). De kans dat die aanwezig in jou string library is veel groter.

Uit mijn manual


  strncpy

  Copies at most maxlen characters of src to dest

  Declaration:
   _ char *strncpy(char *dest, const char *src, size_t maxlen);

Marcel

Volgens mij is Menno de enige die de juiste C-call geeft voor jouw probleem: strncpy(). Deze functie kopieert een aantal karakters uit 1 string naar een andere.

prototype:


char *strncpy(char *dest, const char *src, size_t n);

hierbij is dest het adres van de doel-string, src de string die je tekens bevat, en n het char *strncpy(char *dest, const char *src, size_t n);aantal tekens.

Als ik je variabelen goed heb krijg je dus iets als:
(ik heb hier een nieuwe variabele aangemaakt om de nieuwe string in te bewaren. Het is met de strncpy() funktie niet mogelijk om overlappend te kopieeren.


char doelString[16];
strncpy(doelString, buf, retval);

Om de van de 'doelString' een C string te maken moet die afgesloten worden met een NULL karakter. Je moet de code dus uitbreiden met:


doelString[retval] = 0;

Veel Suc6, Jeroen.

Jeroen,

Da's heldere taal ! Ik ga het nu gelijk proberen (zit op me werk), daar heb ik die rabbit's ook liggen. Straks meer als het wel of niet gelukt is !

Groeten
Antoine

:D:D:D:D:D

Geweldig het werkt perfect !!!

Bedankt !
Antoine

Okay, nog eentje


while ((length = serCread(buf, MAXSIZE-1, TIMEOUT)) == 0) ;

Mijn vraag wat wordt hier bedoeld ?

Wat ik denk is het volgende

Schrijf de waarde die de instructie serCread(blablabla) naar "length" zolang deze 0 is ?

Wederom wie kan mij hier mee helpen

Alvast bedankt
Antoine

[edit]
MAXSIZE en TIMEOUT zijn constanten, MAXSIZE = 128, TIMEOUT = 20
[/edit]

[Bericht gewijzigd door Antoine op ]

Ik denk dat Benm C een beetje verward met PHP of Perl (daar gebruik je altijd een $ voor een variabele). In C doe je dat niet.

Indeed, too much web-scripting made me a bad programmer ;)

Op 30 september 2003 10:45:06 schreef Antoine:
Okay, nog eentje


while ((length = serCread(buf, MAXSIZE-1, TIMEOUT)) == 0) ;

Mijn vraag wat wordt hier bedoeld ?

Wat ik denk is het volgende

Schrijf de waarde die de instructie serCread(blablabla) naar "length" zolang deze 0 is ?

Bijna goed...

Hier wordt de waarde die de funktie serCread() opleverd in 'length' geplaatst, net zolang totdat deze ongelijk is aan 0.

Met andere woorden, blijf proberen iets te lezen totdat je werkelijk iets gelezen hebt. Hierbij worden (waarschijnlijk) de gelezen karakters in 'buf' geplaatst. Length geeft dan aan hoeveel karakters er in 'buf' geplaatst zijn.

Denk er hierbij ook aan dat als je van 'buf' een c-string wilt maken je weer een NULL moet toevoegen...

buf[length] = 0;

Jeroen

Dat van die buf[length] = 0 had ik al toegevoegd.

Okee, dat maakt het weer een stuk duidelijk waarom hij daar zo lang blijft staan wachten :)

Maareh die "==" is dus "niet gelijk aan" is een enkele "=" dan "wel gelijk aan" ?

Groeten
Antoine

Op 30 september 2003 13:28:58 schreef Antoine:
Dat van die buf[length] = 0 had ik al toegevoegd.

Okee, dat maakt het weer een stuk duidelijk waarom hij daar zo lang blijft staan wachten :)

Maareh die "==" is dus "niet gelijk aan" is een enkele "=" dan "wel gelijk aan" ?

Groeten
Antoine

'=='is vergelijken, en '=' is "toekennen aan"

Oftwel:
a==8
betekend: is a gelijk aan 8?

en
a=8
betekend: a is vanaf nu gelijk aan 8

[Bericht gewijzigd door Bastiaan op ]

Op 30 september 2003 13:34:50 schreef Bastiaan:
a==8
betekend: is a gelijk aan 8?

en
a=8
betekend: a is vanaf nu gelijk aan 8

Maar, in het tweede geval (a=8) wordt ook de waarde van de expressie (nu dus 8) als logische waarde gebruikt. Met andere woorden:


if (a=8)
{
    printf("Dit is waar\n");
}
else
{
    printf("Dit is niet waar\n");
}

zal atijd 'Dit is waar' afdrukken.

Van dit principe had ook gebruik gemaakt kunnen worden in de eerder genoemde while-lus:


while (!(length = serCread(buf, MAXSIZE-1, TIMEOUT))) ;

Nu wordt de vergelijking met 0 (=false) 'impliciet' gedaan.
De leesbaarheid gaat er in dit geval zeker niet op vooruit, maar je zal het in heel veel code tegenkomen.

Ik wil niet lullig doen, maarehh .. dit heb nix meer te doen met electronica...

Op 30 september 2003 16:08:37 schreef menno:
Ik wil niet lullig doen, maarehh .. dit heb nix meer te doen met electronica...

Dit is voor de programmering van een microcontroller. Oftwel embedded C, iets wat wel degelijk met elektro van doen heeft. ;)

In eerste instantie wel, ja. Maar inmiddels wordt het meer een cursus C voor beginners.

Op 30 september 2003 16:10:06 schreef Bastiaan:

[...]

Dit is voor de programmering van een microcontroller. Oftwel embedded C, iets wat wel degelijk met elektro van doen heeft. ;)

Dank je, en ik heb er baat bij want ik snap er soms geen hol van van dat C :)

Maareh, als dat == dan ongelijk is aan nul, hoe zou ik het dan aan moeten geven van is wel gelijk aan nul ?

Op 30 september 2003 18:50:16 schreef Antoine:
Maareh, als dat == dan ongelijk is aan nul, hoe zou ik het dan aan moeten geven van is wel gelijk aan nul ?

Uhhh... ikke jouw vraag niet begrijpe?
In C is 0 per definitie FALSE, en alle andere waarden TRUE. Als je logische vergelijkingen wilt maken kan dat met:
== : is gelijk aan
!= : is ongelijk aan
> : is groter dan
etc...

Als je de logica wil omdraaien, kan je het uitroepteken gebruiken. Bijvoorbeeld:

(2>1) : FALSE
!(2>1) : TRUE

Wellicht heeft menno hier toch wel een beetje een punt dat het wat meer op een C-cursus begint te lijken... Maar zolang de mods het goed vinden gaan we rustig door. :p

Wat ben je eigenlijk precies met die Rabbit aan het maken?

Maar jij zegt daar dat == 0 is "indien x gelijk is aan 0 dan", maar daar boven zeg je dat "== 0" is ongelijk aan nul bij die while loop ?

Een UDP <-> Serieel converter

[Bericht gewijzigd door Antoine op ]

Op 30 september 2003 22:07:01 schreef Antoine:
Een UDP <-> Serieel converter zodat ik via TCP/IP met een IP adres een serie apparaten aan kan sturen

Ik heb net even op jouw(?) website gekeken, en ik zag daar inderdaad iets op staan van een COM-poort naar een UDP verbinding. Wat voor een protocol draai je over de serieele poort? SLIP? Of iets van jezelf? Ik ben nu bezig met een eigen SLIP(-achtige) implementatie te maken voor een klant die een machine moet aansturen via het netwerk maar geen vrije TCP/IP poorten heeft op zijn machine. Erg interessant!

Op 30 september 2003 18:49:14 schreef Antoine:
[...]
Dank je, en ik heb er baat bij want ik snap er soms geen hol van van dat C :)

Is goed ;)

Menno heeft wel gelijk. Eigenlijk kun je voor dit soort dingen beter gewoon zoeken met google naar de codes en sites die info over de taal C hebben. (en dat zijn een heleboel sites).
Maar aangezien jij er baat bij hebt, jullie tenminste normaal discussieren en elkaar helpen, het uiteindelijk gaat om embedded C, laat ik dit topic vrolijk doorlopen.
;)

Op 30 september 2003 22:54:17 schreef Bastiaan:
Maar aangezien jij er baat bij hebt, jullie tenminste normaal discussieren en elkaar helpen, het uiteindelijk gaat om embedded C, laat ik dit topic vrolijk doorlopen.
;)

Gelijke monniken, andere kappen ...

Op 30 september 2003 22:14:11 schreef Jeroen Koeter:

[...]

Ik heb net even op jouw(?) website gekeken, en ik zag daar inderdaad iets op staan van een COM-poort naar een UDP verbinding. Wat voor een protocol draai je over de serieele poort? SLIP? Of iets van jezelf? Ik ben nu bezig met een eigen SLIP(-achtige) implementatie te maken voor een klant die een machine moet aansturen via het netwerk maar geen vrije TCP/IP poorten heeft op zijn machine. Erg interessant!

Ehh Jeroen,

Dat heeft niets met E-Train te maken hoor :), laat dat ff duidelijk zijn. Ik heb naast e-train ook nog gewoon werk, en daar ben ik er mee bezig, en de reden dat ik het hier vraag is omdat ik er op internet maar weinig van kan vinden (ik zal wel verkeerd zoeken maar goed).