-
Notifications
You must be signed in to change notification settings - Fork 34
/
libserialport.h
1827 lines (1704 loc) · 61.1 KB
/
libserialport.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
* This file is part of the libserialport project.
*
* Copyright (C) 2013, 2015 Martin Ling <martin-libserialport@earth.li>
* Copyright (C) 2014 Uwe Hermann <uwe@hermann-uwe.de>
* Copyright (C) 2014 Aurelien Jacobs <aurel@gnuage.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @mainpage libserialport API
*
* Introduction
* ============
*
* libserialport is a minimal library written in C that is intended to take
* care of the OS-specific details when writing software that uses serial ports.
*
* By writing your serial code to use libserialport, you enable it to work
* transparently on any platform supported by the library.
*
* libserialport is an open source project released under the LGPL3+ license.
*
* The library is maintained by the [sigrok](http://sigrok.org/) project. See
* the [libserialport homepage](http://sigrok.org/wiki/Libserialport) for the
* latest information.
*
* Source code is maintained in git at
* [git://sigrok.org/libserialport](http://sigrok.org/gitweb/?p=libserialport.git).
*
* Bugs are tracked at http://sigrok.org/bugzilla/.
*
* The library was conceived and designed by Martin Ling, is maintained by
* Uwe Hermann, and has received contributions from several other developers.
* See the git history for full credits.
*
* API information
* ===============
*
* The API has been designed from scratch. It does not exactly resemble the
* serial API of any particular operating system. Instead it aims to provide
* a set of functions that can reliably be implemented across all operating
* systems. These form a sufficient basis for higher level behaviour to
* be implemented in a platform independent manner.
*
* If you are porting code written for a particular OS, you may find you need
* to restructure things somewhat, or do without some specialised features.
* For particular notes on porting existing code, see @ref Porting.
*
* Examples
* --------
*
* Some simple example programs using libserialport are included in the
* @c examples directory in the source package:
*
* - @ref list_ports.c - Getting a list of ports present on the system.
* - @ref port_info.c - Getting information on a particular serial port.
* - @ref port_config.c - Accessing configuration settings of a port.
* - @ref send_receive.c - Sending and receiving data.
* - @ref await_events.c - Awaiting events on multiple ports.
* - @ref handle_errors.c - Handling errors returned from the library.
*
* These examples are linked with the API documentation. Each function
* in the API reference includes links to where it is used in an example
* program, and each appearance of a function in the examples links
* to that function's entry in the API reference.
*
* Headers
* -------
*
* To use libserialport functions in your code, you should include the
* libserialport.h header, i.e.
* @code
* #include <libserialport.h>
* @endcode
*
* Namespace
* ---------
*
* All identifiers defined by the public libserialport headers use the prefix
* @c sp_ (for functions and data types) or @c SP_ (for macros and constants).
*
* Functions
* ---------
*
* The functions provided by the library are documented in detail in
* the following sections:
*
* - @ref Enumeration (obtaining a list of serial ports on the system)
* - @ref Ports (opening, closing and getting information about ports)
* - @ref Configuration (baud rate, parity, etc.)
* - @ref Signals (modem control lines, breaks, etc.)
* - @ref Data (reading and writing data, and buffer management)
* - @ref Waiting (waiting for ports to be ready, integrating with event loops)
* - @ref Errors (getting error and debugging information)
*
* Data structures
* ---------------
*
* The library defines three data structures:
*
* - @ref sp_port, which represents a serial port.
* See @ref Enumeration.
* - @ref sp_port_config, which represents a port configuration.
* See @ref Configuration.
* - @ref sp_event_set, which represents a set of events.
* See @ref Waiting.
*
* All these structures are allocated and freed by library functions. It is
* the caller's responsibility to ensure that the correct calls are made to
* free allocated structures after use.
*
* Return codes and error handling
* -------------------------------
*
* Most functions have return type @ref sp_return and can return only four
* possible error values:
*
* - @ref SP_ERR_ARG means that a function was called with invalid
* arguments. This implies a bug in the caller. The arguments passed would
* be invalid regardless of the underlying OS or serial device involved.
*
* - @ref SP_ERR_FAIL means that the OS reported a failure. The error code or
* message provided by the OS can be obtained by calling sp_last_error_code()
* or sp_last_error_message().
*
* - @ref SP_ERR_SUPP indicates that there is no support for the requested
* operation in the current OS, driver or device. No error message is
* available from the OS in this case. There is either no way to request
* the operation in the first place, or libserialport does not know how to
* do so in the current version.
*
* - @ref SP_ERR_MEM indicates that a memory allocation failed.
*
* All of these error values are negative.
*
* Calls that succeed return @ref SP_OK, which is equal to zero. Some functions
* declared @ref sp_return can also return a positive value for a successful
* numeric result, e.g. sp_blocking_read() or sp_blocking_write().
*
* An error message is only available via sp_last_error_message() in the case
* where @ref SP_ERR_FAIL was returned by the previous function call. The error
* message returned is that provided by the OS, using the current language
* settings. It is an error to call sp_last_error_code() or
* sp_last_error_message() except after a previous function call returned
* @ref SP_ERR_FAIL. The library does not define its own error codes or
* messages to accompany other return codes.
*
* Thread safety
* -------------
*
* Certain combinations of calls can be made concurrently, as follows.
*
* - Calls using different ports may always be made concurrently, i.e.
* it is safe for separate threads to handle their own ports.
*
* - Calls using the same port may be made concurrently when one call
* is a read operation and one call is a write operation, i.e. it is safe
* to use separate "reader" and "writer" threads for the same port. See
* below for which operations meet these definitions.
*
* Read operations:
*
* - sp_blocking_read()
* - sp_blocking_read_next()
* - sp_nonblocking_read()
* - sp_input_waiting()
* - sp_flush() with @ref SP_BUF_INPUT only.
* - sp_wait() with @ref SP_EVENT_RX_READY only.
*
* Write operations:
*
* - sp_blocking_write()
* - sp_nonblocking_write()
* - sp_output_waiting()
* - sp_drain()
* - sp_flush() with @ref SP_BUF_OUTPUT only.
* - sp_wait() with @ref SP_EVENT_TX_READY only.
*
* If two calls, on the same port, do not fit into one of these categories
* each, then they may not be made concurrently.
*
* Debugging
* ---------
*
* The library can output extensive tracing and debugging information. The
* simplest way to use this is to set the environment variable
* @c LIBSERIALPORT_DEBUG to any value; messages will then be output to the
* standard error stream.
*
* This behaviour is implemented by a default debug message handling
* callback. An alternative callback can be set using sp_set_debug_handler(),
* in order to e.g. redirect the output elsewhere or filter it.
*
* No guarantees are made about the content of the debug output; it is chosen
* to suit the needs of the developers and may change between releases.
*
* @anchor Porting
* Porting
* -------
*
* The following guidelines may help when porting existing OS-specific code
* to use libserialport.
*
* ### Porting from Unix-like systems ###
*
* There are two main differences to note when porting code written for Unix.
*
* The first is that Unix traditionally provides a wide range of functionality
* for dealing with serial devices at the OS level; this is exposed through the
* termios API and dates to the days when serial terminals were common. If your
* code relies on many of these facilities you will need to adapt it, because
* libserialport provides only a raw binary channel with no special handling.
*
* The second relates to blocking versus non-blocking I/O behaviour. In
* Unix-like systems this is normally specified by setting the @c O_NONBLOCK
* flag on the file descriptor, affecting the semantics of subsequent @c read()
* and @c write() calls.
*
* In libserialport, blocking and nonblocking operations are both available at
* any time. If your existing code ѕets @c O_NONBLOCK, you should use
* sp_nonblocking_read() and sp_nonblocking_write() to get the same behaviour
* as your existing @c read() and @c write() calls. If it does not, you should
* use sp_blocking_read() and sp_blocking_write() instead. You may also find
* sp_blocking_read_next() useful, which reproduces the semantics of a blocking
* read() with @c VTIME=0 and @c VMIN=1 set in termios.
*
* Finally, you should take care if your program uses custom signal handlers.
* The blocking calls provided by libserialport will restart system calls that
* return with @c EINTR, so you will need to make your own arrangements if you
* need to interrupt blocking operations when your signal handlers are called.
* This is not an issue if you only use the default handlers.
*
* ### Porting from Windows ###
*
* The main consideration when porting from Windows is that there is no
* direct equivalent for overlapped I/O operations.
*
* If your program does not use overlapped I/O, you can simply use
* sp_blocking_read() and sp_blocking_write() as direct equivalents for
* @c ReadFile() and @c WriteFile(). You may also find sp_blocking_read_next()
* useful, which reproduces the special semantics of @c ReadFile() with
* @c ReadIntervalTimeout and @c ReadTotalTimeoutMultiplier set to @c MAXDWORD
* and @c ReadTotalTimeoutConstant set to between @c 1 and @c MAXDWORD-1 .
*
* If your program makes use of overlapped I/O to continue work while a serial
* operation is in progress, then you can achieve the same results using
* sp_nonblocking_read() and sp_nonblocking_write().
*
* Generally, overlapped I/O is combined with either waiting for completion
* once there is no more background work to do (using @c WaitForSingleObject()
* or @c WaitForMultipleObjects()), or periodically checking for completion
* with @c GetOverlappedResult(). If the aim is to start a new operation for
* further data once the previous one has completed, you can instead simply
* call the nonblocking functions again with the next data. If you need to
* wait for completion, use sp_wait() to determine when the port is ready to
* send or receive further data.
*/
#ifndef LIBSERIALPORT_LIBSERIALPORT_H
#define LIBSERIALPORT_LIBSERIALPORT_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stddef.h>
/** @cond */
#ifdef _MSC_VER
/* Microsoft Visual C/C++ compiler in use */
#ifdef LIBSERIALPORT_MSBUILD
/* Building the library - need to export DLL symbols */
#define SP_API __declspec(dllexport)
#else
/* Using the library - need to import DLL symbols */
#define SP_API __declspec(dllimport)
#endif
#else
/* Some other compiler in use */
#ifndef LIBSERIALPORT_ATBUILD
/* Not building the library itself - don't need any special prefixes. */
#define SP_API
#endif
#endif
/** @endcond */
/** Return values. */
enum sp_return {
/** Operation completed successfully. */
SP_OK = 0,
/** Invalid arguments were passed to the function. */
SP_ERR_ARG = -1,
/** A system error occurred while executing the operation. */
SP_ERR_FAIL = -2,
/** A memory allocation failed while executing the operation. */
SP_ERR_MEM = -3,
/** The requested operation is not supported by this system or device. */
SP_ERR_SUPP = -4
};
/** Port access modes. */
enum sp_mode {
/** Open port for read access. */
SP_MODE_READ = 1,
/** Open port for write access. */
SP_MODE_WRITE = 2,
/** Open port for read and write access. @since 0.1.1 */
SP_MODE_READ_WRITE = 3
};
/** Port events. */
enum sp_event {
/** Data received and ready to read. */
SP_EVENT_RX_READY = 1,
/** Ready to transmit new data. */
SP_EVENT_TX_READY = 2,
/** Error occurred. */
SP_EVENT_ERROR = 4
};
/** Buffer selection. */
enum sp_buffer {
/** Input buffer. */
SP_BUF_INPUT = 1,
/** Output buffer. */
SP_BUF_OUTPUT = 2,
/** Both buffers. */
SP_BUF_BOTH = 3
};
/** Parity settings. */
enum sp_parity {
/** Special value to indicate setting should be left alone. */
SP_PARITY_INVALID = -1,
/** No parity. */
SP_PARITY_NONE = 0,
/** Odd parity. */
SP_PARITY_ODD = 1,
/** Even parity. */
SP_PARITY_EVEN = 2,
/** Mark parity. */
SP_PARITY_MARK = 3,
/** Space parity. */
SP_PARITY_SPACE = 4
};
/** RTS pin behaviour. */
enum sp_rts {
/** Special value to indicate setting should be left alone. */
SP_RTS_INVALID = -1,
/** RTS off. */
SP_RTS_OFF = 0,
/** RTS on. */
SP_RTS_ON = 1,
/** RTS used for flow control. */
SP_RTS_FLOW_CONTROL = 2
};
/** CTS pin behaviour. */
enum sp_cts {
/** Special value to indicate setting should be left alone. */
SP_CTS_INVALID = -1,
/** CTS ignored. */
SP_CTS_IGNORE = 0,
/** CTS used for flow control. */
SP_CTS_FLOW_CONTROL = 1
};
/** DTR pin behaviour. */
enum sp_dtr {
/** Special value to indicate setting should be left alone. */
SP_DTR_INVALID = -1,
/** DTR off. */
SP_DTR_OFF = 0,
/** DTR on. */
SP_DTR_ON = 1,
/** DTR used for flow control. */
SP_DTR_FLOW_CONTROL = 2
};
/** DSR pin behaviour. */
enum sp_dsr {
/** Special value to indicate setting should be left alone. */
SP_DSR_INVALID = -1,
/** DSR ignored. */
SP_DSR_IGNORE = 0,
/** DSR used for flow control. */
SP_DSR_FLOW_CONTROL = 1
};
/** XON/XOFF flow control behaviour. */
enum sp_xonxoff {
/** Special value to indicate setting should be left alone. */
SP_XONXOFF_INVALID = -1,
/** XON/XOFF disabled. */
SP_XONXOFF_DISABLED = 0,
/** XON/XOFF enabled for input only. */
SP_XONXOFF_IN = 1,
/** XON/XOFF enabled for output only. */
SP_XONXOFF_OUT = 2,
/** XON/XOFF enabled for input and output. */
SP_XONXOFF_INOUT = 3
};
/** Standard flow control combinations. */
enum sp_flowcontrol {
/** No flow control. */
SP_FLOWCONTROL_NONE = 0,
/** Software flow control using XON/XOFF characters. */
SP_FLOWCONTROL_XONXOFF = 1,
/** Hardware flow control using RTS/CTS signals. */
SP_FLOWCONTROL_RTSCTS = 2,
/** Hardware flow control using DTR/DSR signals. */
SP_FLOWCONTROL_DTRDSR = 3
};
/** Input signals. */
enum sp_signal {
/** Clear to send. */
SP_SIG_CTS = 1,
/** Data set ready. */
SP_SIG_DSR = 2,
/** Data carrier detect. */
SP_SIG_DCD = 4,
/** Ring indicator. */
SP_SIG_RI = 8
};
/**
* Transport types.
*
* @since 0.1.1
*/
enum sp_transport {
/** Native platform serial port. @since 0.1.1 */
SP_TRANSPORT_NATIVE,
/** USB serial port adapter. @since 0.1.1 */
SP_TRANSPORT_USB,
/** Bluetooth serial port adapter. @since 0.1.1 */
SP_TRANSPORT_BLUETOOTH
};
/**
* @struct sp_port
* An opaque structure representing a serial port.
*/
struct sp_port;
/**
* @struct sp_port_config
* An opaque structure representing the configuration for a serial port.
*/
struct sp_port_config;
/**
* @struct sp_event_set
* A set of handles to wait on for events.
*/
struct sp_event_set {
/** Array of OS-specific handles. */
void *handles;
/** Array of bitmasks indicating which events apply for each handle. */
enum sp_event *masks;
/** Number of handles. */
unsigned int count;
};
/**
* @defgroup Enumeration Port enumeration
*
* Enumerating the serial ports of a system.
*
* See @ref list_ports.c for a working example of port enumeration.
*
* @{
*/
/**
* Obtain a pointer to a new sp_port structure representing the named port.
*
* The user should allocate a variable of type "struct sp_port *" and pass a
* pointer to this to receive the result.
*
* The result should be freed after use by calling sp_free_port().
*
* @param[in] portname The OS-specific name of a serial port. Must not be NULL.
* @param[out] port_ptr If any error is returned, the variable pointed to by
* port_ptr will be set to NULL. Otherwise, it will be set
* to point to the newly allocated port. Must not be NULL.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_get_port_by_name(const char *portname, struct sp_port **port_ptr);
/**
* Free a port structure obtained from sp_get_port_by_name() or sp_copy_port().
*
* @param[in] port Pointer to a port structure. Must not be NULL.
*
* @since 0.1.0
*/
SP_API void sp_free_port(struct sp_port *port);
/**
* List the serial ports available on the system.
*
* The result obtained is an array of pointers to sp_port structures,
* terminated by a NULL. The user should allocate a variable of type
* "struct sp_port **" and pass a pointer to this to receive the result.
*
* The result should be freed after use by calling sp_free_port_list().
* If a port from the list is to be used after freeing the list, it must be
* copied first using sp_copy_port().
*
* @param[out] list_ptr If any error is returned, the variable pointed to by
* list_ptr will be set to NULL. Otherwise, it will be set
* to point to the newly allocated array. Must not be NULL.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_list_ports(struct sp_port ***list_ptr);
/**
* Make a new copy of an sp_port structure.
*
* The user should allocate a variable of type "struct sp_port *" and pass a
* pointer to this to receive the result.
*
* The copy should be freed after use by calling sp_free_port().
*
* @param[in] port Pointer to a port structure. Must not be NULL.
* @param[out] copy_ptr If any error is returned, the variable pointed to by
* copy_ptr will be set to NULL. Otherwise, it will be set
* to point to the newly allocated copy. Must not be NULL.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_copy_port(const struct sp_port *port, struct sp_port **copy_ptr);
/**
* Free a port list obtained from sp_list_ports().
*
* This will also free all the sp_port structures referred to from the list;
* any that are to be retained must be copied first using sp_copy_port().
*
* @param[in] ports Pointer to a list of port structures. Must not be NULL.
*
* @since 0.1.0
*/
SP_API void sp_free_port_list(struct sp_port **ports);
/**
* @}
* @defgroup Ports Port handling
*
* Opening, closing and querying ports.
*
* See @ref port_info.c for a working example of getting port information.
*
* @{
*/
/**
* Open the specified serial port.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
* @param[in] flags Flags to use when opening the serial port.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_open(struct sp_port *port, enum sp_mode flags);
/**
* Close the specified serial port.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_close(struct sp_port *port);
/**
* Get the name of a port.
*
* The name returned is whatever is normally used to refer to a port on the
* current operating system; e.g. for Windows it will usually be a "COMn"
* device name, and for Unix it will be a device path beginning with "/dev/".
*
* @param[in] port Pointer to a port structure. Must not be NULL.
*
* @return The port name, or NULL if an invalid port is passed. The name
* string is part of the port structure and may not be used after
* the port structure has been freed.
*
* @since 0.1.0
*/
SP_API char *sp_get_port_name(const struct sp_port *port);
/**
* Get a description for a port, to present to end user.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
*
* @return The port description, or NULL if an invalid port is passed.
* The description string is part of the port structure and may not
* be used after the port structure has been freed.
*
* @since 0.1.1
*/
SP_API char *sp_get_port_description(const struct sp_port *port);
/**
* Get the transport type used by a port.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
*
* @return The port transport type.
*
* @since 0.1.1
*/
SP_API enum sp_transport sp_get_port_transport(const struct sp_port *port);
/**
* Get the USB bus number and address on bus of a USB serial adapter port.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
* @param[out] usb_bus Pointer to a variable to store the USB bus.
* Can be NULL (in that case it will be ignored).
* @param[out] usb_address Pointer to a variable to store the USB address.
* Can be NULL (in that case it will be ignored).
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.1
*/
SP_API enum sp_return sp_get_port_usb_bus_address(const struct sp_port *port,
int *usb_bus, int *usb_address);
/**
* Get the USB Vendor ID and Product ID of a USB serial adapter port.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
* @param[out] usb_vid Pointer to a variable to store the USB VID.
* Can be NULL (in that case it will be ignored).
* @param[out] usb_pid Pointer to a variable to store the USB PID.
* Can be NULL (in that case it will be ignored).
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.1
*/
SP_API enum sp_return sp_get_port_usb_vid_pid(const struct sp_port *port, int *usb_vid, int *usb_pid);
/**
* Get the USB manufacturer string of a USB serial adapter port.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
*
* @return The port manufacturer string, or NULL if an invalid port is passed.
* The manufacturer string is part of the port structure and may not
* be used after the port structure has been freed.
*
* @since 0.1.1
*/
SP_API char *sp_get_port_usb_manufacturer(const struct sp_port *port);
/**
* Get the USB product string of a USB serial adapter port.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
*
* @return The port product string, or NULL if an invalid port is passed.
* The product string is part of the port structure and may not be
* used after the port structure has been freed.
*
* @since 0.1.1
*/
SP_API char *sp_get_port_usb_product(const struct sp_port *port);
/**
* Get the USB serial number string of a USB serial adapter port.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
*
* @return The port serial number, or NULL if an invalid port is passed.
* The serial number string is part of the port structure and may
* not be used after the port structure has been freed.
*
* @since 0.1.1
*/
SP_API char *sp_get_port_usb_serial(const struct sp_port *port);
/**
* Get the MAC address of a Bluetooth serial adapter port.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
*
* @return The port MAC address, or NULL if an invalid port is passed.
* The MAC address string is part of the port structure and may not
* be used after the port structure has been freed.
*
* @since 0.1.1
*/
SP_API char *sp_get_port_bluetooth_address(const struct sp_port *port);
/**
* Get the operating system handle for a port.
*
* The type of the handle depends on the operating system. On Unix based
* systems, the handle is a file descriptor of type "int". On Windows, the
* handle is of type "HANDLE". The user should allocate a variable of the
* appropriate type and pass a pointer to this to receive the result.
*
* To obtain a valid handle, the port must first be opened by calling
* sp_open() using the same port structure.
*
* After the port is closed or the port structure freed, the handle may
* no longer be valid.
*
* @warning This feature is provided so that programs may make use of
* OS-specific functionality where desired. Doing so obviously
* comes at a cost in portability. It also cannot be guaranteed
* that direct usage of the OS handle will not conflict with the
* library's own usage of the port. Be careful.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
* @param[out] result_ptr If any error is returned, the variable pointed to by
* result_ptr will have unknown contents and should not
* be used. Otherwise, it will be set to point to the
* OS handle. Must not be NULL.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_get_port_handle(const struct sp_port *port, void *result_ptr);
/**
* @}
*
* @defgroup Configuration Configuration
*
* Setting and querying serial port parameters.
*
* See @ref port_config.c for a working example of port configuration.
*
* You should always configure all settings before using a port.
* There are no default settings applied by libserialport.
* When you open a port it may have default settings from the OS or
* driver, or the settings left over by the last program to use it.
*
* You should always set baud rate, data bits, parity and stop bits.
*
* You should normally also set one of the preset @ref sp_flowcontrol
* flow control modes, which will set up the RTS, CTS, DTR and DSR pin
* behaviours and enable or disable XON/XOFF. If you need an unusual
* configuration not covered by the preset flow control modes, you
* will need to configure these settings individually, and avoid
* calling sp_set_flowcontrol() or sp_set_config_flowcontrol() which
* will overwrite these settings.
*
* A port must be opened before you can change its settings.
*
* There are two ways of accessing port settings:
*
* Configuration structures
* ------------------------
*
* You can read and write a whole configuration (all settings at once)
* using sp_get_config() and sp_set_config(). This is handy if you want
* to change between some preset combinations, or save and restore an
* existing configuration. It also ensures the changes are made
* together, via an efficient set of calls into the OS - in some cases
* a single system call can be used.
*
* Use accessor functions like sp_get_config_baudrate() and
* sp_set_config_baudrate() to get and set individual settings
* from a configuration.
*
* For each setting in a port configuration, a special value of -1 can
* be used, which will cause that setting to be left alone when the
* configuration is applied by sp_set_config().
*
* This value is also be used by sp_get_config() for any settings
* which are unconfigured at the OS level, or in a state that is
* not representable within the libserialport API.
*
* Configurations are allocated using sp_new_config() and freed
* with sp_free_config(). You need to manage them yourself. When
* a new configuration is allocated by sp_new_config(), all of
* its settings are initially set to the special -1 value.
*
* Direct functions for changing port settings
* -------------------------------------------
*
* As a shortcut, you can set individual settings on a port directly
* by calling functions like sp_set_baudrate() and sp_set_parity().
* This saves you the work of allocating a temporary config, setting it
* up, applying it to a port and then freeing it.
*
* @{
*/
/**
* Allocate a port configuration structure.
*
* The user should allocate a variable of type "struct sp_port_config *" and
* pass a pointer to this to receive the result. The variable will be updated
* to point to the new configuration structure. The structure is opaque and
* must be accessed via the functions provided.
*
* All parameters in the structure will be initialised to special values which
* are ignored by sp_set_config().
*
* The structure should be freed after use by calling sp_free_config().
*
* @param[out] config_ptr If any error is returned, the variable pointed to by
* config_ptr will be set to NULL. Otherwise, it will
* be set to point to the allocated config structure.
* Must not be NULL.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_new_config(struct sp_port_config **config_ptr);
/**
* Free a port configuration structure.
*
* @param[in] config Pointer to a configuration structure. Must not be NULL.
*
* @since 0.1.0
*/
SP_API void sp_free_config(struct sp_port_config *config);
/**
* Get the current configuration of the specified serial port.
*
* The user should allocate a configuration structure using sp_new_config()
* and pass this as the config parameter. The configuration structure will
* be updated with the port configuration.
*
* Any parameters that are configured with settings not recognised or
* supported by libserialport, will be set to special values that are
* ignored by sp_set_config().
*
* @param[in] port Pointer to a port structure. Must not be NULL.
* @param[out] config Pointer to a configuration structure that will hold
* the result. Upon errors the contents of the config
* struct will not be changed. Must not be NULL.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_get_config(struct sp_port *port, struct sp_port_config *config);
/**
* Set the configuration for the specified serial port.
*
* For each parameter in the configuration, there is a special value (usually
* -1, but see the documentation for each field). These values will be ignored
* and the corresponding setting left unchanged on the port.
*
* Upon errors, the configuration of the serial port is unknown since
* partial/incomplete config updates may have happened.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
* @param[in] config Pointer to a configuration structure. Must not be NULL.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_set_config(struct sp_port *port, const struct sp_port_config *config);
/**
* Set the baud rate for the specified serial port.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
* @param[in] baudrate Baud rate in bits per second.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_set_baudrate(struct sp_port *port, int baudrate);
/**
* Get the baud rate from a port configuration.
*
* The user should allocate a variable of type int and
* pass a pointer to this to receive the result.
*
* @param[in] config Pointer to a configuration structure. Must not be NULL.
* @param[out] baudrate_ptr Pointer to a variable to store the result. Must not be NULL.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_get_config_baudrate(const struct sp_port_config *config, int *baudrate_ptr);
/**
* Set the baud rate in a port configuration.
*
* @param[in] config Pointer to a configuration structure. Must not be NULL.
* @param[in] baudrate Baud rate in bits per second, or -1 to retain the current setting.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_set_config_baudrate(struct sp_port_config *config, int baudrate);
/**
* Set the data bits for the specified serial port.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
* @param[in] bits Number of data bits.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_set_bits(struct sp_port *port, int bits);
/**
* Get the data bits from a port configuration.
*
* The user should allocate a variable of type int and
* pass a pointer to this to receive the result.
*
* @param[in] config Pointer to a configuration structure. Must not be NULL.
* @param[out] bits_ptr Pointer to a variable to store the result. Must not be NULL.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_get_config_bits(const struct sp_port_config *config, int *bits_ptr);
/**
* Set the data bits in a port configuration.
*
* @param[in] config Pointer to a configuration structure. Must not be NULL.
* @param[in] bits Number of data bits, or -1 to retain the current setting.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_set_config_bits(struct sp_port_config *config, int bits);
/**
* Set the parity setting for the specified serial port.
*
* @param[in] port Pointer to a port structure. Must not be NULL.
* @param[in] parity Parity setting.
*
* @return SP_OK upon success, a negative error code otherwise.
*
* @since 0.1.0
*/
SP_API enum sp_return sp_set_parity(struct sp_port *port, enum sp_parity parity);
/**
* Get the parity setting from a port configuration.
*
* The user should allocate a variable of type enum sp_parity and
* pass a pointer to this to receive the result.
*
* @param[in] config Pointer to a configuration structure. Must not be NULL.
* @param[out] parity_ptr Pointer to a variable to store the result. Must not be NULL.
*
* @return SP_OK upon success, a negative error code otherwise.