We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I need to syntax check incomming queries/commands on the UART and i would like some idears on how to do it. The syntax of the commands are as follow:
Syntax required for a query is: @<device address><query>?;FF
Syntax required for a command is: @<device address><command>!<parameter>;FF
Examples: Query current baud rate: @253BR?;FF Change baud rate to 19200: @253BR!19200;FF where: @ <attention character> 253 <device address> BR? <query> (for query syntax) BR!19200 <command>!<parameter> (for command syntax) ;FF <terminator>
Please note the termination is ;FF and not CR or LF.
Is it possible to use the scanf() function for this task? Something like this perhaps:
scanf("@%3s%2s?;FF", adr, command);
Thanks for your reply.
I have tried your suggestion, but i can't get it to work with the terminating string ";FF". Matching chars in the beginning of the format string works fine, but it seem like the scanf function will ignore any matching chars at the end of the format string.
actual = scanf("@%uBR!%u;\xFF", &devAddr, &baudRate);
Maybe its a bug in the scanf function.
Is ";FF" supposed to be a 3-character string (a semicolon and two 'F' characters), or just 2 bytes (a semicolon and a 0xFF byte) ?
but it seem like the scanf function will ignore any matching chars at the end of the format string.
How did you arrive at that conclusion? In other words, what made it seem like this?
scanf() is for students. It has too many issue to be used in the real world.
use the other input functions (getch(), gets()) then parse the data your self. This allows you to verify the data is valid. scanf() may not like some data. It will then hang waiting for more data. Or, try to use the next peice on input.
Yes i need a ";FF" 3 char string as termination and not the usual CR.
The following code illustrates the scanf function will ignore the matching chars in the end of the format string:
printf("\nEnter a number: "); while (1) {
if (scanf("%d;FF",&n)) break;
scanf("%s", &tmp); //Clear input stream }
printf("You wrote %d", n);
Output: Enter a number: 3;FFYou wrote 3 Enter a number: 4 (CR) You wrote 4 Enter a number:
In the first line scanf returns correctly as ";FF" is entered. But in the second line i press CR after the number 4, and scanf ignores the ";FF" in the format string.