In part 1 of our series on programming the 9103 with Python, we wrote a simple application to control the 9103 and sample at standard speeds (as fast as 40 samples/second). Before we look at programming a 9103 in high-speed mode, we’ll program a utility to determine which speed mode the 9103 is currently set for, and provide a means to switch speed modes. All python samples for the 9103 can be found here.
(The high-speed option for the 9103 provides up to 500 samples/second and is available as an option when purchasing. The 9103 is also available with a high-voltage option and 90 V fixed or external bias)
A Python Utility App for Switching Speed Modes
The 9103 with the high-speed option recalls the last speed mode (standard or high) at which it was operated at. This makes it easier to program applications that normally only operate in one speed mode. However, because the different modes open the serial ports at different baud rates (57.6k for standard, 230.4k for high) it may not be known what mode the 9103 was last operating in, so an application could fail if it assumes the incorrect speed.
Since you can’t query the 9103 speed mode without opening the port, one way to get around the issue is to catch a port failure, and try a different baud rate.
This utility tries to open the port for standard speed, and if that fails, high speed. In either case, if the port is successfully opened and communications with the 9103 established, the user is prompted to switch the speed mode.
Exception Handling for the Win
The 9103 firmware recalls the last port speed and communicates at that speed. However, the driver for the virtual USB port can be successfully opened as long as the device is connected to the port, even if there is a speed mismatch
So, as always, we create a try/except handler to first attempt to open the correct port:
try: port=serial.Serial( 'com' + port_number, baudrate=57600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, xonxoff=False, timeout=0) except: port_open = False do_nothing = input('9103 standard speed not found. Press enter to continue...')
In order to determine if we are communicating at the correct baud rate, we’ll try to write and read from the 9103. The simplest way to do that is to send a query and look for a valid status response:
standard_speed = False; timeout = 3 # seconds timeout_start = time.time() try: command_query_status() while time.time() < timeout_start + timeout: msg=port.readline().decode('utf-8').rstrip() if msg == "RBD Instruments: PicoAmmeter": print(msg) standard_speed = True;
command_query_status() call simply sends a ‘&Q’ query message to the 9103.
If this throws an exception, we basically do the same thing again, this time opening the port at the faster 230.4k baud rate, then testing it by writing / reading. If either case is successful, we prompt the user to see if they want to switch to the other speed.
If you know you’re only ever typically going to operate the 9103 in one speed mode, you can simply use this utility once, and normally should not have to use it again unless you swap your 9103 with another that is running at a different speed. Otherwise, you can integrate this into your application. Normally, if you may need a higher sampling rate, there’s no reason not to simply operate in the higher-speed mode – the slower sampling rates are still available and can the messages for those rates can be parsed the same as with the standard speed.
Also, note that, although this code is agnostic about the operating system it’s running on, the exception conditions might be subtly different depending on the OS and FTDI USB serial port driver, and you may need to make some modifications.
Next, we’ll look at how to sample using the high-speed mode, and how to parse messages at the faster rates.