The protocol used by the UT61e is quite simple, each packet contains 14 bytes. It constantly streams packets as the screen is updated at around 2 packets a second. The 14 bytes are basically a string where the range, digits, function, status are contained.
The serial interface settings are:
19200 baud, odd parity, 7 data bits, 1 stop bit, no handshake.
Describing the protocol:
This snippet shows you how the data is separated, I handle the 14 bytes as a string, which simplifies the process of separating each portion and since this is a low sampling rate application with low priority, it’s not a resource hog.
If ReadSerialPortData( port, @inp, 14 ) If AddElement( *this\sample() ) *this\sample()\range = Asc(Mid(inp, 1)) ; RANGE *this\sample()\digits = Mid( inp, 2, 5 ) ; DIGITS *this\sample()\function = Asc(Mid(inp, 7 )) ; FUNCTION *this\sample()\status = Asc(Mid(inp, 8 )) ; STATUS *this\sample()\option = Asc(Mid(inp, 9 )) ; OPTION 1 *this\sample()\option = Asc(Mid(inp, 10 )) ; OPTION 2 *this\sample()\option = Asc(Mid(inp, 11 )) ; OPTION 2 EndIf EndIf
I believe the last two digits are the “end of packet” limiter (CRLF) however I currently cannot test this, I wrote the code a long time ago and I forgot to comment on this slight detail, but as you can see I’ve defined the CRLF contants, so it must be there.
A list of constants:
Here are some constants from my UT61e (unpublished) library…
#FUNCTION_VOLTAGE = %0111011 #FUNCTION_AUTO_CURRENT_UA = %0111101 #FUNCTION_AUTO_CURRENT_MA = %0111111 #FUNCTION_CURRENT_22A = %0110000 #FUNCTION_CURRENT_MANUAL_A = %0111001 #FUNCTION_OHMS = %0110011 #FUNCTION_CONTINUITY = %0110101 #FUNCTION_DIODE = %0110001 #FUNCTION_FREQUENCY = %0110010 #FUNCTION_CAPACITANCE = %0110110 #FUNCTION_TEMPERATURE = %0110100 #FUNCTION_ADP = %0111110 #RANGE_ONE = %0110000 ; Example: 22.000nF #RANGE_TWO = %0110001 ; Example: 220.00nF #RANGE_THREE = %0110010 ; Example: 2.2000µF #RANGE_FOUR = %0110011 ; Example: 22.000µF #RANGE_FIVE = %0110100 ; Example: 220.00µF #RANGE_SIX = %0110101 ; Example: 2.2000mF #RANGE_SEVEN = %0110110 ; Example: 22.000mF #RANGE_EIGHT = %0110111 ; Example: 220.00mF #DIGIT_0 = %0110000 #DIGIT_1 = %0110001 #DIGIT_2 = %0110010 #DIGIT_3 = %0110011 #DIGIT_4 = %0110100 #DIGIT_5 = %0110101 #DIGIT_6 = %0110110 #DIGIT_7 = %0110111 #DIGIT_8 = %0111000 #DIGIT_9 = %0111001 #STATUS_OL = 1 < < 0 #STATUS_BATT = 1 << 1 #STATUS_SIGN = 1 << 2 #STATUS_JUDGE = 1 << 3 #OPTION1_RMR = 1 << 0 #OPTION1_REL = 1 << 1 #OPTION1_MIN = 1 << 2 #OPTION1_MAX = 1 << 3 #OPTION2_0 = 1 << 0 #OPTION2_PMIN = 1 << 1 #OPTION2_PMAX = 1 << 2 #OPTION2_UL = 1 << 3 #OPTION3_VAHZ = 1 << 0 #OPTION3_AUTO = 1 << 1 #OPTION3_AC = 1 << 2 #OPTION3_DC = 1 << 3 #UT_CR = %0001101 #UT_LF = %0001010
That’s all for now, I currently don’t have a serial interface to test with (Ain’t got the USB cable either) so I can’t finish the library as to post it, but hopefully I’ll get it done eventually.
The supplied software by UNI-T is pretty bad and it’s Windows only, hence the drive to write my own.
As it is, it should give someone a head-start if they’re about to write their own front-end. On the datasheet of the UT61e controller it’s all explained in fine detail, but I can’t recall the number at the moment.
This whole thing was part of a bigger picture, but I had to give up the concept due to lack of funding.
Alright, enough of this shoulda, coulda, woulda!