API
 
Loading...
Searching...
No Matches
za_serial.h
Go to the documentation of this file.
1/**
2 * \file za_serial.h
3 * \author Eric Dand
4 * \version 1.0
5 * \date 28 November 2014
6 * \copyright Apache Software License Version 2.0
7 *
8 * \brief Provides a set of functions for interacting with Zaber devices in
9 * the ASCII protocol.
10 */
11
12#if !defined(ZA_SERIAL_H)
13#define ZA_SERIAL_H
14
15#if defined(__cplusplus)
16extern "C"{
17#endif /* if defined(__cplusplus) */
18
19#include "z_common.h"
20
21/** Provides programmatic access to reply data.
22 *
23 * This struct is provided as a convenience to allow for easier interaction
24 * with ASCII replies. The names of the fields are taken straight from the
25 * ASCII protocol manual.
26 *
27 * Note that the response data may contain more than one piece of data:
28 * because many replies will return multiple pieces of data, the response_data
29 * field will simply contain the end of the message, without the newline
30 * terminators. (ie. "\r\n")
31 */
32struct za_reply {
33 /** The message type will always be '@' for replies.
34 * Info will have the type '#', and alerts '!'. */
36 /** The address of the device, an integer between 1 and 99. */
38 /** The axis number: 0-9, where 0 refers to the whole device,
39 * and 1-9 refer only to that specific axis. */
41 /** Whether a command was accepted or rejected: either "OK" or "RJ". */
42 char reply_flags[3];
43 /** Either "BUSY" when the axis is moving, or "IDLE" when it isn't. */
45 /** The highest priority warning for the device,
46 * or -- under normal conditions. */
48 /** The response for the command executed. See the protocol manual entry
49 * for your command of choice to know what to expect here. */
50 char response_data[128];
51};
52
53/** Connect to a serial port specified by \a port_name.
54 *
55 * Configures the port to the ASCII protocol defaults (115200 baud, 8N1).
56 * If you have set your device to run at a different baud rate, use
57 * za_setbaud() to change it after connecting using this function.
58 *
59 * On Linux the port name will likely be something like "/dev/ttyUSB0",
60 * on Windows "COM1", and on OS X and BSD systems "/dev/cu.usbserial-A4017CQX".
61 * It is important that OS X/BSD systems use the "callout" (cu.* or cua.*) port
62 * as opposed to the "dial in" ports with names starting with tty.*,
63 * which will not work with Zaber devices.
64 *
65 * If you are re-using a `z_port`, make sure to use za_disconnect() to
66 * disconnect the old port before overwriting it with a new one.
67 *
68 * \param[out] port a pointer to a `z_port` to be written-over with the
69 * newly-connected port.
70 * \param[in] port_name a string containing the name of the port to be opened.
71 *
72 * \return Z_SUCCESS on success, Z_ERROR_NULL_PARAMETER if \a port or
73 * \a port_name is NULL, or Z_ERROR_SYSTEM_ERROR in case of system error.
74 */
75int za_connect(z_port *port, const char *port_name);
76
77/** Gracefully closes a connection.
78 *
79 * \param[in] port the port to be disconnected.
80 *
81 * \return Z_SUCCESS on success, Z_ERROR_SYSTEM_ERROR in case of system error.
82 */
83int za_disconnect(z_port port);
84
85/** Sends a command to a serial port.
86 *
87 * Automatically adds a '/' to begin the command and a '\\n' to end it if
88 * these characters are omitted from \a command.
89 *
90 * \param[in] port the port to which to send the command.
91 * \param[in] command a string containing the command to be sent.
92 *
93 * \return the number of bytes written, Z_ERROR_NULL_PARAMETER if \a command is
94 * NULL, or Z_ERROR_SYSTEM_ERROR in case of system error.
95 */
96int za_send(z_port port, const char *command, size_t sMaxSz);
97
98/** Reads a message from the serial port.
99 *
100 * Blocks while reading until it encounters a newline character or its
101 * timeout has elapsed.
102 *
103 * Note: It is recommended that your \a destination buffer be 256B long.
104 * This is long enough to hold any reply from a Zaber device using the
105 * ASCII protocol.
106 *
107 * Note that this function will simply read the first message on the input
108 * buffer, whatever it may be. If you have sent many commands without
109 * receiving their corresponding replies, sorting them all out may be a real
110 * headache. Note also that the input buffer is finite, and allowing it to
111 * fill up will result in undefined behaviour. Try to receive responses to
112 * every command you send, or use za_drain() when necessary.
113 *
114 * Passing NULL for \a destination and 0 for \a length will read a single
115 * reply, discarding it as it is read. This is useful for keeping your
116 * commands and replies straight without using zb_drain() when you don't care
117 * about the contents of most of the replies.
118 *
119 * \param[in] port the port to receive a message from.
120 * \param[out] destination a pointer to which to write the reply read.
121 * \param[in] length the length of the buffer pointed to by \a destination.
122 *
123 * \return the number of bytes read, Z_ERROR_SYSTEM_ERROR in case of system
124 * error, or Z_ERROR_BUFFER_TOO_SMALL if \a length is insufficient to store
125 * the reply.
126 */
127int za_receive(z_port port, char *destination, int length);
128
129/** Build a #za_reply struct from a string pointed-to by reply.
130 *
131 * The #za_reply struct can then be used to gain easier access to the parts
132 * of an ASCII reply.
133 *
134 * \param[out] destination a pointer to a za_reply struct to be populated
135 * with the data found in \a reply.
136 * \param[in] reply a pointer to a string containing a full reply from a Zaber
137 * device, as specified by the ASCII protocol manual.
138 *
139 * \return Z_SUCCESS on success, Z_ERROR_NULL_PARAMETER if \a destination or
140 * \a reply is NULL, or Z_ERROR_COULD_NOT_DECODE if the reply is malformed.
141 */
142int za_decode(struct za_reply *destination, const char *reply, size_t sMaxSz);
143
144/** Changes the baud rate of both input and output.
145 *
146 * This function is unlikely to be necessary for typical use, as za_connect()
147 * already sets the baud rate to 115200, the recommended rate for the
148 * ASCII protocol.
149 *
150 * Note: za_setbaud() flushes both input and output buffers to ensure a
151 * "clean slate" after the baud rate has been changed.
152 *
153 * Also note that this sets the baud rate at which the program tries to talk
154 * to the device. It does not change the baud rate of the device itself. See
155 * the ASCII Protocol Manual for info on how to change the device's baud rate.
156 *
157 * Valid baid rates are 9600, 19200, 38400, 57600, and 115200.
158 *
159 * \param[in] port the port to change.
160 * \param[in] baud the new desired baud rate.
161 *
162 * \return Z_SUCCESS on success, Z_ERROR_INVALID_BAUDRATE if the baud rate is not one
163 * specified above, or Z_ERROR_SYSTEM_ERROR in case of system error.
164 */
165int za_setbaud(z_port port, int baud);
166
167/** Flushes all input received but not yet read, and attempts to drain all
168 * input that would be incoming.
169 *
170 * This function is intended to be used when many commands have been sent
171 * without reading any responses, and there is a need to read a response from
172 * a certain command. In other words, call this function before sending a
173 * command whose response you would like to read if you have not been
174 * consistently reading the responses to previous commands.
175 *
176 * This function will always take at least 100ms to complete, as it tries to
177 * read input until it is certain no more is arriving by waiting 100ms before
178 * deciding there is no more input incoming. Do not use it for
179 * time-sensitive operations, or in any kind of "chatty" setup, eg. multiple
180 * devices daisy-chained together with move tracking enabled. In such a setup,
181 * the only reliable way to retrieve reply data is to always follow
182 * calls to za_send() with calls to za_receive().
183 *
184 * \param[in] port the port to drain.
185 *
186 * \return Z_SUCCESS on success, or Z_ERROR_SYSTEM_ERROR in case of system error.
187 */
188int za_drain(z_port port);
189
190/** Sets whether errors and extra info are reported to `stderr`.
191 *
192 * Set \a value to 0 to disable all output. Additionally, you can compile this
193 * library with the macro NDEBUG defined, which will disable all output and
194 * skip checks to "verbose" altogether in the compiled code.
195 *
196 * \param[in] value whether or not the program should output error messages
197 * and info to `stderr`.
198 */
199void za_set_verbose(int value);
200
201#if defined(__cplusplus)
202}
203#endif /* if defined(__cplusplus) */
204
205#endif /* if !defined(ZA_SERIAL_H) */
int za_connect(z_port *port, const char *port_name)
Definition za_serial.c:53
int za_setbaud(z_port port, int baud)
Definition za_serial.c:200
void za_set_verbose(int value)
Definition za_serial.c:18
int za_receive(z_port port, char *destination, int length)
Definition za_serial.c:151
int za_decode(struct za_reply *destination, const char *reply, size_t sMaxSz)
Definition za_serial.c:539
int za_send(z_port port, const char *command, size_t sMaxSz)
Definition za_serial.c:112
int za_drain(z_port port)
Definition za_serial.c:235
int za_disconnect(z_port port)
Definition za_serial.c:99
Defines a few things that all of the serial API has in common.
char device_status[5]
Definition za_serial.h:44
char message_type
Definition za_serial.h:35
int device_address
Definition za_serial.h:37
char reply_flags[3]
Definition za_serial.h:42
char warning_flags[3]
Definition za_serial.h:47
int axis_number
Definition za_serial.h:40
char response_data[128]
Definition za_serial.h:50