##// END OF EJS Templates
Port enumeration Works on linux
jeandet@pc-de-jeandet3.LAB-LPP.LOCAL -
r34:981d3945a0ec alexis
parent child
Show More
This diff has been collapsed as it changes many lines, (527 lines changed) Show them Hide them
@@ -0,0 +1,527
1 #!/bin/sh
2 # install - install a program, script, or datafile
3
4 scriptversion=2011-01-19.21; # UTC
5
6 # This originates from X11R5 (mit/util/scripts/install.sh), which was
7 # later released in X11R6 (xc/config/util/install.sh) with the
8 # following copyright and license.
9 #
10 # Copyright (C) 1994 X Consortium
11 #
12 # Permission is hereby granted, free of charge, to any person obtaining a copy
13 # of this software and associated documentation files (the "Software"), to
14 # deal in the Software without restriction, including without limitation the
15 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16 # sell copies of the Software, and to permit persons to whom the Software is
17 # furnished to do so, subject to the following conditions:
18 #
19 # The above copyright notice and this permission notice shall be included in
20 # all copies or substantial portions of the Software.
21 #
22 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26 # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
27 # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 #
29 # Except as contained in this notice, the name of the X Consortium shall not
30 # be used in advertising or otherwise to promote the sale, use or other deal-
31 # ings in this Software without prior written authorization from the X Consor-
32 # tium.
33 #
34 #
35 # FSF changes to this file are in the public domain.
36 #
37 # Calling this script install-sh is preferred over install.sh, to prevent
38 # `make' implicit rules from creating a file called install from it
39 # when there is no Makefile.
40 #
41 # This script is compatible with the BSD install script, but was written
42 # from scratch.
43
44 nl='
45 '
46 IFS=" "" $nl"
47
48 # set DOITPROG to echo to test this script
49
50 # Don't use :- since 4.3BSD and earlier shells don't like it.
51 doit=${DOITPROG-}
52 if test -z "$doit"; then
53 doit_exec=exec
54 else
55 doit_exec=$doit
56 fi
57
58 # Put in absolute file names if you don't have them in your path;
59 # or use environment vars.
60
61 chgrpprog=${CHGRPPROG-chgrp}
62 chmodprog=${CHMODPROG-chmod}
63 chownprog=${CHOWNPROG-chown}
64 cmpprog=${CMPPROG-cmp}
65 cpprog=${CPPROG-cp}
66 mkdirprog=${MKDIRPROG-mkdir}
67 mvprog=${MVPROG-mv}
68 rmprog=${RMPROG-rm}
69 stripprog=${STRIPPROG-strip}
70
71 posix_glob='?'
72 initialize_posix_glob='
73 test "$posix_glob" != "?" || {
74 if (set -f) 2>/dev/null; then
75 posix_glob=
76 else
77 posix_glob=:
78 fi
79 }
80 '
81
82 posix_mkdir=
83
84 # Desired mode of installed file.
85 mode=0755
86
87 chgrpcmd=
88 chmodcmd=$chmodprog
89 chowncmd=
90 mvcmd=$mvprog
91 rmcmd="$rmprog -f"
92 stripcmd=
93
94 src=
95 dst=
96 dir_arg=
97 dst_arg=
98
99 copy_on_change=false
100 no_target_directory=
101
102 usage="\
103 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
104 or: $0 [OPTION]... SRCFILES... DIRECTORY
105 or: $0 [OPTION]... -t DIRECTORY SRCFILES...
106 or: $0 [OPTION]... -d DIRECTORIES...
107
108 In the 1st form, copy SRCFILE to DSTFILE.
109 In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
110 In the 4th, create DIRECTORIES.
111
112 Options:
113 --help display this help and exit.
114 --version display version info and exit.
115
116 -c (ignored)
117 -C install only if different (preserve the last data modification time)
118 -d create directories instead of installing files.
119 -g GROUP $chgrpprog installed files to GROUP.
120 -m MODE $chmodprog installed files to MODE.
121 -o USER $chownprog installed files to USER.
122 -s $stripprog installed files.
123 -t DIRECTORY install into DIRECTORY.
124 -T report an error if DSTFILE is a directory.
125
126 Environment variables override the default commands:
127 CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
128 RMPROG STRIPPROG
129 "
130
131 while test $# -ne 0; do
132 case $1 in
133 -c) ;;
134
135 -C) copy_on_change=true;;
136
137 -d) dir_arg=true;;
138
139 -g) chgrpcmd="$chgrpprog $2"
140 shift;;
141
142 --help) echo "$usage"; exit $?;;
143
144 -m) mode=$2
145 case $mode in
146 *' '* | *' '* | *'
147 '* | *'*'* | *'?'* | *'['*)
148 echo "$0: invalid mode: $mode" >&2
149 exit 1;;
150 esac
151 shift;;
152
153 -o) chowncmd="$chownprog $2"
154 shift;;
155
156 -s) stripcmd=$stripprog;;
157
158 -t) dst_arg=$2
159 # Protect names problematic for `test' and other utilities.
160 case $dst_arg in
161 -* | [=\(\)!]) dst_arg=./$dst_arg;;
162 esac
163 shift;;
164
165 -T) no_target_directory=true;;
166
167 --version) echo "$0 $scriptversion"; exit $?;;
168
169 --) shift
170 break;;
171
172 -*) echo "$0: invalid option: $1" >&2
173 exit 1;;
174
175 *) break;;
176 esac
177 shift
178 done
179
180 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
181 # When -d is used, all remaining arguments are directories to create.
182 # When -t is used, the destination is already specified.
183 # Otherwise, the last argument is the destination. Remove it from $@.
184 for arg
185 do
186 if test -n "$dst_arg"; then
187 # $@ is not empty: it contains at least $arg.
188 set fnord "$@" "$dst_arg"
189 shift # fnord
190 fi
191 shift # arg
192 dst_arg=$arg
193 # Protect names problematic for `test' and other utilities.
194 case $dst_arg in
195 -* | [=\(\)!]) dst_arg=./$dst_arg;;
196 esac
197 done
198 fi
199
200 if test $# -eq 0; then
201 if test -z "$dir_arg"; then
202 echo "$0: no input file specified." >&2
203 exit 1
204 fi
205 # It's OK to call `install-sh -d' without argument.
206 # This can happen when creating conditional directories.
207 exit 0
208 fi
209
210 if test -z "$dir_arg"; then
211 do_exit='(exit $ret); exit $ret'
212 trap "ret=129; $do_exit" 1
213 trap "ret=130; $do_exit" 2
214 trap "ret=141; $do_exit" 13
215 trap "ret=143; $do_exit" 15
216
217 # Set umask so as not to create temps with too-generous modes.
218 # However, 'strip' requires both read and write access to temps.
219 case $mode in
220 # Optimize common cases.
221 *644) cp_umask=133;;
222 *755) cp_umask=22;;
223
224 *[0-7])
225 if test -z "$stripcmd"; then
226 u_plus_rw=
227 else
228 u_plus_rw='% 200'
229 fi
230 cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
231 *)
232 if test -z "$stripcmd"; then
233 u_plus_rw=
234 else
235 u_plus_rw=,u+rw
236 fi
237 cp_umask=$mode$u_plus_rw;;
238 esac
239 fi
240
241 for src
242 do
243 # Protect names problematic for `test' and other utilities.
244 case $src in
245 -* | [=\(\)!]) src=./$src;;
246 esac
247
248 if test -n "$dir_arg"; then
249 dst=$src
250 dstdir=$dst
251 test -d "$dstdir"
252 dstdir_status=$?
253 else
254
255 # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
256 # might cause directories to be created, which would be especially bad
257 # if $src (and thus $dsttmp) contains '*'.
258 if test ! -f "$src" && test ! -d "$src"; then
259 echo "$0: $src does not exist." >&2
260 exit 1
261 fi
262
263 if test -z "$dst_arg"; then
264 echo "$0: no destination specified." >&2
265 exit 1
266 fi
267 dst=$dst_arg
268
269 # If destination is a directory, append the input filename; won't work
270 # if double slashes aren't ignored.
271 if test -d "$dst"; then
272 if test -n "$no_target_directory"; then
273 echo "$0: $dst_arg: Is a directory" >&2
274 exit 1
275 fi
276 dstdir=$dst
277 dst=$dstdir/`basename "$src"`
278 dstdir_status=0
279 else
280 # Prefer dirname, but fall back on a substitute if dirname fails.
281 dstdir=`
282 (dirname "$dst") 2>/dev/null ||
283 expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
284 X"$dst" : 'X\(//\)[^/]' \| \
285 X"$dst" : 'X\(//\)$' \| \
286 X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
287 echo X"$dst" |
288 sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
289 s//\1/
290 q
291 }
292 /^X\(\/\/\)[^/].*/{
293 s//\1/
294 q
295 }
296 /^X\(\/\/\)$/{
297 s//\1/
298 q
299 }
300 /^X\(\/\).*/{
301 s//\1/
302 q
303 }
304 s/.*/./; q'
305 `
306
307 test -d "$dstdir"
308 dstdir_status=$?
309 fi
310 fi
311
312 obsolete_mkdir_used=false
313
314 if test $dstdir_status != 0; then
315 case $posix_mkdir in
316 '')
317 # Create intermediate dirs using mode 755 as modified by the umask.
318 # This is like FreeBSD 'install' as of 1997-10-28.
319 umask=`umask`
320 case $stripcmd.$umask in
321 # Optimize common cases.
322 *[2367][2367]) mkdir_umask=$umask;;
323 .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
324
325 *[0-7])
326 mkdir_umask=`expr $umask + 22 \
327 - $umask % 100 % 40 + $umask % 20 \
328 - $umask % 10 % 4 + $umask % 2
329 `;;
330 *) mkdir_umask=$umask,go-w;;
331 esac
332
333 # With -d, create the new directory with the user-specified mode.
334 # Otherwise, rely on $mkdir_umask.
335 if test -n "$dir_arg"; then
336 mkdir_mode=-m$mode
337 else
338 mkdir_mode=
339 fi
340
341 posix_mkdir=false
342 case $umask in
343 *[123567][0-7][0-7])
344 # POSIX mkdir -p sets u+wx bits regardless of umask, which
345 # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
346 ;;
347 *)
348 tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
349 trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
350
351 if (umask $mkdir_umask &&
352 exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
353 then
354 if test -z "$dir_arg" || {
355 # Check for POSIX incompatibilities with -m.
356 # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
357 # other-writeable bit of parent directory when it shouldn't.
358 # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
359 ls_ld_tmpdir=`ls -ld "$tmpdir"`
360 case $ls_ld_tmpdir in
361 d????-?r-*) different_mode=700;;
362 d????-?--*) different_mode=755;;
363 *) false;;
364 esac &&
365 $mkdirprog -m$different_mode -p -- "$tmpdir" && {
366 ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
367 test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
368 }
369 }
370 then posix_mkdir=:
371 fi
372 rmdir "$tmpdir/d" "$tmpdir"
373 else
374 # Remove any dirs left behind by ancient mkdir implementations.
375 rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
376 fi
377 trap '' 0;;
378 esac;;
379 esac
380
381 if
382 $posix_mkdir && (
383 umask $mkdir_umask &&
384 $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
385 )
386 then :
387 else
388
389 # The umask is ridiculous, or mkdir does not conform to POSIX,
390 # or it failed possibly due to a race condition. Create the
391 # directory the slow way, step by step, checking for races as we go.
392
393 case $dstdir in
394 /*) prefix='/';;
395 [-=\(\)!]*) prefix='./';;
396 *) prefix='';;
397 esac
398
399 eval "$initialize_posix_glob"
400
401 oIFS=$IFS
402 IFS=/
403 $posix_glob set -f
404 set fnord $dstdir
405 shift
406 $posix_glob set +f
407 IFS=$oIFS
408
409 prefixes=
410
411 for d
412 do
413 test X"$d" = X && continue
414
415 prefix=$prefix$d
416 if test -d "$prefix"; then
417 prefixes=
418 else
419 if $posix_mkdir; then
420 (umask=$mkdir_umask &&
421 $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
422 # Don't fail if two instances are running concurrently.
423 test -d "$prefix" || exit 1
424 else
425 case $prefix in
426 *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
427 *) qprefix=$prefix;;
428 esac
429 prefixes="$prefixes '$qprefix'"
430 fi
431 fi
432 prefix=$prefix/
433 done
434
435 if test -n "$prefixes"; then
436 # Don't fail if two instances are running concurrently.
437 (umask $mkdir_umask &&
438 eval "\$doit_exec \$mkdirprog $prefixes") ||
439 test -d "$dstdir" || exit 1
440 obsolete_mkdir_used=true
441 fi
442 fi
443 fi
444
445 if test -n "$dir_arg"; then
446 { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
447 { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
448 { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
449 test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
450 else
451
452 # Make a couple of temp file names in the proper directory.
453 dsttmp=$dstdir/_inst.$$_
454 rmtmp=$dstdir/_rm.$$_
455
456 # Trap to clean up those temp files at exit.
457 trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
458
459 # Copy the file name to the temp name.
460 (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
461
462 # and set any options; do chmod last to preserve setuid bits.
463 #
464 # If any of these fail, we abort the whole thing. If we want to
465 # ignore errors from any of these, just make sure not to ignore
466 # errors from the above "$doit $cpprog $src $dsttmp" command.
467 #
468 { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
469 { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
470 { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
471 { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
472
473 # If -C, don't bother to copy if it wouldn't change the file.
474 if $copy_on_change &&
475 old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
476 new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
477
478 eval "$initialize_posix_glob" &&
479 $posix_glob set -f &&
480 set X $old && old=:$2:$4:$5:$6 &&
481 set X $new && new=:$2:$4:$5:$6 &&
482 $posix_glob set +f &&
483
484 test "$old" = "$new" &&
485 $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
486 then
487 rm -f "$dsttmp"
488 else
489 # Rename the file to the real destination.
490 $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
491
492 # The rename failed, perhaps because mv can't rename something else
493 # to itself, or perhaps because mv is so ancient that it does not
494 # support -f.
495 {
496 # Now remove or move aside any old file at destination location.
497 # We try this two ways since rm can't unlink itself on some
498 # systems and the destination file might be busy for other
499 # reasons. In this case, the final cleanup might fail but the new
500 # file should still install successfully.
501 {
502 test ! -f "$dst" ||
503 $doit $rmcmd -f "$dst" 2>/dev/null ||
504 { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
505 { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
506 } ||
507 { echo "$0: cannot unlink or rename $dst" >&2
508 (exit 1); exit 1
509 }
510 } &&
511
512 # Now rename the file to the real destination.
513 $doit $mvcmd "$dsttmp" "$dst"
514 }
515 fi || exit 1
516
517 trap '' 0
518 fi
519 done
520
521 # Local variables:
522 # eval: (add-hook 'write-file-hooks 'time-stamp)
523 # time-stamp-start: "scriptversion="
524 # time-stamp-format: "%:y-%02m-%02d.%02H"
525 # time-stamp-time-zone: "UTC"
526 # time-stamp-end: "; # UTC"
527 # End:
@@ -1,30 +1,35
1 # -*- Autoconf -*-
1 # -*- Autoconf -*-
2 # Process this file with autoconf to produce a configure script.
2 # Process this file with autoconf to produce a configure script.
3 AC_PREREQ([2.67])
3 AC_PREREQ([2.67])
4 AC_INIT([librs232],[2.1.0],[alexis.jeandet@lpp.polytechnique.fr],[rs232],[http://www.lpp.fr])
4 AC_INIT([librs232],[2.1.0],[alexis.jeandet@lpp.polytechnique.fr],[rs232],[http://www.lpp.fr])
5 AM_INIT_AUTOMAKE([1.10 -Wall foreign])
5 AM_INIT_AUTOMAKE([1.10 -Wall foreign])
6 AC_CONFIG_MACRO_DIR([m4])
6 AC_CONFIG_MACRO_DIR([m4])
7 # Checks for programs.
7 # Checks for programs.
8 AC_CONFIG_HEADERS([src/rs232config.h])
8 AC_CONFIG_HEADERS([src/rs232config.h])
9
9
10 AC_PROG_CC
10 AC_PROG_CC
11 AM_PROG_CC_STDC
11 AM_PROG_CC_STDC
12 AC_PROG_INSTALL
12 AC_C_CONST
13 AC_C_CONST
13 AC_LIBTOOL_WIN32_DLL
14 AC_LIBTOOL_WIN32_DLL
14 AM_PROG_LIBTOOL
15 AM_PROG_LIBTOOL
16 AC_PROG_LN_S
17 AC_PROG_MAKE_SET
18 AC_PROG_RANLIB
19
15 #LT_INIT
20 #LT_INIT
16 #AC_PROG_MAKE_SET
21 #AC_PROG_MAKE_SET
17
22
18 # Checks for libraries.
23 # Checks for libraries.
19
24
20 # Checks for header files.
25 # Checks for header files.
21 AC_CHECK_HEADERS([stdio.h string.h fcntl.h errno.h unistd.h termios.h termio.h windows.h])
26 AC_CHECK_HEADERS([stdio.h string.h fcntl.h errno.h unistd.h termios.h termio.h dirent.h windows.h])
22
27
23 AC_SUBST([RS232_SO_VERSION], [2:1:0])
28 AC_SUBST([RS232_SO_VERSION], [2:1:0])
24 AC_SUBST([RS232_API_VERSION], [2.1])
29 AC_SUBST([RS232_API_VERSION], [2.1])
25 # Checks for typedefs, structures, and compiler characteristics.
30 # Checks for typedefs, structures, and compiler characteristics.
26
31
27 # Checks for library functions.
32 # Checks for library functions.
28 AC_CONFIG_FILES([Makefile src/Makefile rs232-${RS232_API_VERSION}.pc:rs232.pc.in])
33 AC_CONFIG_FILES([Makefile src/Makefile rs232-${RS232_API_VERSION}.pc:rs232.pc.in])
29
34
30 AC_OUTPUT
35 AC_OUTPUT
@@ -1,11 +1,11
1 prefix=@prefix@
1 prefix=@prefix@
2 exec_prefix=@exec_prefix@
2 exec_prefix=@exec_prefix@
3 libdir=@libdir@
3 libdir=@libdir@
4 includedir=@includedir@
4 includedir=@includedir@
5
5
6 Name: @PACKAGE_NAME@
6 Name: @PACKAGE_NAME@
7 Description: Example C++ library.
7 Description: Standard RS232 library.
8 Version: @PACKAGE_VERSION@
8 Version: @PACKAGE_VERSION@
9 URL: @PACKAGE_URL@
9 URL: @PACKAGE_URL@
10 Libs: -L${libdir} -lrs232-@RS232_API_VERSION@
10 Libs: -L${libdir} -lrs232-@RS232_API_VERSION@
11 Cflags: -I${includedir}/rs232-@RS232_API_VERSION@ -I${libdir}/rs232-@RS232_API_VERSION@/include
11 Cflags: -I${includedir}/rs232-@RS232_API_VERSION@ -I${libdir}/rs232-@RS232_API_VERSION@/include
@@ -1,455 +1,516
1 #include <stdio.h>
1 #include <stdio.h>
2 #include <unistd.h>
2 #include <unistd.h>
3 #include <fcntl.h>
3 #include <fcntl.h>
4 #include <string.h>
4 #include <string.h>
5 #include <errno.h>
5 #include <errno.h>
6 #include <malloc.h>
6 #include <malloc.h>
7 #include <dirent.h>
8 #include <limits.h>
9 #include <stdlib.h>
10 #include <sys/stat.h>
7 #include "rs232config.h"
11 #include "rs232config.h"
12
8 #ifdef HAVE_TERMIOS_H
13 #ifdef HAVE_TERMIOS_H
9 #include <termios.h>
14 #include <termios.h>
10 #endif
15 #endif
11 #ifdef HAVE_TERMIO_H
16 #ifdef HAVE_TERMIO_H
12 #include <termio.h>
17 #include <termio.h>
13 #endif
18 #endif
14 #include "RS232.h"
19 #include "RS232.h"
15
20
16 #ifdef HAVE_WINDOWS_H
21 #ifdef HAVE_WINDOWS_H
17 #else
22 #else
18 #ifdef HAVE_TERMIOS_H
23 #ifdef HAVE_TERMIOS_H
19 rs232speed_t rs232cfspeed(unsigned int BaudeRate);
24 rs232speed_t rs232cfspeed(unsigned int BaudeRate);
20
25
21 rs232port_t rs232open(char* psPortName)
26 rs232port_t rs232open(char* psPortName)
22 {
27 {
23 rs232port_t fd;
28 rs232port_t fd;
24 fd = (rs232port_t)open(psPortName, O_RDWR | O_NOCTTY | O_NDELAY);
29 fd = (rs232port_t)open(psPortName, O_RDWR | O_NOCTTY | O_NDELAY);
25 fcntl((int)fd, F_SETFL, 0);
30 fcntl((int)fd, F_SETFL, 0);
26 //fd = open(psPortName, O_RDWR | O_NOCTTY);
31 //fd = open(psPortName, O_RDWR | O_NOCTTY);
27 #ifdef debug
32 #ifdef debug
28 if(fd==-1)printf("can't open Port\n");
33 if(fd==-1)printf("can't open Port\n");
29 #endif
34 #endif
30 return fd;
35 return fd;
31 }
36 }
32
37
33 int rs232close(rs232port_t fd)
38 int rs232close(rs232port_t fd)
34 {
39 {
35 if ((int)fd == -1)
40 if ((int)fd == -1)
36 {
41 {
37 return -1;
42 return -1;
38 }
43 }
39 else
44 else
40 {
45 {
41 close(fd);
46 close(fd);
42 return 0;
47 return 0;
43 }
48 }
44 }
49 }
45
50
46 rs232portslist_t* rs232getportlist()
51 rs232portslist_t* rs232getportlist()
47 {
52 {
53 struct dirent *dp;
54 char* path="/dev/serial/by-id";
55 DIR *dir = opendir(path);
56 rs232portslist_t* firstitem=NULL;
57 rs232portslist_t* previtem=NULL;
58 char linkname[1024];
59 int i=0;
60 if(dir!=NULL)
61 {
62 while ((dp=readdir(dir)) != NULL)
63 {
64 char* name = (char*)malloc(1024);
65 for(i=0;i<1024;i++)
66 {
67 name[i]='\0';
68 linkname[i]='\0';
69 }
70 struct stat statbuf;
71 strcpy(linkname,path);
72 strcat(linkname,"/");
73 strcat(linkname,dp->d_name);
74 lstat(linkname, &statbuf);
75 if(S_ISLNK(statbuf.st_mode))
76 {
77 if(-1!=readlink(linkname,name,1024))
78 {
79 for(i=0;i<1024;i++)
80 {
81 linkname[i]='\0';
82 }
83 strcpy(linkname,path);
84 strcat(linkname,"/");
85 strcat(linkname,name);
86 for(i=0;i<1024;i++)
87 {
88 name[i]='\0';
89 }
90 if(NULL!=realpath(linkname, name))
91 {
92 rs232portslist_t* item = (rs232portslist_t*)malloc(sizeof(rs232portslist_t));
93 item->name = name;
94 item->next = NULL;
95 if(NULL!=previtem)previtem->next = item;
96 previtem = item;
97 if(NULL==firstitem)firstitem = item;
98 }
48
99
100 }
101 }
49
102
50 }
103 }
104 }
105 return firstitem;
106 }
51
107
52 void rs232deleteportlist(rs232portslist_t* list)
108 void rs232deleteportlist(rs232portslist_t* list)
53 {
109 {
54
110 if(list!=NULL)
111 {
112 if(list->next != NULL)
113 rs232deleteportlist(list->next);
114 free(list);
115 }
55 }
116 }
56
117
57 int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop)
118 int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop)
58 {
119 {
59 if ((int)fd == -1)
120 if ((int)fd == -1)
60 {
121 {
61 return -1;
122 return -1;
62 }
123 }
63 else
124 else
64 {
125 {
65 struct termios terminos;
126 struct termios terminos;
66 tcgetattr(fd, &terminos);
127 tcgetattr(fd, &terminos);
67 cfsetispeed(&terminos, rs232cfspeed(BaudeRate));
128 cfsetispeed(&terminos, rs232cfspeed(BaudeRate));
68 cfsetospeed(&terminos, rs232cfspeed(BaudeRate));
129 cfsetospeed(&terminos, rs232cfspeed(BaudeRate));
69 terminos.c_cflag |= (CLOCAL | CREAD);
130 terminos.c_cflag |= (CLOCAL | CREAD);
70 rs232cfparity((int)fd, &terminos, Parity);
131 rs232cfparity((int)fd, &terminos, Parity);
71 rs232cfnbstop((int)fd, &terminos, NbStop);
132 rs232cfnbstop((int)fd, &terminos, NbStop);
72 rs232cfcsize((int)fd, &terminos, ChSize);
133 rs232cfcsize((int)fd, &terminos, ChSize);
73 terminos.c_cc[VMIN]=0;
134 terminos.c_cc[VMIN]=0;
74 terminos.c_cc[VTIME]=1;
135 terminos.c_cc[VTIME]=1;
75 tcflush(fd, TCIFLUSH);
136 tcflush(fd, TCIFLUSH);
76 #ifdef debug
137 #ifdef debug
77 if(tcsetattr(fd, TCSANOW, &terminos)!=0)printf("bad setup\n");
138 if(tcsetattr(fd, TCSANOW, &terminos)!=0)printf("bad setup\n");
78 #else
139 #else
79 tcsetattr(fd, TCSANOW, &terminos);
140 tcsetattr(fd, TCSANOW, &terminos);
80 #endif
141 #endif
81 return 0;
142 return 0;
82 }
143 }
83 }
144 }
84
145
85 int rs232setbaudrate(rs232port_t fd, int baudrate)
146 int rs232setbaudrate(rs232port_t fd, int baudrate)
86 {
147 {
87 if ((int)fd == -1)
148 if ((int)fd == -1)
88 {
149 {
89 return fd;
150 return fd;
90 }
151 }
91 else
152 else
92 {
153 {
93 struct termios terminos;
154 struct termios terminos;
94 tcgetattr((int)fd, &terminos);
155 tcgetattr((int)fd, &terminos);
95 cfsetispeed(&terminos, rs232cfspeed(baudrate));
156 cfsetispeed(&terminos, rs232cfspeed(baudrate));
96 cfsetospeed(&terminos, rs232cfspeed(baudrate));
157 cfsetospeed(&terminos, rs232cfspeed(baudrate));
97 tcsetattr((int)fd, TCSANOW, &terminos);
158 tcsetattr((int)fd, TCSANOW, &terminos);
98 return 0;
159 return 0;
99 }
160 }
100 }
161 }
101
162
102 int rs232setparity(rs232port_t fd, rs232parity Parity)
163 int rs232setparity(rs232port_t fd, rs232parity Parity)
103 {
164 {
104 if ((int)fd == -1)
165 if ((int)fd == -1)
105 {
166 {
106 return fd;
167 return fd;
107 }
168 }
108 else
169 else
109 {
170 {
110 struct termios terminos;
171 struct termios terminos;
111 tcgetattr((int)fd, &terminos);
172 tcgetattr((int)fd, &terminos);
112 terminos.c_cflag &= ~PARENB;
173 terminos.c_cflag &= ~PARENB;
113 terminos.c_cflag &= ~PARODD;
174 terminos.c_cflag &= ~PARODD;
114 switch(Parity)
175 switch(Parity)
115 {
176 {
116 case rs232parityNo:
177 case rs232parityNo:
117 terminos.c_cflag &= ~PARENB;
178 terminos.c_cflag &= ~PARENB;
118 break;
179 break;
119 case rs232parityOdd:
180 case rs232parityOdd:
120 terminos.c_cflag |= PARENB;
181 terminos.c_cflag |= PARENB;
121 terminos.c_cflag |= PARODD;
182 terminos.c_cflag |= PARODD;
122 break;
183 break;
123 case rs232parityEven:
184 case rs232parityEven:
124 terminos.c_cflag |= PARENB;
185 terminos.c_cflag |= PARENB;
125 terminos.c_cflag &= ~PARODD;
186 terminos.c_cflag &= ~PARODD;
126 break;
187 break;
127 default:
188 default:
128 terminos.c_cflag &= ~PARENB;
189 terminos.c_cflag &= ~PARENB;
129 break;
190 break;
130 }
191 }
131 tcsetattr((int)fd, TCSANOW, &terminos);
192 tcsetattr((int)fd, TCSANOW, &terminos);
132 return 0;
193 return 0;
133 }
194 }
134 }
195 }
135
196
136 int rs232setnbstop(rs232port_t fd, rs232stop NbStop)
197 int rs232setnbstop(rs232port_t fd, rs232stop NbStop)
137 {
198 {
138 if ((int)fd == -1)
199 if ((int)fd == -1)
139 {
200 {
140 return fd;
201 return fd;
141 }
202 }
142 else
203 else
143 {
204 {
144 struct termios terminos;
205 struct termios terminos;
145 tcgetattr((int)fd, &terminos);
206 tcgetattr((int)fd, &terminos);
146 switch(NbStop)
207 switch(NbStop)
147 {
208 {
148 case rs232OneStop:
209 case rs232OneStop:
149 terminos.c_cflag &= ~CSTOPB;
210 terminos.c_cflag &= ~CSTOPB;
150 break;
211 break;
151 case rs232One5Stop:
212 case rs232One5Stop:
152 terminos.c_cflag |= CSTOPB;
213 terminos.c_cflag |= CSTOPB;
153 break;
214 break;
154 case rs232TwoStop:
215 case rs232TwoStop:
155 terminos.c_cflag |= CSTOPB;
216 terminos.c_cflag |= CSTOPB;
156 break;
217 break;
157 default:
218 default:
158 terminos.c_cflag &= ~CSTOPB;
219 terminos.c_cflag &= ~CSTOPB;
159 break;
220 break;
160 }
221 }
161 tcsetattr((int)fd, TCSANOW, &terminos);
222 tcsetattr((int)fd, TCSANOW, &terminos);
162 return 0;
223 return 0;
163 }
224 }
164 }
225 }
165
226
166
227
167 int rs232setcsize(rs232port_t fd, int ChSize)
228 int rs232setcsize(rs232port_t fd, int ChSize)
168 {
229 {
169 if ((int)fd == -1)
230 if ((int)fd == -1)
170 {
231 {
171 return fd;
232 return fd;
172 }
233 }
173 else
234 else
174 {
235 {
175 struct termios terminos;
236 struct termios terminos;
176 tcgetattr((int)fd, &terminos);
237 tcgetattr((int)fd, &terminos);
177 terminos.c_cflag &= ~CSIZE;
238 terminos.c_cflag &= ~CSIZE;
178 switch(ChSize)
239 switch(ChSize)
179 {
240 {
180 case 5:
241 case 5:
181 terminos.c_cflag |= CS5;
242 terminos.c_cflag |= CS5;
182 break;
243 break;
183 case 6:
244 case 6:
184 terminos.c_cflag |= CS6;
245 terminos.c_cflag |= CS6;
185 break;
246 break;
186 case 7:
247 case 7:
187 terminos.c_cflag |= CS7;
248 terminos.c_cflag |= CS7;
188 break;
249 break;
189 default:
250 default:
190 terminos.c_cflag |= CS8;
251 terminos.c_cflag |= CS8;
191 break;
252 break;
192 }
253 }
193 tcsetattr((int)fd, TCSANOW, &terminos);
254 tcsetattr((int)fd, TCSANOW, &terminos);
194 return 0;
255 return 0;
195 }
256 }
196 }
257 }
197
258
198 rs232speed_t rs232cfspeed(unsigned int BaudeRate)
259 rs232speed_t rs232cfspeed(unsigned int BaudeRate)
199 {
260 {
200 if(BaudeRate<25)
261 if(BaudeRate<25)
201 return B0;
262 return B0;
202
263
203 if(BaudeRate<67)
264 if(BaudeRate<67)
204 return B50;
265 return B50;
205
266
206 if(BaudeRate<93)
267 if(BaudeRate<93)
207 return B75;
268 return B75;
208
269
209 if(BaudeRate<123)
270 if(BaudeRate<123)
210 return B110;
271 return B110;
211
272
212 if(BaudeRate<142)
273 if(BaudeRate<142)
213 return B134;
274 return B134;
214
275
215 if(BaudeRate<175)
276 if(BaudeRate<175)
216 return B150;
277 return B150;
217
278
218 if(BaudeRate<250)
279 if(BaudeRate<250)
219 return B200;
280 return B200;
220
281
221 if(BaudeRate<450)
282 if(BaudeRate<450)
222 return B300;
283 return B300;
223
284
224 if(BaudeRate<900)
285 if(BaudeRate<900)
225 return B600;
286 return B600;
226
287
227 if(BaudeRate<1500)
288 if(BaudeRate<1500)
228 return B1200;
289 return B1200;
229
290
230 if(BaudeRate<2100)
291 if(BaudeRate<2100)
231 return B1800;
292 return B1800;
232
293
233 if(BaudeRate<3600)
294 if(BaudeRate<3600)
234 return B2400;
295 return B2400;
235
296
236 if(BaudeRate<7200)
297 if(BaudeRate<7200)
237 return B4800;
298 return B4800;
238
299
239 if(BaudeRate<1400)
300 if(BaudeRate<1400)
240 return B9600;
301 return B9600;
241
302
242 if(BaudeRate<28800)
303 if(BaudeRate<28800)
243 return B19200;
304 return B19200;
244
305
245 if(BaudeRate<48000)
306 if(BaudeRate<48000)
246 return B38400;
307 return B38400;
247
308
248 if(BaudeRate<86400)
309 if(BaudeRate<86400)
249 return B57600;
310 return B57600;
250
311
251 if(BaudeRate<172800)
312 if(BaudeRate<172800)
252 return B115200;
313 return B115200;
253 else
314 else
254 return B230400;
315 return B230400;
255 }
316 }
256
317
257
318
258 int rs232cfparity(int fd, struct termios *terminos, rs232parity Parity)
319 int rs232cfparity(int fd, struct termios *terminos, rs232parity Parity)
259 {
320 {
260 if ((int)fd == -1)
321 if ((int)fd == -1)
261 {
322 {
262 return fd;
323 return fd;
263 }
324 }
264 else
325 else
265 {
326 {
266 terminos->c_cflag &= ~PARENB;
327 terminos->c_cflag &= ~PARENB;
267 terminos->c_cflag &= ~PARODD;
328 terminos->c_cflag &= ~PARODD;
268 switch(Parity)
329 switch(Parity)
269 {
330 {
270 case rs232parityNo:
331 case rs232parityNo:
271 terminos->c_cflag &= ~PARENB;
332 terminos->c_cflag &= ~PARENB;
272 terminos->c_cflag &= ~PARODD;
333 terminos->c_cflag &= ~PARODD;
273 break;
334 break;
274 case rs232parityOdd:
335 case rs232parityOdd:
275 terminos->c_cflag |= PARENB;
336 terminos->c_cflag |= PARENB;
276 terminos->c_cflag |= PARODD;
337 terminos->c_cflag |= PARODD;
277 break;
338 break;
278 case rs232parityEven:
339 case rs232parityEven:
279 terminos->c_cflag |= PARENB;
340 terminos->c_cflag |= PARENB;
280 terminos->c_cflag &= ~PARODD;
341 terminos->c_cflag &= ~PARODD;
281 break;
342 break;
282 default:
343 default:
283 terminos->c_cflag &= ~PARENB;
344 terminos->c_cflag &= ~PARENB;
284 terminos->c_cflag &= ~PARODD;
345 terminos->c_cflag &= ~PARODD;
285 break;
346 break;
286 }
347 }
287 return 0;
348 return 0;
288 }
349 }
289 }
350 }
290
351
291 int rs232cfnbstop(int fd, struct termios *terminos, rs232stop NbStop)
352 int rs232cfnbstop(int fd, struct termios *terminos, rs232stop NbStop)
292 {
353 {
293 if ((int)fd == -1)
354 if ((int)fd == -1)
294 {
355 {
295 return fd;
356 return fd;
296 }
357 }
297 else
358 else
298 {
359 {
299 switch(NbStop)
360 switch(NbStop)
300 {
361 {
301 case 2:
362 case 2:
302 terminos->c_cflag |= CSTOPB;
363 terminos->c_cflag |= CSTOPB;
303 break;
364 break;
304 default:
365 default:
305 terminos->c_cflag &= ~CSTOPB;
366 terminos->c_cflag &= ~CSTOPB;
306 break;
367 break;
307 }
368 }
308 return 0;
369 return 0;
309 }
370 }
310 }
371 }
311
372
312
373
313 int rs232cfcsize(int fd, struct termios *terminos, int ChSize)
374 int rs232cfcsize(int fd, struct termios *terminos, int ChSize)
314 {
375 {
315 if ((int)fd == -1)
376 if ((int)fd == -1)
316 {
377 {
317 return fd;
378 return fd;
318 }
379 }
319 else
380 else
320 {
381 {
321 terminos->c_cflag &= ~CSIZE;
382 terminos->c_cflag &= ~CSIZE;
322 switch(ChSize)
383 switch(ChSize)
323 {
384 {
324 case 5:
385 case 5:
325 terminos->c_cflag |= CS5;
386 terminos->c_cflag |= CS5;
326 break;
387 break;
327 case 6:
388 case 6:
328 terminos->c_cflag |= CS6;
389 terminos->c_cflag |= CS6;
329 break;
390 break;
330 case 7:
391 case 7:
331 terminos->c_cflag |= CS7;
392 terminos->c_cflag |= CS7;
332 break;
393 break;
333 default:
394 default:
334 terminos->c_cflag |= CS8;
395 terminos->c_cflag |= CS8;
335 break;
396 break;
336 }
397 }
337 return 0;
398 return 0;
338 }
399 }
339 }
400 }
340
401
341
402
342 int rs232write(rs232port_t fd,char *psWrite, int WriteBufferSize)
403 int rs232write(rs232port_t fd,char *psWrite, int WriteBufferSize)
343 {
404 {
344 if ((int)fd == -1)
405 if ((int)fd == -1)
345 {
406 {
346 return -1;
407 return -1;
347 }
408 }
348 else
409 else
349 {
410 {
350 return write((int)fd, psWrite, WriteBufferSize);
411 return write((int)fd, psWrite, WriteBufferSize);
351 }
412 }
352 }
413 }
353
414
354
415
355 int rs232read(rs232port_t fd,char *psReadHex, int ReadBufferSize)
416 int rs232read(rs232port_t fd,char *psReadHex, int ReadBufferSize)
356 {
417 {
357
418
358 if ((int)fd == -1)
419 if ((int)fd == -1)
359 {
420 {
360 return -1;
421 return -1;
361 }
422 }
362 else
423 else
363 {
424 {
364 return read((int)fd, psReadHex, ReadBufferSize);
425 return read((int)fd, psReadHex, ReadBufferSize);
365 }
426 }
366
427
367 }
428 }
368
429
369
430
370 int rs232setRTS(rs232port_t fd)
431 int rs232setRTS(rs232port_t fd)
371 {
432 {
372 int status;
433 int status;
373 ioctl((int)fd, TIOCMGET, &status);
434 ioctl((int)fd, TIOCMGET, &status);
374 status &= ~TIOCM_RTS;
435 status &= ~TIOCM_RTS;
375 if (ioctl((int)fd, TIOCMSET, &status))
436 if (ioctl((int)fd, TIOCMSET, &status))
376 {
437 {
377 return -1;
438 return -1;
378 }
439 }
379 return 0;
440 return 0;
380 }
441 }
381
442
382 int rs232clearRTS(rs232port_t fd)
443 int rs232clearRTS(rs232port_t fd)
383 {
444 {
384 int status;
445 int status;
385 ioctl((int)fd, TIOCMGET, &status);
446 ioctl((int)fd, TIOCMGET, &status);
386 status |= TIOCM_RTS;
447 status |= TIOCM_RTS;
387 if (ioctl((int)fd, TIOCMSET, &status))
448 if (ioctl((int)fd, TIOCMSET, &status))
388 {
449 {
389 return -1;
450 return -1;
390 }
451 }
391 return 0;
452 return 0;
392 }
453 }
393
454
394 int rs232setDTR(rs232port_t fd)
455 int rs232setDTR(rs232port_t fd)
395 {
456 {
396 int status;
457 int status;
397 ioctl((int)fd, TIOCMGET, &status);
458 ioctl((int)fd, TIOCMGET, &status);
398 status &= ~TIOCM_DTR;
459 status &= ~TIOCM_DTR;
399 if (ioctl((int)fd, TIOCMSET, &status))
460 if (ioctl((int)fd, TIOCMSET, &status))
400 {
461 {
401 return -1;
462 return -1;
402 }
463 }
403 return 0;
464 return 0;
404 }
465 }
405
466
406
467
407 int rs232clearDTR(rs232port_t fd)
468 int rs232clearDTR(rs232port_t fd)
408 {
469 {
409 int status;
470 int status;
410 ioctl((int)fd, TIOCMGET, &status);
471 ioctl((int)fd, TIOCMGET, &status);
411 status |= TIOCM_DTR;
472 status |= TIOCM_DTR;
412 if (ioctl((int)fd, TIOCMSET, &status))
473 if (ioctl((int)fd, TIOCMSET, &status))
413 {
474 {
414 return -1;
475 return -1;
415 }
476 }
416 return 0;
477 return 0;
417 }
478 }
418
479
419
480
420
481
421 int rs232saferead(rs232port_t fd,char* data,int count )
482 int rs232saferead(rs232port_t fd,char* data,int count )
422 {
483 {
423 int read=0;
484 int read=0;
424 int i=0;
485 int i=0;
425 for(i=0;i<100;i++)
486 for(i=0;i<100;i++)
426 {
487 {
427 read = rs232read((int)fd,data,count);
488 read = rs232read((int)fd,data,count);
428 count -=read;
489 count -=read;
429 data+=read;
490 data+=read;
430 if(count==0)
491 if(count==0)
431 return 0;
492 return 0;
432 }
493 }
433 return -1;
494 return -1;
434 }
495 }
435
496
436
497
437
498
438 int rs232safewrite(rs232port_t fd,char* data,int count)
499 int rs232safewrite(rs232port_t fd,char* data,int count)
439 {
500 {
440 int written=0;
501 int written=0;
441 int i=0;
502 int i=0;
442 for(i=0;i<1000;i++)
503 for(i=0;i<1000;i++)
443 {
504 {
444 written = rs232write((int)fd,data+written,count);
505 written = rs232write((int)fd,data+written,count);
445 count-=written;
506 count-=written;
446 data+=written;
507 data+=written;
447 if(count==0)
508 if(count==0)
448 return 0;
509 return 0;
449 }
510 }
450 return -1;
511 return -1;
451 }
512 }
452
513
453 #endif
514 #endif
454 #endif //#ifdef HAVE_TERMIOS_H
515 #endif //#ifdef HAVE_TERMIOS_H
455
516
@@ -1,334 +1,364
1 #include "rs232config.h"
1 #include "rs232config.h"
2 #include <stdio.h>
2 #include <stdio.h>
3 #include <unistd.h>
3 #include <unistd.h>
4 #include <fcntl.h>
4 #include <fcntl.h>
5 #include <string.h>
5 #include <string.h>
6 #include <errno.h>
6 #include <errno.h>
7 #include <malloc.h>
7 #include <malloc.h>
8
8
9 #ifdef HAVE_WINDOWS_H
9 #ifdef HAVE_WINDOWS_H
10 #include <windows.h>
10 #include <windows.h>
11 #endif
11 #endif
12 #include "RS232.h"
12 #include "RS232.h"
13
13
14 #ifdef HAVE_WINDOWS_H
14 #ifdef HAVE_WINDOWS_H
15
15
16
16
17 int privatedecodeparity(rs232parity Parity )
17 int privatedecodeparity(rs232parity Parity )
18 {
18 {
19 switch(Parity)
19 switch(Parity)
20 {
20 {
21 case rs232parityNo:
21 case rs232parityNo:
22 return NOPARITY;
22 return NOPARITY;
23 break;
23 break;
24 case rs232parityOdd:
24 case rs232parityOdd:
25 return ODDPARITY;
25 return ODDPARITY;
26 break;
26 break;
27 case rs232parityEven:
27 case rs232parityEven:
28 return EVENPARITY;
28 return EVENPARITY;
29 break;
29 break;
30 default:
30 default:
31 return NOPARITY;
31 return NOPARITY;
32 break;
32 break;
33 }
33 }
34 }
34 }
35
35
36 int privatedecodestop(rs232stop NbStop)
36 int privatedecodestop(rs232stop NbStop)
37 {
37 {
38 switch(NbStop)
38 switch(NbStop)
39 {
39 {
40 case rs232OneStop:
40 case rs232OneStop:
41 return ONESTOPBIT;
41 return ONESTOPBIT;
42 break;
42 break;
43 case rs232One5Stop:
43 case rs232One5Stop:
44 return ONE5STOPBITS;
44 return ONE5STOPBITS;
45 break;
45 break;
46 case rs232TwoStop:
46 case rs232TwoStop:
47 return TWOSTOPBITS;
47 return TWOSTOPBITS;
48 break;
48 break;
49 default:
49 default:
50 return ONESTOPBIT;
50 return ONESTOPBIT;
51 break;
51 break;
52 }
52 }
53 }
53 }
54
54
55
55
56
56
57 rs232speed_t rs232cfspeed(unsigned int BaudeRate)
57 rs232speed_t rs232cfspeed(unsigned int BaudeRate)
58 {
58 {
59
59
60 if(BaudeRate<123)
60 if(BaudeRate<123)
61 return (rs232speed_t)CBR_110;
61 return (rs232speed_t)CBR_110;
62
62
63 if(BaudeRate<450)
63 if(BaudeRate<450)
64 return (rs232speed_t)CBR_300;
64 return (rs232speed_t)CBR_300;
65
65
66 if(BaudeRate<900)
66 if(BaudeRate<900)
67 return (rs232speed_t)CBR_600;
67 return (rs232speed_t)CBR_600;
68
68
69 if(BaudeRate<1500)
69 if(BaudeRate<1500)
70 return (rs232speed_t)CBR_1200;
70 return (rs232speed_t)CBR_1200;
71
71
72 if(BaudeRate<3600)
72 if(BaudeRate<3600)
73 return (rs232speed_t)CBR_2400;
73 return (rs232speed_t)CBR_2400;
74
74
75 if(BaudeRate<7200)
75 if(BaudeRate<7200)
76 return (rs232speed_t)CBR_4800;
76 return (rs232speed_t)CBR_4800;
77
77
78 if(BaudeRate<14000)
78 if(BaudeRate<14000)
79 return (rs232speed_t)CBR_9600;
79 return (rs232speed_t)CBR_9600;
80
80
81 if(BaudeRate<16800)
81 if(BaudeRate<16800)
82 return (rs232speed_t)CBR_14400;
82 return (rs232speed_t)CBR_14400;
83
83
84 if(BaudeRate<28800)
84 if(BaudeRate<28800)
85 return (rs232speed_t)CBR_19200;
85 return (rs232speed_t)CBR_19200;
86
86
87 if(BaudeRate<48000)
87 if(BaudeRate<48000)
88 return (rs232speed_t)CBR_38400;
88 return (rs232speed_t)CBR_38400;
89
89
90 if(BaudeRate<86400)
90 if(BaudeRate<86400)
91 return (rs232speed_t)CBR_57600;
91 return (rs232speed_t)CBR_57600;
92
92
93 if(BaudeRate<172800)
93 if(BaudeRate<172800)
94 return (rs232speed_t)CBR_115200;
94 return (rs232speed_t)CBR_115200;
95 else
95 else
96 return (rs232speed_t)CBR_256000;
96 return (rs232speed_t)CBR_256000;
97 }
97 }
98
98
99
99
100 rs232port_t rs232open(char* psPortName)
100 rs232port_t rs232open(char* psPortName)
101 {
101 {
102 rs232port_t fd;
102 rs232port_t fd;
103 fd = (rs232port_t)CreateFile(psPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
103 fd = (rs232port_t)CreateFile(psPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
104 #ifdef debug
104 #ifdef debug
105 if(fd==(rs232port_t)INVALID_HANDLE_VALUE)
105 if(fd==(rs232port_t)INVALID_HANDLE_VALUE)
106 {
106 {
107 printf("can't open Port\n");
107 printf("can't open Port\n");
108 return (rs232port_t)badPortValue;
108 return (rs232port_t)badPortValue;
109 }
109 }
110 #endif
110 #endif
111 return fd;
111 return fd;
112 }
112 }
113
113
114 int rs232close(rs232port_t fd)
114 int rs232close(rs232port_t fd)
115 {
115 {
116 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
116 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
117 {
117 {
118 return (rs232port_t)badPortValue;
118 return (rs232port_t)badPortValue;
119 }
119 }
120 else
120 else
121 {
121 {
122 CloseHandle((HANDLE)fd);
122 CloseHandle((HANDLE)fd);
123 return rs232noerr;
123 return rs232noerr;
124 }
124 }
125 }
125 }
126
126
127 rs232portslist_t* rs232getportlist()
127 rs232portslist_t* rs232getportlist() //here is the very dirty way!
128 {
129 int i=0;
130 char* devName="COM111";
131 rs232port_t testport;
132 rs232portslist_t* firstitem=NULL;
133 rs232portslist_t* previtem=NULL;
134 for(i=0;i<256;i++)
128 {
135 {
129
136 devName[3] = '\0';
137 devName[4] = '\0';
138 devName[5] = '\0';
139 devName[6] = '\0';
140 sprintf(devName+3,"%d",i);
141 testport= rs232open(devName);
142 if(testport != (rs232port_t)badPortValue)
143 {
144 rs232portslist_t* item = (rs232portslist_t*)malloc(sizeof(rs232portslist_t));
145 char* name = (char*)malloc(7);
146 strcpy(name,devName);
147 item->name = name;
148 item->next = NULL;
149 if(NULL!=previtem)previtem->next = item;
150 previtem = item;
151 if(NULL==firstitem)firstitem = item;
152 }
153 }
154 return firstitem;
130 }
155 }
131
156
132 void rs232deleteportlist(rs232portslist_t* list)
157 void rs232deleteportlist(rs232portslist_t* list)
133 {
158 {
134
159 if(list!=NULL)
160 {
161 if(list->next != NULL)
162 rs232deleteportlist(list->next);
163 free(list);
164 }
135 }
165 }
136
166
137
167
138 int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop)
168 int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop)
139 {
169 {
140 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
170 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
141 {
171 {
142 return (rs232port_t)badPortValue;
172 return (rs232port_t)badPortValue;
143 }
173 }
144 else
174 else
145 {
175 {
146 DCB dcbSerialParams = {0};
176 DCB dcbSerialParams = {0};
147 dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
177 dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
148 GetCommState((HANDLE)fd, &dcbSerialParams);
178 GetCommState((HANDLE)fd, &dcbSerialParams);
149 dcbSerialParams.BaudRate=rs232cfspeed(BaudeRate);
179 dcbSerialParams.BaudRate=rs232cfspeed(BaudeRate);
150 dcbSerialParams.ByteSize=ChSize;
180 dcbSerialParams.ByteSize=ChSize;
151 dcbSerialParams.StopBits=privatedecodestop(NbStop);
181 dcbSerialParams.StopBits=privatedecodestop(NbStop);
152 dcbSerialParams.Parity=privatedecodeparity(Parity);
182 dcbSerialParams.Parity=privatedecodeparity(Parity);
153 SetCommState((HANDLE)fd, &dcbSerialParams);
183 SetCommState((HANDLE)fd, &dcbSerialParams);
154 COMMTIMEOUTS timeouts={0};
184 COMMTIMEOUTS timeouts={0};
155 timeouts.ReadIntervalTimeout=100;
185 timeouts.ReadIntervalTimeout=100;
156 timeouts.ReadTotalTimeoutConstant=100;
186 timeouts.ReadTotalTimeoutConstant=100;
157 timeouts.ReadTotalTimeoutMultiplier=1;
187 timeouts.ReadTotalTimeoutMultiplier=1;
158 timeouts.WriteTotalTimeoutConstant=100;
188 timeouts.WriteTotalTimeoutConstant=100;
159 timeouts.WriteTotalTimeoutMultiplier=10;
189 timeouts.WriteTotalTimeoutMultiplier=10;
160 SetCommTimeouts((HANDLE)fd, &timeouts);
190 SetCommTimeouts((HANDLE)fd, &timeouts);
161 return rs232noerr;
191 return rs232noerr;
162 }
192 }
163 }
193 }
164
194
165 int rs232setbaudrate(rs232port_t fd, int baudrate)
195 int rs232setbaudrate(rs232port_t fd, int baudrate)
166 {
196 {
167 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
197 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
168 {
198 {
169 return (rs232port_t)badPortValue;
199 return (rs232port_t)badPortValue;
170 }
200 }
171 else
201 else
172 {
202 {
173 DCB dcbSerialParams = {0};
203 DCB dcbSerialParams = {0};
174 dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
204 dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
175 GetCommState((HANDLE)fd, &dcbSerialParams);
205 GetCommState((HANDLE)fd, &dcbSerialParams);
176 dcbSerialParams.BaudRate=rs232cfspeed(baudrate);
206 dcbSerialParams.BaudRate=rs232cfspeed(baudrate);
177 SetCommState((HANDLE)fd, &dcbSerialParams);
207 SetCommState((HANDLE)fd, &dcbSerialParams);
178 return rs232noerr;
208 return rs232noerr;
179 }
209 }
180 }
210 }
181
211
182 int rs232setparity(rs232port_t fd, rs232parity Parity)
212 int rs232setparity(rs232port_t fd, rs232parity Parity)
183 {
213 {
184 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
214 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
185 {
215 {
186 return (rs232port_t)badPortValue;
216 return (rs232port_t)badPortValue;
187 }
217 }
188 else
218 else
189 {
219 {
190 DCB dcbSerialParams = {0};
220 DCB dcbSerialParams = {0};
191 dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
221 dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
192 GetCommState((HANDLE)fd, &dcbSerialParams);
222 GetCommState((HANDLE)fd, &dcbSerialParams);
193 dcbSerialParams.Parity = privatedecodeparity(Parity);
223 dcbSerialParams.Parity = privatedecodeparity(Parity);
194 SetCommState((HANDLE)fd, &dcbSerialParams);
224 SetCommState((HANDLE)fd, &dcbSerialParams);
195 return rs232noerr;
225 return rs232noerr;
196 }
226 }
197 }
227 }
198
228
199 int rs232setnbstop(rs232port_t fd, rs232stop NbStop)
229 int rs232setnbstop(rs232port_t fd, rs232stop NbStop)
200 {
230 {
201 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
231 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
202 {
232 {
203 return (rs232port_t)badPortValue;
233 return (rs232port_t)badPortValue;
204 }
234 }
205 else
235 else
206 {
236 {
207 DCB dcbSerialParams = {0};
237 DCB dcbSerialParams = {0};
208 dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
238 dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
209 GetCommState((HANDLE)fd, &dcbSerialParams);
239 GetCommState((HANDLE)fd, &dcbSerialParams);
210 dcbSerialParams.StopBits = privatedecodestop(NbStop);
240 dcbSerialParams.StopBits = privatedecodestop(NbStop);
211 SetCommState((HANDLE)fd, &dcbSerialParams);
241 SetCommState((HANDLE)fd, &dcbSerialParams);
212 return rs232noerr;
242 return rs232noerr;
213 }
243 }
214 }
244 }
215
245
216
246
217 int rs232setcsize(rs232port_t fd, int ChSize)
247 int rs232setcsize(rs232port_t fd, int ChSize)
218 {
248 {
219 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
249 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
220 {
250 {
221 return (rs232port_t)badPortValue;
251 return (rs232port_t)badPortValue;
222 }
252 }
223 else
253 else
224 {
254 {
225 DCB dcbSerialParams = {0};
255 DCB dcbSerialParams = {0};
226 dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
256 dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
227 GetCommState((HANDLE)fd, &dcbSerialParams);
257 GetCommState((HANDLE)fd, &dcbSerialParams);
228 dcbSerialParams.ByteSize = ChSize;
258 dcbSerialParams.ByteSize = ChSize;
229 SetCommState((HANDLE)fd, &dcbSerialParams);
259 SetCommState((HANDLE)fd, &dcbSerialParams);
230 return rs232noerr;
260 return rs232noerr;
231 }
261 }
232 }
262 }
233
263
234
264
235
265
236
266
237
267
238
268
239 int rs232write(rs232port_t fd,char *psWrite, int WriteBufferSize)
269 int rs232write(rs232port_t fd,char *psWrite, int WriteBufferSize)
240 {
270 {
241
271
242 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
272 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
243 {
273 {
244 return (rs232port_t)badPortValue;
274 return (rs232port_t)badPortValue;
245 }
275 }
246 else
276 else
247 {
277 {
248 DWORD dwBytesWriten = 0;
278 DWORD dwBytesWriten = 0;
249 WriteFile((HANDLE)fd, psWrite, WriteBufferSize, &dwBytesWriten, NULL);
279 WriteFile((HANDLE)fd, psWrite, WriteBufferSize, &dwBytesWriten, NULL);
250 return dwBytesWriten;
280 return dwBytesWriten;
251 }
281 }
252 }
282 }
253
283
254
284
255 int rs232read(rs232port_t fd,char *psRead, int ReadBufferSize)
285 int rs232read(rs232port_t fd,char *psRead, int ReadBufferSize)
256 {
286 {
257
287
258 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
288 if (fd == (rs232port_t)INVALID_HANDLE_VALUE)
259 {
289 {
260 return (rs232port_t)badPortValue;
290 return (rs232port_t)badPortValue;
261 }
291 }
262 else
292 else
263 {
293 {
264 DWORD dwBytesRead = 0;
294 DWORD dwBytesRead = 0;
265 ReadFile((HANDLE)fd, psRead, ReadBufferSize, &dwBytesRead, NULL);
295 ReadFile((HANDLE)fd, psRead, ReadBufferSize, &dwBytesRead, NULL);
266 return dwBytesRead;
296 return dwBytesRead;
267 }
297 }
268
298
269 }
299 }
270
300
271
301
272 int rs232saferead(rs232port_t fd,char* data,int count )
302 int rs232saferead(rs232port_t fd,char* data,int count )
273 {
303 {
274 int read=0;
304 int read=0;
275 int i=0;
305 int i=0;
276 for(i=0;i<100;i++)
306 for(i=0;i<100;i++)
277 {
307 {
278 read = rs232read(fd,data,count);
308 read = rs232read(fd,data,count);
279 count -=read;
309 count -=read;
280 data+=read;
310 data+=read;
281 if(count==0)
311 if(count==0)
282 return rs232noerr;
312 return rs232noerr;
283 }
313 }
284 return -1;
314 return -1;
285 }
315 }
286
316
287
317
288
318
289 int rs232safewrite(rs232port_t fd,char* data,int count)
319 int rs232safewrite(rs232port_t fd,char* data,int count)
290 {
320 {
291 int written=0;
321 int written=0;
292 int i=0;
322 int i=0;
293 for(i=0;i<1000;i++)
323 for(i=0;i<1000;i++)
294 {
324 {
295 written = rs232write(fd,data+written,count);
325 written = rs232write(fd,data+written,count);
296 count-=written;
326 count-=written;
297 data+=written;
327 data+=written;
298 if(count==0)
328 if(count==0)
299 return rs232noerr;
329 return rs232noerr;
300 }
330 }
301 return -1;
331 return -1;
302 }
332 }
303
333
304
334
305 int rs232setRTS(rs232port_t fd)
335 int rs232setRTS(rs232port_t fd)
306 {
336 {
307 if(EscapeCommFunction((HANDLE)fd, CLRRTS))
337 if(EscapeCommFunction((HANDLE)fd, CLRRTS))
308 return rs232noerr;
338 return rs232noerr;
309 return -1;
339 return -1;
310 }
340 }
311
341
312 int rs232clearRTS(rs232port_t fd)
342 int rs232clearRTS(rs232port_t fd)
313 {
343 {
314 if(EscapeCommFunction((HANDLE)fd, SETRTS))
344 if(EscapeCommFunction((HANDLE)fd, SETRTS))
315 return rs232noerr;
345 return rs232noerr;
316 return -1;
346 return -1;
317 }
347 }
318
348
319 int rs232setDTR(rs232port_t fd)
349 int rs232setDTR(rs232port_t fd)
320 {
350 {
321 if(EscapeCommFunction((HANDLE)fd, CLRDTR))
351 if(EscapeCommFunction((HANDLE)fd, CLRDTR))
322 return rs232noerr;
352 return rs232noerr;
323 return -1;
353 return -1;
324 }
354 }
325
355
326
356
327 int rs232clearDTR(rs232port_t fd)
357 int rs232clearDTR(rs232port_t fd)
328 {
358 {
329 if(EscapeCommFunction((HANDLE)fd, SETDTR))
359 if(EscapeCommFunction((HANDLE)fd, SETDTR))
330 return rs232noerr;
360 return rs232noerr;
331 return -1;
361 return -1;
332 }
362 }
333
363
334 #endif //#ifdef HAVE_WINDOWS_H
364 #endif //#ifdef HAVE_WINDOWS_H
@@ -1,83 +1,86
1 /* src/rs232config.h.in. Generated from configure.ac by autoheader. */
1 /* src/rs232config.h.in. Generated from configure.ac by autoheader. */
2
2
3 /* Define to 1 if you have the <dirent.h> header file. */
4 #undef HAVE_DIRENT_H
5
3 /* Define to 1 if you have the <dlfcn.h> header file. */
6 /* Define to 1 if you have the <dlfcn.h> header file. */
4 #undef HAVE_DLFCN_H
7 #undef HAVE_DLFCN_H
5
8
6 /* Define to 1 if you have the <errno.h> header file. */
9 /* Define to 1 if you have the <errno.h> header file. */
7 #undef HAVE_ERRNO_H
10 #undef HAVE_ERRNO_H
8
11
9 /* Define to 1 if you have the <fcntl.h> header file. */
12 /* Define to 1 if you have the <fcntl.h> header file. */
10 #undef HAVE_FCNTL_H
13 #undef HAVE_FCNTL_H
11
14
12 /* Define to 1 if you have the <inttypes.h> header file. */
15 /* Define to 1 if you have the <inttypes.h> header file. */
13 #undef HAVE_INTTYPES_H
16 #undef HAVE_INTTYPES_H
14
17
15 /* Define to 1 if you have the <memory.h> header file. */
18 /* Define to 1 if you have the <memory.h> header file. */
16 #undef HAVE_MEMORY_H
19 #undef HAVE_MEMORY_H
17
20
18 /* Define to 1 if you have the <stdint.h> header file. */
21 /* Define to 1 if you have the <stdint.h> header file. */
19 #undef HAVE_STDINT_H
22 #undef HAVE_STDINT_H
20
23
21 /* Define to 1 if you have the <stdio.h> header file. */
24 /* Define to 1 if you have the <stdio.h> header file. */
22 #undef HAVE_STDIO_H
25 #undef HAVE_STDIO_H
23
26
24 /* Define to 1 if you have the <stdlib.h> header file. */
27 /* Define to 1 if you have the <stdlib.h> header file. */
25 #undef HAVE_STDLIB_H
28 #undef HAVE_STDLIB_H
26
29
27 /* Define to 1 if you have the <strings.h> header file. */
30 /* Define to 1 if you have the <strings.h> header file. */
28 #undef HAVE_STRINGS_H
31 #undef HAVE_STRINGS_H
29
32
30 /* Define to 1 if you have the <string.h> header file. */
33 /* Define to 1 if you have the <string.h> header file. */
31 #undef HAVE_STRING_H
34 #undef HAVE_STRING_H
32
35
33 /* Define to 1 if you have the <sys/stat.h> header file. */
36 /* Define to 1 if you have the <sys/stat.h> header file. */
34 #undef HAVE_SYS_STAT_H
37 #undef HAVE_SYS_STAT_H
35
38
36 /* Define to 1 if you have the <sys/types.h> header file. */
39 /* Define to 1 if you have the <sys/types.h> header file. */
37 #undef HAVE_SYS_TYPES_H
40 #undef HAVE_SYS_TYPES_H
38
41
39 /* Define to 1 if you have the <termios.h> header file. */
42 /* Define to 1 if you have the <termios.h> header file. */
40 #undef HAVE_TERMIOS_H
43 #undef HAVE_TERMIOS_H
41
44
42 /* Define to 1 if you have the <termio.h> header file. */
45 /* Define to 1 if you have the <termio.h> header file. */
43 #undef HAVE_TERMIO_H
46 #undef HAVE_TERMIO_H
44
47
45 /* Define to 1 if you have the <unistd.h> header file. */
48 /* Define to 1 if you have the <unistd.h> header file. */
46 #undef HAVE_UNISTD_H
49 #undef HAVE_UNISTD_H
47
50
48 /* Define to 1 if you have the <windows.h> header file. */
51 /* Define to 1 if you have the <windows.h> header file. */
49 #undef HAVE_WINDOWS_H
52 #undef HAVE_WINDOWS_H
50
53
51 /* Define to the sub-directory in which libtool stores uninstalled libraries.
54 /* Define to the sub-directory in which libtool stores uninstalled libraries.
52 */
55 */
53 #undef LT_OBJDIR
56 #undef LT_OBJDIR
54
57
55 /* Name of package */
58 /* Name of package */
56 #undef PACKAGE
59 #undef PACKAGE
57
60
58 /* Define to the address where bug reports for this package should be sent. */
61 /* Define to the address where bug reports for this package should be sent. */
59 #undef PACKAGE_BUGREPORT
62 #undef PACKAGE_BUGREPORT
60
63
61 /* Define to the full name of this package. */
64 /* Define to the full name of this package. */
62 #undef PACKAGE_NAME
65 #undef PACKAGE_NAME
63
66
64 /* Define to the full name and version of this package. */
67 /* Define to the full name and version of this package. */
65 #undef PACKAGE_STRING
68 #undef PACKAGE_STRING
66
69
67 /* Define to the one symbol short name of this package. */
70 /* Define to the one symbol short name of this package. */
68 #undef PACKAGE_TARNAME
71 #undef PACKAGE_TARNAME
69
72
70 /* Define to the home page for this package. */
73 /* Define to the home page for this package. */
71 #undef PACKAGE_URL
74 #undef PACKAGE_URL
72
75
73 /* Define to the version of this package. */
76 /* Define to the version of this package. */
74 #undef PACKAGE_VERSION
77 #undef PACKAGE_VERSION
75
78
76 /* Define to 1 if you have the ANSI C header files. */
79 /* Define to 1 if you have the ANSI C header files. */
77 #undef STDC_HEADERS
80 #undef STDC_HEADERS
78
81
79 /* Version number of package */
82 /* Version number of package */
80 #undef VERSION
83 #undef VERSION
81
84
82 /* Define to empty if `const' does not conform to ANSI C. */
85 /* Define to empty if `const' does not conform to ANSI C. */
83 #undef const
86 #undef const
General Comments 0
You need to be logged in to leave comments. Login now