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
父節點 3ad30b4e19
當前提交 648f32d119
共有 1 個檔案被更改,包括 16 行新增0 行删除

查看文件

@ -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);