Connecting Tech Pros Worldwide Forums | Help | Site Map

how to print ASCII "ETX" character?

jeffpierce12@hotmail.com
Guest
 
Posts: n/a
#1: Oct 20 '06
Hello,

I am trying to send some characters to a scanner that I have hooked up
to the COM 1 port on my PC. I am running Linux operating system, and I
have the following sample program:

#include <stdio.h>

int main (void)
{
FILE *fd;

fd = fopen("/dev/ttyS0", "w");
fprintf (fd, "2");
fprintf (fd, "B");
<here>
fprintf (fd, "0");
fprintf (fd, "A");

fclose(fd);
return 0;
}

At the <hereline, I would like to send to the device an ASCII "ETX"
character, which is a hex 03. What is the syntax of the fprintf
statement to do this?

Thank you.


Michael
Guest
 
Posts: n/a
#2: Oct 20 '06

re: how to print ASCII "ETX" character?


Quote:
#include <stdio.h>
>
int main (void)
{
FILE *fd;
>
fd = fopen("/dev/ttyS0", "w");
fprintf (fd, "2");
fprintf (fd, "B");
<here>
fprintf (fd, "0");
fprintf (fd, "A");
>
fclose(fd);
return 0;
}
>
At the <hereline, I would like to send to the device an ASCII "ETX"
character, which is a hex 03. What is the syntax of the fprintf
statement to do this?
fprintf(fd, "%c", 0x03);

Note: You should also change your other fprintfs to look like:
fprintf(fd, "%c", '2');
etc.

fprintf is expecting a file descriptor, a format argument, and
argument(s) to that. The code you have will work, but is dangerous. I
once had to track down a seg fault where someone had done this:
void foo(char* str) {
fprintf(fd, str);
}
instead of
void foo(char* str) {
fprintf(fd, "%s", str);
}


That worked fine until str contained a percent sign, then it seg
faulted.

Be nice to future programmers; use the correct form.

Michael

Walter Roberson
Guest
 
Posts: n/a
#3: Oct 20 '06

re: how to print ASCII "ETX" character?


In article <1161380239.478518.62890@f16g2000cwb.googlegroups. com>,
<jeffpierce12@hotmail.comwrote:
Quote:
>At the <hereline, I would like to send to the device an ASCII "ETX"
>character, which is a hex 03. What is the syntax of the fprintf
>statement to do this?
Choices:

putc(0x03, fd);

fprintf(fd, "\3");

fprintf(fd, "%c", 3);


It is recommended not to use fprintf() if you are not doing any
formatting -- putc() and fputs() and fwrite() are usually more
efficient.

--
I was very young in those days, but I was also rather dim.
-- Christopher Priest
Mike Wahler
Guest
 
Posts: n/a
#4: Oct 20 '06

re: how to print ASCII "ETX" character?



<jeffpierce12@hotmail.comwrote in message
news:1161380239.478518.62890@f16g2000cwb.googlegro ups.com...
Quote:
Hello,
>
I am trying to send some characters to a scanner that I have hooked up
to the COM 1 port on my PC. I am running Linux operating system, and I
have the following sample program:
>
#include <stdio.h>
>
int main (void)
{
FILE *fd;
>
fd = fopen("/dev/ttyS0", "w");
fprintf (fd, "2");
This will write two characters to 'fd':
'2' and '\0'. Is that what you wanted?
Quote:
fprintf (fd, "B");
This will write two characters to 'fd':
'B' and '\0'. Is that what you wanted?
Quote:
<here>
fprintf (fd, "0");
This will write two characters to 'fd':
'0' and '\0'. Is that what you wanted?
Quote:
fprintf (fd, "A");
This will write two characters to 'fd':
'A' and '\0'. Is that what you wanted?
Quote:
fclose(fd);
return 0;
}
>
At the <hereline, I would like to send to the device an ASCII "ETX"
character, which is a hex 03. What is the syntax of the fprintf
statement to do this?
if(fprintf(fd, "%c", (char)3) != 1)
; /* something wrong */


Note that the format specifier for a single character
is %c, not %s.

Also, in all cases, you should be checking the return
value from 'fprintf()'. It can fail, but you won't
know unless you check.


-Mike


Walter Roberson
Guest
 
Posts: n/a
#5: Oct 20 '06

re: how to print ASCII "ETX" character?


In article <5Db_g.16446$UG4.10297@newsread2.news.pas.earthlin k.net>,
Mike Wahler <mkwahler@mkwahler.netwrote:
Quote:
Quote:
>fprintf (fd, "2");
Quote:
>This will write two characters to 'fd':
>'2' and '\0'. Is that what you wanted?
No it won't. The \0 of the string literal "2" terminates the
format -- otherwise -every- printf and fprintf would put in the
extra \0.
--
"law -- it's a commodity"
-- Andrew Ryan (The Globe and Mail, 2005/11/26)
SM Ryan
Guest
 
Posts: n/a
#6: Oct 21 '06

re: how to print ASCII "ETX" character?


jeffpierce12@hotmail.com wrote:
# Hello,
#
# I am trying to send some characters to a scanner that I have hooked up
# to the COM 1 port on my PC. I am running Linux operating system, and I
# have the following sample program:
#
# #include <stdio.h>
#
# int main (void)
# {
# FILE *fd;
#
# fd = fopen("/dev/ttyS0", "w");
# fprintf (fd, "2");
# fprintf (fd, "B");
# <here>
# fprintf (fd, "0");
# fprintf (fd, "A");

You can embed characters except '\0' in a string and print
them out alongside printable character.

So you could do
fputs("2B\x03" "0A",fd);

#define ETX "\x03"
fputs("2B" ETX "0A",fd);

fputc('2',fd); fputc('B',fd); fputc(3,fd); fputc('0',fd); fputc('A',fd);

enum {ETX=3};
fputc('2',fd); fputc('B',fd); fputc(ETX,fd); fputc('0',fd); fputc('A',fd);

fprintf(fd,"2B\x03" "0A");

#define ETX "\x03"
fprintf(fd,"2B" ETX "0A");

enum {ETX=3};
fprintf(fd,"2B%c0A",ETX);

You can sometmes #define strings that make commands and let the
compiler paste them together.
#define ESC "\x1B"
#define BEGIN_ROLE ESC "char("
#define END_ROLE ")"
#define ARTICHOKE_MODE BEGIN_ROLE "poor little artie" END_ROLE
#define CLOTHES_MODE ESC "clothes;"
#define CLOSE "\x18"
printf(
CLOSE "B" CLOTHES_MODE
CLOSE ARTICHOKE_MODE
"\nWhy he's just a rainbow!\n");

--
SM Ryan http://www.rawbw.com/~wyrmwif/
No pleasure, no rapture, no exquisite sin greater than central air.
Mike Wahler
Guest
 
Posts: n/a
#7: Oct 21 '06

re: how to print ASCII "ETX" character?



"Walter Roberson" <roberson@ibd.nrc-cnrc.gc.cawrote in message
news:ehbhia$jd8$1@canopus.cc.umanitoba.ca...
Quote:
In article <5Db_g.16446$UG4.10297@newsread2.news.pas.earthlin k.net>,
Mike Wahler <mkwahler@mkwahler.netwrote:
>
Quote:
Quote:
>>fprintf (fd, "2");
>
Quote:
>>This will write two characters to 'fd':
>>'2' and '\0'. Is that what you wanted?
>
No it won't. The \0 of the string literal "2" terminates the
format -- otherwise -every- printf and fprintf would put in the
extra \0.
Oops, you're right; I was thinking of 'sprintf()'.

-Mike


Peter Shaggy Haywood
Guest
 
Posts: n/a
#8: Oct 24 '06

re: how to print ASCII "ETX" character?


Groovy hepcat Mike Wahler was jivin' on Sat, 21 Oct 2006 02:24:39 GMT
in comp.lang.c.
Re: how to print ASCII "ETX" character?'s a cool scene! Dig it!
Quote:
>"Walter Roberson" <roberson@ibd.nrc-cnrc.gc.cawrote in message
>news:ehbhia$jd8$1@canopus.cc.umanitoba.ca...
Quote:
>In article <5Db_g.16446$UG4.10297@newsread2.news.pas.earthlin k.net>,
>Mike Wahler <mkwahler@mkwahler.netwrote:
>>
Quote:
>>>fprintf (fd, "2");
>>
Quote:
>>>This will write two characters to 'fd':
>>>'2' and '\0'. Is that what you wanted?
>>
>No it won't. The \0 of the string literal "2" terminates the
>format -- otherwise -every- printf and fprintf would put in the
>extra \0.
>
>Oops, you're right; I was thinking of 'sprintf()'.
No you weren't, because that does the same thing as fprintf(), but
sending its output to memory rather than a file.

--

Dig the even newer still, yet more improved, sig!

http://alphalink.com.au/~phaywood/
"Ain't I'm a dog?" - Ronny Self, Ain't I'm a Dog, written by G. Sherry & W. Walker.
I know it's not "technically correct" English; but since when was rock & roll "technically correct"?
Peter Shaggy Haywood
Guest
 
Posts: n/a
#9: Oct 24 '06

re: how to print ASCII "ETX" character?


Groovy hepcat Peter "Shaggy" Haywood was jivin' on Tue, 24 Oct 2006
03:53:53 GMT in comp.lang.c.
Re: how to print ASCII "ETX" character?'s a cool scene! Dig it!
Quote:
>Groovy hepcat Mike Wahler was jivin' on Sat, 21 Oct 2006 02:24:39 GMT
>in comp.lang.c.
>Re: how to print ASCII "ETX" character?'s a cool scene! Dig it!
>
Quote:
>>"Walter Roberson" <roberson@ibd.nrc-cnrc.gc.cawrote in message
>>news:ehbhia$jd8$1@canopus.cc.umanitoba.ca...
Quote:
>>In article <5Db_g.16446$UG4.10297@newsread2.news.pas.earthlin k.net>,
>>Mike Wahler <mkwahler@mkwahler.netwrote:
>>>
>>>>fprintf (fd, "2");
>>>
>>>>This will write two characters to 'fd':
>>>>'2' and '\0'. Is that what you wanted?
>>>
>>No it won't. The \0 of the string literal "2" terminates the
>>format -- otherwise -every- printf and fprintf would put in the
>>extra \0.
>>
>>Oops, you're right; I was thinking of 'sprintf()'.
>
No you weren't, because that does the same thing as fprintf(), but
>sending its output to memory rather than a file.
Of course, it does store a '\0' at the end. So perhaps you were
thinking of sprintf() after all. :)

--

Dig the even newer still, yet more improved, sig!

http://alphalink.com.au/~phaywood/
"Ain't I'm a dog?" - Ronny Self, Ain't I'm a Dog, written by G. Sherry & W. Walker.
I know it's not "technically correct" English; but since when was rock & roll "technically correct"?
Closed Thread


Similar C / C++ bytes