brymen-dmm: unbreak BM85x communication by pulsing RTS after COM port open

Either the Brymen meters in the BM850s series or their cables require an
RTS pulse to wakeup, without it there won't be a response during scan or
when requesting measurements. Follow the vendor's documented sequence for
a low RTS pulse after opening the serial port and before communication to
the device.

This fixes bug #1595.

Reported-By: Karl Palsson <karlp@tweak.net.au>
This commit is contained in:
Gerhard Sittig 2020-09-20 09:23:45 +02:00
parent 3ad30b4e19
commit 648f32d119
1 changed files with 16 additions and 0 deletions

View File

@ -41,6 +41,7 @@ static GSList *brymen_scan(struct sr_dev_driver *di, const char *conn,
struct sr_dev_inst *sdi;
struct dev_context *devc;
struct sr_serial_dev_inst *serial;
int rts_toggle_delay_us;
GSList *devices;
int ret;
uint8_t buf[128];
@ -50,6 +51,21 @@ static GSList *brymen_scan(struct sr_dev_driver *di, const char *conn,
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return NULL;
/*
* The device requires an RTS *pulse* before communication.
* The vendor's documentation recommends the following sequence:
* Open the COM port, wait for 100ms, set RTS=1, wait for 100ms,
* set RTS=0, wait for 100ms, set RTS=1, configure bitrate and
* frame format, transmit request data, receive response data.
*/
rts_toggle_delay_us = 100 * 1000; /* 100ms */
g_usleep(rts_toggle_delay_us);
serial_set_handshake(serial, 1, -1);
g_usleep(rts_toggle_delay_us);
serial_set_handshake(serial, 0, -1);
g_usleep(rts_toggle_delay_us);
serial_set_handshake(serial, 1, -1);
g_usleep(rts_toggle_delay_us);
sr_info("Probing port %s.", conn);