Skip to main content
Skip table of contents

LJM Changelog

About Version Numbers

LJM follows semantic versioning. For a version number like xx.yyzz, LJM follows the following version format:

  • xx is the major version (left of the decimal).

  • yy is the minor version (the two places to the right of the decimal).

  • zz is the revision version (the two places to the right of the minor version).

(For example, LJM 1.2345 means the major version is 1, the minor is 23, and the revision is 45.)

Semantic versioning means:

  • LJM is backwards-compatible as long as the major version does not change.

  • If the minor version changes, a new API feature (a new function, constant, or feature) has been added.

  • If the revision version changes, only bugs have been fixed.

LJM uses the xx.yyzz format so that the LJM version can be stored as a floating point number.

Version History / Changelog


  • Fixed memory leak for MAC ARM computers

  • Fixed slow StreamStop on T8

  • Fixed Stream Out functionality for T8


  • Manually flush usb packets from T8 due to a hardware bug


  • Upgraded internal build system and dependency management

  • Upgraded internal dependency Boost from 1.65.1 to 1.79.0

  • Upgraded internal dependency GRPC from 1.14.2 to 1.33.2

  • Added Apple ARM support

  • Modified stream to allow multiple attempts to receive packets if the transaction ID is wrong.


  • Added T8 support

  • Fixed T7 DAC offset calibration handling

  • Better unknown error handling

  • Improved the interface with libusb on Unix-like operating systems

  • LJME_DIGITAL_AUTO_RECOVERY_ERROR_DETECTED leads to a fail fast scenario

  • Improved memory management for stream mode

  • Fixed INVALID_INDEX error condition caused during StreamBurst

  • Fixed a bug for Command-response stream


  • Added connection type LJM_ctANY_UDP = 11.

  • Fixed compatibility for C compilation on some Linux systems.

  • Added stream out convenience functions: LJM_InitializeAperiodicStreamOut, LJM_WriteAperiodicStreamOut, and LJM_PeriodicStreamOut.




  • Added undocumented / experimental LJM_eStreamReadNoWait function.

  • Added debug logger interpreter.

  • Windows: Improved stream start by decreasing time / improving reliability of packet flushing. Requires LabJackWUSB 1.2 or later.

  • Fixed streaming of digital state registers.

  • Fixed LJME_SYNCHRONIZATION_TIMEOUT error when auto-recovery occurs during stream burst.

  • Fixed possible segmentation fault.

  • Fixed: Check that LJM_eStreamStart's ScansPerRead must be greater than 0.

  • Fixed timing during stream burst for some cases.

  • Fixed: Auto-response now adds the correct number of dummy scans.

  • Fixed: Packet header size is now properly calculated such that 56 bytes maybe be read over USB.

  • Changed behavior: Stream read timeout is now based on the communication send/receive timeout.

  • Enabled hardened runtime on macOS.

  • Improved speed of Command-Response operations during Auto-Response stream.

  • Decreased delay between stream initialization and data collection in some cases.

  • Decreased CPU usage when using LJM_SetStreamCallback.


  • Improved CPU usage during stream.

  • Removed LJME_USING_DEFAULT_CALIBRATION eStreamStart warning when LJM_STREAM_AIN_BINARY is enabled.


  • Added function LJM_GetStreamTCPReceiveBufferStatus.


  • Added LJM_DEMO_MODE functionality.


  • Fix to increment the transaction ID for operations that span multiple packets.

  • Fix to handle stream packets that have been split by the network stack.

  • Fixed stream sleep behavior to prevent possible auto-recovery at high speeds with multiple channels.

  • Fixed stream sleep behavior to be more efficient.

  • Fixed situation where trying to open a UD device could return LJME_DEVICE_CURRENTLY_CLAIMED_BY_ANOTHER_PROCESS or other errors. Now returns LJME_U3_CANNOT_BE_OPENED_BY_LJM, LJME_U6_CANNOT_BE_OPENED_BY_LJM, or LJME_UE9_CANNOT_BE_OPENED_BY_LJM.

  • macOS builds are now 64-bit only with -mmacosx-version-min=10.9. Also removed hidden visibility from LabJackM.h for macOS.

  • Linux: Now hiding all symbols except for those starting with LJM_ and Internal_LJM_ using a version script.


  • Now trimming spaces, tabs, newlines, and single- and double-quotes around lookups for register names and constant names.

  • Linux builds are now compiled with hidden visibility for all internal symbols.



  • Fixing problem where only a single user could use LJM until the next reboot.


  • Fixing LJME_TRANSACTION_ID_ERR when auto response stream transaction id wraps.

  • Now allowing 0 microseconds in LJM_StartInterval.


  • macOS and Linux: fixed possible seg fault during network-based open calls.

  • Improved Deep Search reliability.

  • Improved eStreamStop behavior: now works when the stream had not been started by the current LJM instance.

  • Stream functions can now reconnect.

  • Increased theoretical USB/Ethernet stream speed.

  • macOS: Fixing possible seg fault during program exit.

  • macOS and Linux: Improving consistency of USB communication failure. E.g. LJME_RECONNECT_FAILED happens more consistently (instead of LJME_NO_COMMAND_BYTES_SENT).

  • Improved reliability of signal handling. This alters the error behavior of many functions. (E.g. eStreamRead may return LJME_DEVICE_NOT_OPEN after LJM has received a terminating signal and is shutting down.)

  • Fixing eStreamStart issue if default calibration is already loaded.


  • Set named mutex to unrestricted permissions.


  • macOS: Improved USB stream start and stop speeds.

  • Linux - Altered USB stream startup behavior to either succeed or fail with occasional LJME_TRANSACTION_ID_ERR errors, depending on if Linux is running natively or on a VM:

  • labjack_ljm_software_2018_02_21_*.tar.gz - fails for native Linux, succeeds for Linux VM

  • labjack_ljm_software_2018_02_22_*.tar.gz - succeeds for native Linux, fails for Linux VM

  • Fixed possible segmentation fault or deadlock behavior on process exit.


  • Added Deep Search functionality including LJM_DEEP_SEARCH_FILE configuration.

  • Fixed LJME_ATTR_LOAD_COMM_FAILURE error when ListAll cannot find any devices.

  • Fixed possible segmentation fault.


  • Added functions LJM_GetHostTick, LJM_GetHostTick32Bit, LJM_StartInterval, LJM_WaitForNextInterval, and LJM_CleanInterval.

  • Fixed possible crash during shutdown.

Older Versions


  • Fixing issue when the connection is disrupted during stream out.


  • Fixed LJME_AUTO_IPS_FILE_NOT_FOUND error when no devices are connected.

  • Fixing unintialized pointer dereference for out-only stream.

  • Updated T4 nominal calibration constants.


  • Added LJM_STREAM_PORT configuration.


  • Fixed T4 stream calibration functionality.

  • Added extended ErrorString information for LJM_ErrorToString(LJME_DEVICE_CURRENTLY_CLAIMED_BY_ANOTHER_PROCESS, ...)

  • Fixed possible segfault on LabJackM exit.

  • Improved CPU efficiency during stream.


  • Fixed bug where LJM_eReadAddressArray, LJM_eReadNameArray, LJM_eWriteAddressArray, and LJM_eWriteNameArray return error 1215 when NumValues is greater than 127 and the connection type is TCP or UDP.


  • Added special voltage to T4 calibration.

  • Added auto IP functionality.

  • Fixed streaming bug during multiple stream bursts with different scan rates.

  • WiFi initialization now happens via TCP unless the ConnectionType is UDP.

  • Network device connection and initialization is parallelized.


  • Fixed WiFi streaming, including stream burst.

  • Fixed LJM_StreamBurst so that devices with invalid calibrations may still stream.

  • Fixed situation where LJM fails to retrieve an extended error code from a device.

  • Fixed stream-related multi-thread memory leaks and synchronization issues.

  • Improved lookup speed of Names and other constants.


  • Initial support for T4 LV stream channels.

  • Fixed a memory leak when a device is closed after having streamed.

  • Fixed a problem where devices of the same type had to be opened in a particular order on Mac/Linux.

  • Fixed a repeating LJME_TRANSACTION_ID_ERR that can happen during poor TCP connectivity.

  • Fixed LJME_RECONNECT_FAILED error caused by device attribute load failure during opening.

  • Fixed deadlock that could occur due to a close call during device reconnect.

  • Fixed Windows USB stream timeout for some triggered or externally-clocked streams.

  • Improved subsequent stream startup speed: if stream has been successfully started for a given device handle without returning a LJME_USING_DEFAULT_CALIBRATION warning, the next stream start for that device handle will not need to load the stream calibration.

  • Type B and type C thermocouples: switched from table lookup to polynomials.

  • LJM_StreamReadCallbacks may now call LJM_eStreamStop.

  • LJM_StreamReadCallback will now be called upon stream error.


  • Fixed possible pure virtual error in multi-threaded context when device is reconnected or closed prematurely.

  • Fixed possible socket leak.

  • Changing communication error behavior to return LJME_NO_RESPONSE_BYTES_RECEIVED instead of LJME_INCORRECT_NUM_RESPONSE_BYTES_RECEIVED in some situations.

  • Fixed command-response (WiFi) stream situation when the device has no scan backlog.

  • Fixed crash on Windows when TCP devices are not closed before program termination.

  • Fixed possible LJME_INVALID_LENGTH error during Ethernet stream.

  • Improved accuracy of stream timing.


  • Fixed possible seg fault upon device attribute load failure.

  • Fixed possible memory leak in LJM_StreamBurst.

  • Fixed possible LJME_TRANSACTION_ID_ERR during externally-clocked stream.

  • LJM_NumberToIP: Filling the unused bytes of IPv4String with NULL.

  • Fixed stream calibrations loading when a T7 (non-Pro) has an SD card.

1.1402 - Adding multi-packet functionality to LJM_eReadAddressArray, LJM_eReadNameArray, LJM_eWriteAddressArray, and LJM_eWriteNameArray - communication is broken into multiple packets as needed due to max packet size.


  • Fixed LJM_SetStreamCallback timing.

  • Added T4 stream support.



  • Added LJM_dtT4 and LJM_dtTSERIES.







  • Dropping ppc support for Mac OS X; still supporting i386 and x86_64.

  • Updated to libusb-1.0.19.

  • Added message and quick-start URLs for indicating that the UD devices are not supported.

  • Fixing LJM_StreamBurst thread-safety and memory leak.

  • Fixed memory leak during reconnect.

  • Fixed possible seg fault when device attribute loading fails.

  • Fixed Windows TCP stream handle leak.

  • Fixed bug where reconnect happens later than it should.

  • Fixed error message thread-safety.

1.1301 - Fixing bug when device does not respond after a Modbus Feedback write that has no read component. Fixing OS-independent USB reconnect issue. Fixing Windows USB reconnect issue.

1.1300 - Added functions: LJM_eReadAddressByteArray, LJM_eReadNameByteArray, LJM_eWriteAddressByteArray, and LJM_eWriteNameByteArray. Added secret function Internal_LJM_GetHandles.

1.1201 - B-type thermocouple conversion: increased the range and used new constants.

1.1200 - Changed ListAll to use UDP instead of TCP. Added LJM_GetSpecificIPsInfo. Changed from ljm_special_addresses.config to ljm_specific_ips.config. Added `void` to parameter list for LJM_CloseAll, LJM_LoadConstants, and LJM_ResetLog. Added functionality to broadcast on all available network adapters.


1.1003 - Fixed synchronization bug that causes problems primarily in Kipling.

1.1002 - Fixed WiFi discovery issue.

1.1001 - Fixed TCP open bugs. Removed threading of USB open for faster opening of USB devices when Open connectionType is LJM_ctANY.

1.1000 - Added LJM_RegisterDeviceReconnectCallback. Added LJM_AUTO_RECONNECT_WAIT_MS. Now using a separate device reconnection thread.

1.0900 - Added LJM_StreamBurst. Added Special Address functionality and the corresponding configs LJM_SPECIAL_ADDRESSES_FILE and LJM_SPECIAL_ADDRESSES_STATUS. Fixed device memory management and thread safety issues. Changed LJME_COULD_NOT_CLAIM_DEVICE to LJME_DEVICE_CURRENTLY_CLAIMED_BY_ANOTHER_PROCESS.

1.0808 - Fixed a segmentation fault when stream is running upon program termination.

1.0807 - Fixed a segmentation fault.

1.0806 - Adding LJM_STREAM_AIN_BINARY flag. Fixed possible pure virtual call during reconnect.

1.0805 - Fixed segmentation fault during TCP open on Mac/Linux. Fixed logger issue.

1.0804 - Made some performance gains during stream.

1.0803 - Removed LJM_MAX_TCP_PACKET_NUM_BYTES_NON_T7. Improved stream stop time. Fixed stream seg fault. Fixed stream LJME_TRANSACTION_ID_ERR.

1.0802 - Added Type C thermocouple support.

1.0801 - Changed default WiFi send/receive timeout to 4000 ms. Added check for when API functions with NumFrames / NumValues parameters are 0 or less, in which case LJME_INVALID_PARAMETER is returned.

1.0800 - Client code should be re-compiled. Changed LabJackM.h constant LJM_DEMO_MODE from "-1" to "-2". Introduced new configs:






The following configs are now write-only shortcuts for the new configs:



Removed LabJackM.h constant: LJM_DEFAULT_TIMEOUT. Fixed LJME_TRANSACTION_ID_ERR stream bug.

1.0707 - Added LJME_DEBUG_LOG_FILE_NOT_OPEN. Changed the default log level to LJM_INFO. Fixed LJME_INTENT_NOT_READY error when streaming via WiFi. Fixed stream-out error. Fixed stream sleep calculation. Stream refactors. Constants file update.

1.0706 - Fixed easy functions bug for digits that can cause reading/writing to an incorrect address.

1.0705 - Fixed easy functions bug that caused LJME_PACKET_SIZE_TOO_LARGE.

1.0704 - Device reconnect bug fix.

1.0703 - LJM_eStreamStart: automatically applying stream settling of 10 if firmware is old and stream settling reads as 0. Fixed Ethernet streaming for Windows 8. Added the keyword static to LabJackM.h variable definitions. Fixed error check for string length to LJM_eWriteAddressString / LJM_eWriteNameString. Fixed burst stream bug. Fixed WiFi stream bug. Fixed heap memory issue. Stream callback improvement. Updated constants file.

1.0702 - Added configuration parameter LJM_STREAM_CONVERT_AIN14 to control whether AIN14 is converted to units Kelvin or not - default is to not do so. Modified error message for unknown constants. Fix for deadlock when eStreamStop was not called.

1.0701 - Removed LJM_dtUE9, LJM_dtU3, LJM_dtU6, and LJM_dtSKYMOTE_BRIDGE from LabJackM.h. Removed erroneous setting of stream resolution and settling time during LJM_eStreamStart. Accepting additional values for DeviceType and ConnectionType for the Open and ListAll functions, such as "ETH" for LJM_ctETHERNET. Added retry to calibration constants loading during stream start. Updated constants file.

1.0700 - New function: LJM_SetStreamCallback. Added support for alternate stream resolution and settling. Added basic support for WiFi streaming.

1.0601 -  Fixed stream for range/gain of 0.1V. Fixed error when streaming STREAM_DATA_CAPTURE_16.

1.0600 -  Changed the config parameter LJM_HEAL_CONNECTION_MODE to LJM_AUTO_RECONNECT_STICKY_SERIAL and LJM_AUTO_RECONNECT_STICKY_CONNECTION. Beta Wifi stream support added.

1.0501 -  Fix for IP-specified automatic connection healing. Speedup for device opening on Mac.

1.0500 -  New config: LJM_ZERO_LENGTH_ARRAY_MODE

1.0401 - Automatic connection heal fixes.

1.0400 - New function: LJM_ListAllExtended. New config parameters: LJM_HEAL_CONNECTION_MODE, LJM_STREAM_SCANS_RETURN, LJM_STREAM_RECIEVE_TIMEOUT_MODE, and LJM_STREAM_RECEIVE_TIMEOUT_MS. By default, LJM uses LJM_HEAL_CONNECTION_MODE_BY_OPEN_PARAMETERS. Added constant: LJM_BYTES_PER_REGISTER. Constants file (ljm_constants.json) update.

1.0300 - New functions: LJM_LookupConstantValue and LJM_LookupConstantName. Improved version of LJM_ListAll / LJM_ListAllS, which uses multiple attempts to find devices via TCP and uses UDP to gain device information. Constants file (ljm_constants.json) update.

1.0201 - Stream timing fix. Constants file (ljm_constants.json) update.

1.0200- New functions: LJM_eReadAddressArray, LJM_eReadNameArray, LJM_eWriteAddressArray, and LJM_eWriteNameArray. O Stream support. Stream thread timing modification. LJM_BYTES array fix. Auto-closing devices upon exit. Debug logger thread default sleep is now 50 ms. Debug logger thread temporarily stops running if no log messages are received for (100 ms + 2 * logger sleep time).

1.0103 - Fix for stream auto-recovery. Fix for stream digital channel. Fix for bug when TCP open times out on Mac OS X and Linux. Constants file update.

1.0102 - Fixed LJM_LoadConstantsFromString deadlock. Fixed LJM_ReadLibraryConfigS deadlock. Added LJM_DEFAULT_UNIT_ID to LabJackM.h. Not flushing Windows USB on open. Support for streaming digital channels. Debug logger improvements.

1.0101 - Mac/Linux USB streaming fixes. LJM_Open and LJM_OpenS Identifier defaults to decimal IP rather than hex IP. Fixed deadlock situation. Config file interpretation improvements. Now flushing before opening USB devices.

1.0100 - Added the functions LJM_LoadConstantsFromFile and LJM_LoadConstantsFromString. Fix for streaming 14 or more channels. Nix USB streaming fixes.

1.0000 - Broken backwards compatibility - Constants renames:









Added LJM_LoadConfigurationFile and config file loading on LJM startup. Stream improvements. Debug logging improvements. Constants file update.

0.0246 - Bug fixes. LJME_USING_DEFAULT_CALIBRATION will return the root
         error in LJM_ErrorToString.
0.0245 - Fixed bug where LJM would not return an error when an error occurred.
         Added calibration constants verification during streaming. Added
         stream verifications.
0.0244 - Broken backwards compatibility - LJM_eWriteString is now
         LJM_eWriteNameString, LJM_eReadString is now LJM_eReadNameString.
         Added LJM_eWriteAddressString and LJM_eReadAddressString.
         Streaming speedups and fixes, including allowing an arbitrary
         number of samples in LJM_eStreamStart/LJM_eStreamRead. Added
         LJM_STREAM_TRANSFERS_PER_SECOND config parameter. Now loading max
         packet size from T7s and device name for Digits. Fixed device open
         bug. Open calls now return LJME_OVERSPECIFIED_PORT when connection
         type is "any" and port is specified. Fixed altername name address
         bug. Added LJM_RETRY_ON_TRANSACTION_ID_MISMATCH configuration.
         Added check against the constants file for old firmware (see
         LJM_OLD_FIRMWARE_CHECK). Added Modbus operation re-try when the device
         returns an unexpected Transaction ID (see
0.0243 - LJM_eStreamRead breaks backwards compatibility - the NumSkippedScans
         parameter has been removed. LJM_eStreamStart breaks backwards
         compatibility - the aScanList_Neg parameter has been removed.
         Removed unused errorcodes from this header file. Streaming
         improvements. Worst-case device open times have been improved.
0.0242 - LJM_Open() breaks backwards compatibility - the DeviceType and
         ConnectionType parameters are now pass-by-value rather than
         pointers. Removed LJME_MUST_SPECIFY_DT_AND_CT. Streaming revisions.
0.0241 - Fixed constant file/log file location resolution for Windows.
0.0240 - Removed dllexport for Windows.
0.0239 - OpenS/ListAllS now make the LJM_dt/LJM_ct/LJM_id prefixes optional.
         __stdcall functions for Windows.
0.0238 - More const parameters. Outputs invalid address with
         relevant. Automatically reloads constants file more often. Improved
0.0237 - Bug fix for Open
0.0236 - Limited AutoResponse streaming support.
0.0235 - LJME_INVALID_NAME will give the last unrecognized names.
0.0234 - Default send/receive timeout is now 20 seconds. Fixed
         synchronization issues. Command-Response stream improvements.
0.0233 - LJM_ListAll/LJM_ListAllS now have new prototypes and can accept any
         device or connection type.
0.0231 - Added LJM_AddressToType/LJM_AddressesToTypes
0.0229 - Limited streaming support
0.0225 - Fixed endianness issue with ListAll.
0.0224 - Added LJM_ALLOWS_AUTO_CONDENSE_ADDRESSES configuration.
0.0223 - Fixed packet bugs, handle bugs, and updated error names.
0.0222 - Fixed many opening bugs, added WiFi device discovery
0.0217 - Added LJM_eReadString and LJM_eWriteString
0.0215 - Added the MAC address and IPv4 address converter functions
0.0214 - Added LJM_ReadLibraryConfigS and LJM_WriteLibraryConfigS,
         removed LJM_GetDriverVersion.
0.0212 - Added basic logging functionality.
0.0211 - Added LJM_STRING functionality.
0.0209 - JSON Modbus constants file.
0.0207 - Implementation LJM_ListAll.
0.0206 - Open functions now return any handle matching an already open device
         if possible.
         Implementation of the easy functions.
0.0205 - New LJM_ErrorToString style.
0.0202 - Added the array-capable easy functions.

Known Issues

Issue: LJM_SetStreamCallback is not reliable when there is the possibility of a STREAM_SCAN_OVERLAP (2942) error.

Issue: Mac OS X 10.11 (Mavericks) - USB communication is broken. This issue is fixed in the 10.11.4 beta. For more information please look at this libusb GitHub issue.

Issue: Mac OS X streaming via USB connection - Deadlock and device unresponsiveness may occur when no signals arrive after LJM_eStreamStop during externally clocked stream where there is more than one packet per iteration.

Issue: Windows - Stream may give LJME_TRANSACTION_ID_ERR if the stream read timeout is less than 2500. The stream read timeout may be manually set by writing LJM_STREAM_RECEIVE_TIMEOUT_MS.

Issue: Under some conditions, LJM may produce stdout output like the following:

E0330 15:50:47.342000000 17436 server_chttp2.c:53] {"created":"@1585605047.342000000","description":"Only 1 addresses added out of total 2 resolved","file":"..\src\core\ext\transport\chttp2\server\chttp2_server.c","file_line":268,"referenced_errors":[{"created":"@1585605047.342000000","description":"Failed to add port to server","file":"..\src\core\lib\iomgr\tcp_server_windows.c","file_line":525,"referenced_errors":[{"created":"@1585605047.342000000","description":"OS Error","file":"..\src\core\lib\iomgr\tcp_server_windows.c","file_line":214,"os_error":"An attempt was made to access a socket in a way forbidden by its access permissions.\r\n","syscall":"bind","wsa_error":10013}]}]}

A workaround is to disable gRPC.


Found a bug? Please report it to!

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.