#else
/* Returns the number of bytes read, or -1 upon failure. */
ret = read(serial->fd, buf, count);
- if (ret < 0)
- /*
- * Should be sr_err(), but that would yield lots of
- * "Resource temporarily unavailable" messages.
- */
- sr_spew("Read error: %s (fd %d).", strerror(errno), serial->fd);
- else
- sr_spew("Read %d/%d bytes (fd %d).", ret, count, serial->fd);
#endif
return ret;
if (dtr != -1) {
sr_spew("Setting DTR %s.", dtr ? "high" : "low");
- if (rts)
+ if (dtr)
dcb.fDtrControl = DTR_CONTROL_ENABLE;
else
dcb.fDtrControl = DTR_CONTROL_DISABLE;
case 230400:
baud = B230400;
break;
-#ifndef __APPLE__
+#if !defined(__APPLE__) && !defined(__OpenBSD__)
case 460800:
baud = B460800;
break;
return SR_ERR;
}
- /* Do not translate carriage return to newline on input. */
- term.c_iflag &= ~(ICRNL);
+ /* Turn off all serial port cooking. */
+ term.c_iflag &= ~(ISTRIP | INLCR | ICRNL);
+ term.c_oflag &= ~(ONLCR | OCRNL | ONOCR);
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
+ term.c_oflag &= ~OFILL;
+#endif
/* Disable canonical mode, and don't echo input characters. */
term.c_lflag &= ~(ICANON | ECHO);
*
* @param serial Previously initialized serial port structure.
* @param paramstr A serial communication parameters string, in the form
- * of <speed>/<data bits><parity><stopbits>, for example "9600/8n1" or
- * "600/7o2".
+ * of <speed>/<data bits><parity><stopbits><flow>, for example "9600/8n1" or
+ * "600/7o2" or "460800/8n1/flow=2" where flow is 0 for none, 1 for rts/cts and 2 for xon/xoff.
*
* @return SR_OK upon success, SR_ERR upon failure.
*/
{
GRegex *reg;
GMatchInfo *match;
- int speed, databits, parity, stopbits, rts, dtr, i;
+ int speed, databits, parity, stopbits, flow, rts, dtr, i;
char *mstr, **opts, **kv;
- speed = databits = parity = stopbits = 0;
+ speed = databits = parity = stopbits = flow = 0;
rts = dtr = -1;
+ sr_spew("Parsing parameters from \"%s\".", paramstr);
reg = g_regex_new(SERIAL_COMM_SPEC, 0, 0, NULL);
if (g_regex_match(reg, paramstr, 0, &match)) {
if ((mstr = g_match_info_fetch(match, 1)))
sr_dbg("invalid value for dtr: %c", kv[1][0]);
speed = 0;
}
+ } else if (!strncmp(kv[0], "flow", 4)) {
+ if (kv[1][0] == '0')
+ flow = 0;
+ else if (kv[1][0] == '1')
+ flow = 1;
+ else if (kv[1][0] == '2')
+ flow = 2;
+ else {
+ sr_dbg("invalid value for flow: %c", kv[1][0]);
+ speed = 0;
+ }
}
g_strfreev(kv);
}
g_match_info_unref(match);
g_regex_unref(reg);
- if (speed)
- return serial_set_params(serial, speed, databits, parity, stopbits,
- 0, rts, dtr);
- else
+ if (speed) {
+ return serial_set_params(serial, speed, databits, parity,
+ stopbits, flow, rts, dtr);
+ } else {
+ sr_dbg("Could not infer speed from parameter string.");
return SR_ERR_ARG;
+ }
}
/**
if (len > 0) {
ibuf += len;
} else if (len == 0) {
- sr_spew("Error: Only read 0 bytes.");
+ /* No logging, already done in serial_read(). */
} else {
/* Error reading byte, but continuing anyway. */
}