Tania_M
Bachelorette in de Elektronica, Afstudeerrichting Telecommunicatie; bijna Master in de Electronica, Ontwerptechnieken
Hallo,
Om een code-error-detectiebyte te maken, moet ik een string met de te vesrsturen karakters hebben. Nu kan ik in C we allemaal tekens achterelkaar zetten met sprintf, maar hoe krijg je er weer een non-printable karakter tussen.
bvb: ik moet een string hebben die dit moet bevatten:
0x01 + "1234" + 0x01 + "5678"
Voor de vraag wat dit met electro te maken heeft:
Dit komt in een MCU die volgens het juiste protocol een code moet doorsturen via RS232 naar ee PC. In dat protocol zit ook een Block Check Charakter, of foutdetectie.
Tania
Kijk eens hier: http://www.cplusplus.com/doc/tutorial/tut1-2.html
Additionally, you can express any character by its numerical ASCII code by writing an inverted slash bar character (\) followed by the ASCII code expressed as an octal (radix-8) or hexadecimal (radix-16) number. In the first case (octal) the number must immediately follow the inverted slash (for example \23 or \40), in the second case (hexacedimal), you must put an x character before the number (for example \x20 or \x4A).
Bedoel je dat ?
Tania_M
Bachelorette in de Elektronica, Afstudeerrichting Telecommunicatie; bijna Master in de Electronica, Ontwerptechnieken
Bedankt voor je reactie, heb ik al geprobeert, maar werkt niet.Ben misschien vergeten te melden, maar programmeer in C (niet C++)
Op 28 april 2004 15:09:30 schreef Tania_M:
Bedankt voor je reactie, heb ik al geprobeert, maar werkt niet.Ben misschien vergeten te melden, maar programmeer in C (niet C++)
Nee hoor, dat ben je niet vergeten.
Maar zo werkt het in C (en dus ook in C++).
Kijk ook maar eens op http://www.scit.wlv.ac.uk/cbook/chap4.char.html
The above are called escape sequences. There are also escape sequences that allow the bit representations of characters in octal or hexadecimal notation. Typically these look like
'\16' or '\xe'
the first being an octal escape sequence and the second being a hexadecimal escape sequence. Octal escape sequences may consist of up to three digits. Unlike octal constants there is no need for an initial zero.
Of het ook op een andere manier kan weet ik zo niet.
Tania_M
Bachelorette in de Elektronica, Afstudeerrichting Telecommunicatie; bijna Master in de Electronica, Ontwerptechnieken
kun je dan mijn voorbeeld dat ik in de eerste post geef eens uitwerken?
sprintf(test,.............);
[Bericht gewijzigd door Tania_M op ]
Op 28 april 2004 15:26:39 schreef Tania_M:
kun je dan mijn voorbeeld dat ik in de eerste post geef eens uitwerken?sprintf(test,.............);
Nu heb je je voorbeeld al 2 maal geëdit 
Maar ik ben nu aan het stage lopen, ik kijk vanavond wel even. Dan krijg je morgenochtend antwoord.
Op 28 april 2004 15:26:39 schreef Tania_M:
kun je dan mijn voorbeeld dat ik in de eerste post geef eens uitwerken?
Nou dat was niet zo moeilijk.
printf("\x01""1234\x01""5678");Je kunt dus gewoon "\x???" gebruiken waarbij ??? het hexadecimale ASCII getal is dat bij je karakter hoort.
Je moet alleen even opppassen wanneer er daarna een cijfer of een letter van a...f of A...F volgt, dan met je even twee aanhalingstekens plaatsen.
Anders raakt je compiler in de war: hij weet dan niet waar het cijfer / de letter bij hoort en zal denken dat deze bij het hexadecimale getal hoort.
Edit: Oh ja, jij gebruikte sprintf voor het schijven naar een string. Dat wordt dan dus:
sprintf(string,"\x01""1234\x01""5678");[Bericht gewijzigd door Remco op ]
Tania_M
Bachelorette in de Elektronica, Afstudeerrichting Telecommunicatie; bijna Master in de Electronica, Ontwerptechnieken
Heb ik dus ook al geprobeert, maar de compiler blijft raar doen. Zal eens een andere proberen. Mocht het niet lukken, dan zet ik hier wel eens een stuk van de code, misschien zien jullie dan wat fout is.
Ik heb het na mijn post ook nog even in één van mijn C (niet C++) boeken opgezocht, en daar staat het net zo in. (behalve dat met die twee maal aanhalingtekens)
Ik heb mijn code getest met twee compilers te weten: Borland C++ 5 en C++ builder 5.
Ik ben er dus vrij zeker van dat dit ANSI C correct is, en denk dus dat het inderdaad aan jouw compiler ligt.
Tania_M
Bachelorette in de Elektronica, Afstudeerrichting Telecommunicatie; bijna Master in de Electronica, Ontwerptechnieken
char packet [64];
char *p = packet;
int res =0;
sprintf(packet,"\x01""\x02""1\x1F""0701\x1E""2\x1F""HALLO\x1E""3\x1F""2\x03");
res = appendBCC( packet, sizeof( packet ) );
Compiler Imagecraft ICC AVR
Als ik met AVRSTUDIO4 simuleer vind ik niets terug.
Tania_M
Bachelorette in de Elektronica, Afstudeerrichting Telecommunicatie; bijna Master in de Electronica, Ontwerptechnieken
edit: Foutje
[Bericht gewijzigd door Tania_M op ]
Kun je wachten tot vanavond of morgen ?
Ik heb nog wel een idee, maar deze moet ik even uitwerken & testen.
Tania_M
Bachelorette in de Elektronica, Afstudeerrichting Telecommunicatie; bijna Master in de Electronica, Ontwerptechnieken
Merci, lees het morgen dan wel.
Edit: Iss ondertussen al (gedeeltlijk) opgelost Hoedanook bedankt.
[Bericht gewijzigd door Tania_M op ]
Toch nog een oplossing 2:
sprintf(string,"%c1234%c5678",1,1);dit is precies hetzelfde als:
sprintf(string,"\x01""1234\x01""5678");Je houd gewoon je sprintf, je vervangt al je niet afdrukbare tekens door %c en vult na je tekst de ascii nummers van de tekens in.