&uni_t_ut61d_driver_info, receive_data_UNI_T_UT61D,
},
{
- "UNI-T", "UT61E", 19230,
+ /*
+ * Important: The actual baudrate of the Cyrustek ES51922 chip
+ * used in this DMM is 19230. However, the WCH CH9325 chip
+ * (UART to USB/HID) used in (some versions of) the UNI-T
+ * UT-D04 cable doesn't support 19230 baud. It only supports
+ * 19200, and setting an unsupported baudrate will result in
+ * the default of 2400 being used (which will not work with
+ * this DMM, of course).
+ */
+ "UNI-T", "UT61E", 19200,
ES51922_PACKET_SIZE, NULL,
sr_es51922_packet_valid, sr_es51922_parse,
NULL,
devc->bufoffset = 0;
- /* Append the 1-7 data bytes of this chunk to pbuf. */
+ /*
+ * Append the 1-7 data bytes of this chunk to pbuf.
+ *
+ * Special case:
+ * DMMs with Cyrustek ES51922 chip need serial settings of
+ * 19230/7o1. The WCH CH9325 UART to USB/HID chip used in (some
+ * versions of) the UNI-T UT-D04 cable however, will also send
+ * the parity bit to the host in the 8-byte data chunks. This bit
+ * is encoded in bit 7 of each of the 1-7 data bytes and must thus
+ * be removed in order for the actual ES51922 protocol parser to
+ * work properly.
+ */
num_databytes_in_chunk = buf[0] & 0x0f;
- for (i = 0; i < num_databytes_in_chunk; i++)
- pbuf[devc->buflen++] = buf[1 + i];
+ for (i = 0; i < num_databytes_in_chunk; i++, devc->buflen++) {
+ pbuf[devc->buflen] = buf[1 + i];
+ if (udmms[dmm].packet_parse == sr_es51922_parse)
+ pbuf[devc->buflen] &= ~(1 << 7);
+ }
/* Now look for packets in that data. */
while ((devc->buflen - devc->bufoffset) >= udmms[dmm].packet_size) {