Arduino to PC messaging – AutoConnect, Bluetooth, Visual Basic and more



Biggest news first: The CmdMessenger development was joined by Valeriy Kucherenko. He has really improved development speed of the library and many of the changes and additions in this version CmdMessenger came from him.

Downloading and installation

The package can still be downloaded as a zipped package, but I’ve also made it available through the Arduino and PlatformIO package management system, which will make it easier to get up and running. Although, honestly, my feeling is that neither solution is ideal yet:


  • Supports dependency management
  • Rich package format (such as inclusion & exclusion of  files).Con


  • Not for Arduino beginners: There is no GUI,  installation involves getting a Python installation , setting up the environment, etc.
  • Package versions are not taken into account in dependency  management, which is really important to make sure that packages don’t break

Arduino Library Management

  • Integrated in Arduino UI, very easy for the end user
  • Rich package format (such as inclusion & exclusion of  files).Con


  • No dependency management. At all.  I think this is a really bad idea. Without dependency management it is impossible to build upon existing libraries.
  • Package submission is a fully manual process, and there is no way to check if the library package is composed correctly.

The different ways of how to install the library can be found here

Code improvements

Probably the least exciting improvement, but also one of the most important is the extend to which CmdMessenger has been refactored. We have made huge improvements on the .NET CmdMessenger library. The previous version of the .NET library relied on polling for new data to be available, which resulted in a trade-off between system load and responsiveness, that was never really satisfying. This update uses inter-thread signalling which is faster,  less resource hungry and is much more elegant. A range of other  improvements where made as well: improved thread safety, separation of concerns and more.  Fun fact: The code has been running 24/7 on a test system without issues. In fact,  this system was a Linux + Mono setup. This brings us to the next point:

Linux compatibility

While we stated in the previous releases that the .NET library was MONO compatible and therefore *SHOULD* run on Linux, this  had not been tested. Now Valeriy did! One thing to note is that under Mono on Linux GetPortNames() will never show Arduino ports, so we added our own implementation.

Visual Basic samples

It was always possible to use the CmdMessenger library in Visual Basic. However, being no Visual Basic user myself (and, honestly, not a very big fan of the language), I’ve never  added examples.  However, I have been asked a lot of question on how to use CmdMessenger in Visual Basic, so on a rainy evening I decided to bite the bullet and translate all examples to Visual Basic. So, after combining the result of 2 automatic C#-to-VB  translators, following ReSharper suggestions and some of manual refactoring,  we now have VB versions of all samples:


AutoConnect & Watchdog

The Library now comes with an connection manager that you could use: It will scan all serial ports present (in the case of a serial connection), and try them at different speeds. If a serial port responds with the correct answer, the connection is confirmed.

Once the connection is confirmed, a watchdog can be started to monitor the connection. If the connection is silent for too long, the watchdog will ask the connected device for a sign of life. If no response comes, the connection manager will eventually take over and start scanning again. All This makes it very easy to set up and maintain connections.


We have added a transport layer for Bluetooth, and tested expensively with the commonly used HC-05 and HC-06 breakout boards. The already existing serial interface will also work with these boards: if you set them up correctly (bind, enable virtual serial port), you can use the serial port to communicate.

We have gone a step further, though. By using the underlying RFCOM layer, the Bluetooth layer will not need an virtual serial connection and will immediately run on the correct speed, without overhead. Also, it allows for much nicer auto-connect behavior:  Your Bluetooth device needs only be in range. The auto-connect code with search for both paired and unpaired devices. If unpaired, it will try the most commonly PIN codes to pair, and subsequently to connect.

The only thing you would have to do is connect your Arduino correctly to the HC-05/06 device, and make sure that the serial speed set in your script is the same as the speed set in your Bluetooth device (by default 9600, but this can be changed through the AT commands).

Arduino HC 05 connection Arduino to PC messaging    AutoConnect, Bluetooth, Visual Basic and more image

Arduino HC-05 connection

If you want, you can do more: have a look at this instructables manual and this very helpful guide . If you want to go in depth, have a look at the full AT command set here

Bluetooth Auto connect is very similar to the serial connection auto-connect functionality:

New and updated samples

This version comes with some new & improved samples:

This example shows how to automatically find the correct serial-port and -speed, and monitor is the connection remains up.

This example shows all about discovering Bluetooth devices, pairing and connecting to them, as well as the watchdog functionality. Unfortunately this sample does not work with Bluetooth 4.0 (BLE) or under Linux.

Temperature control
The most extensive sample that came with the library was only usable for a limited number of users: only users with a relay switched heater, a thermocouple and a heatable basin where able to use it. We now added a simulated heater, which behaves as a real basin including heater and temperature measuring device. This is very nice  if you like to play around with a remote controllable, PID regulated, heating solution without the hardware.

Leave a Reply

Required fields are marked *.