The previous implementation considered both the UART bitrate and the
frame format mandatory, users had to specify "/8n1" as well just to
change the bitrate.
This commit makes the frame format optional, and defaults to 8n1 which
is so popular these days. When specified, the frame format still needs
to preceed the other optional flow and handshake flags, for maximum
backwards compatibility, and equal robustness in the process of parsing
serialcomm= specs.
Unfortunately device drivers cannot specify their preferred or default
UART frame format. Which means that users still need to provide these
when a device does not use 8n1. This is not a regression, the previous
implementation always needed the frame format spec.
const char *paramstr)
{
/** @cond PRIVATE */
const char *paramstr)
{
/** @cond PRIVATE */
-#define SERIAL_COMM_SPEC "^(\\d+)/([5678])([neo])([12])(.*)$"
+#define SERIAL_COMM_SPEC "^(\\d+)(/([5678])([neo])([12]))?(.*)$"
/** @endcond */
GRegex *reg;
/** @endcond */
GRegex *reg;
int speed, databits, parity, stopbits, flow, rts, dtr, i;
char *mstr, **opts, **kv;
int speed, databits, parity, stopbits, flow, rts, dtr, i;
char *mstr, **opts, **kv;
- speed = databits = parity = stopbits = flow = 0;
+ speed = flow = 0;
+ databits = 8;
+ parity = SP_PARITY_NONE;
+ stopbits = 1;
rts = dtr = -1;
sr_spew("Parsing parameters from \"%s\".", paramstr);
reg = g_regex_new(SERIAL_COMM_SPEC, 0, 0, NULL);
rts = dtr = -1;
sr_spew("Parsing parameters from \"%s\".", paramstr);
reg = g_regex_new(SERIAL_COMM_SPEC, 0, 0, NULL);
if ((mstr = g_match_info_fetch(match, 1)))
speed = strtoul(mstr, NULL, 10);
g_free(mstr);
if ((mstr = g_match_info_fetch(match, 1)))
speed = strtoul(mstr, NULL, 10);
g_free(mstr);
- if ((mstr = g_match_info_fetch(match, 2)))
+ if ((mstr = g_match_info_fetch(match, 3)) && mstr[0])
databits = strtoul(mstr, NULL, 10);
g_free(mstr);
databits = strtoul(mstr, NULL, 10);
g_free(mstr);
- if ((mstr = g_match_info_fetch(match, 3))) {
+ if ((mstr = g_match_info_fetch(match, 4)) && mstr[0]) {
switch (mstr[0]) {
case 'n':
parity = SP_PARITY_NONE;
switch (mstr[0]) {
case 'n':
parity = SP_PARITY_NONE;
- if ((mstr = g_match_info_fetch(match, 4)))
+ if ((mstr = g_match_info_fetch(match, 5)) && mstr[0])
stopbits = strtoul(mstr, NULL, 10);
g_free(mstr);
stopbits = strtoul(mstr, NULL, 10);
g_free(mstr);
- if ((mstr = g_match_info_fetch(match, 5)) && mstr[0] != '\0') {
+ if ((mstr = g_match_info_fetch(match, 6)) && mstr[0] != '\0') {
if (mstr[0] != '/') {
sr_dbg("missing separator before extra options");
speed = 0;
if (mstr[0] != '/') {
sr_dbg("missing separator before extra options");
speed = 0;
}
g_match_info_unref(match);
g_regex_unref(reg);
}
g_match_info_unref(match);
g_regex_unref(reg);
+ sr_spew("Got params: rate %d, frame %d/%d/%d, flow %d, rts %d, dtr %d.",
+ speed, databits, parity, stopbits, flow, rts, dtr);
if (speed) {
return serial_set_params(serial, speed, databits, parity,
if (speed) {
return serial_set_params(serial, speed, databits, parity,