Skip to main content

serial port programming tutorial using win32 api and FT232 usb to serial converter
 

This tutorial teaches you to program your Windows PC to communicate with an external peripheral like data acquisition boards, USB GPIO Boards,Relay boards etc through its serial port (Virtual or Real).

Here i am assuming that you are using a Virtual COM port  based any of the numerous IC's available on the market.

The tutorial is aimed at Software/Embedded developers who may want to interface real world sensors like DAQ's,USB Relays,USB GPIO boards ,Temperature sensors,Humidity sensors etc to Windows PC .

The software is written using C language and communicates with the Serial Port using Win32 API.

All codes have been tested on a 64bit Windows 10 System.

All the codes in this tutorial are licensed under MIT License making it eligible to be used for developing proprietary software applications.

 

Join Our Youtube Channel for more Info


 

Contents

Sourcecodes
Compilers and IDE's used
Finding out your COM port Number
Windows10 Accounts 
Opening and Closing a Serial Port
Configuring the DCB Structure
Setting Timeouts
Writing Data to Serial Port
Microcontroller Interfacing with PC 
Reading from the Serial Port
 

Isolated USB to Serial Converters

One major issue with interfacing real word devices with your PC's is that High voltage spurious transients can couple on to your USB or RS232 or RS485 lines.These high voltage transients can cause severe damage to your computer or its ports.

It is highly recommended to use an

Isolated USB port or
Isolated USB to Serial/RS232/RS485 converter
to protect your PC .

 

Sourcecodes
link to xanthium enterprises repo containing Serial Programming Code using Win32 API on Github

Please note that the source codes on the website show only the relevant sections to highlight the process of programming the serial port.
Contact Us to Enquire about the full Source codes
 

Compilers and IDE's used

Since we are developing on Windows platform,

Recommended IDE is Visual Studio (Professional or Community Edition).
 

In Visual Studio,there is no longer an option for creating a C project.

So create a Win32 C++ project and save your source file with a .C extension (Eg: MySourceFile.C).Compiler would automatically do the rest.

 

GCC/MinGW

You can also compile the code using GCC  or MinGW  after a few tweaks.

The Code uses some Microsoft specific safe C functions like

strcat_s() and 
scanf_s() 
which are used to get the COM number from the user and create the COM port address string (Eg "\\.\COM9" ).The code will compile on GCC after removing those functions.

Make sure that variables referenced by those functions are also changed.

 

Finding out your COM port Number

A little bit of History,

Serial ports are simple 9 pin legacy ports used by the PC to communicate with external peripherals like Printers,Data Acquisition Sytems,Printers etc.

The simple protocol and the 3 pin hardware physical lines (RX,TX,GND) made it quite popular among manufacturers who wanted an easy way to connect their devices with a computer.

In the 2020's, the old DB9 Serial port is found only on industrial motherboards and old PC's.The once ubiquitous serial port have been completely replaced by the familiar USB standard.

The arrival of cheap USB to UART chips like FTD FT232RL,TUSB3410,CP2102 have made it quite easy to upgrade the existing software that used to talk over serial to USB protocol.These chips provide a virtual serial port that behaves like a real one but transmits the data through USB.

If your PC does not have any hardware serial ports (RS232 DB9 ports), you can use USB to Serial Converter's like USB2SERIAL.(non Isolated).

In Windows ,

Serial ports are named as COM1,COM2 ,COM3.. etc .COM1 and COM2 usually refer to the hardware serial ports present in the PC (quite rare now)

while COM numbers in double digits like COM32,COM54,COM24.. etc are given to USB to Serial Converters or PCI serial port extenders.

 

To find out the COM number corresponding to your serial port,

Open Device Manager by right clicking on My Computer icon and selecting Manage → Device Manager.or
by typing "Device Manager" on the taskbar search box in Windows 10
Under Ports(COM & LPT) you can see the parallel and serial ports (COM) detected by your system.

 

Finding out your COM port number under windows

If your PC has any hardware ports, it will be shown either as COM1 or COM2 under the Ports Section.

I am using a FTDI based USB to Serial Converter (USB2SERIAL)which is recognized as COM24 (this may be different under your system).

If you double click on COM24,you can see the details of the corresponding port.

USB serial port properties dialog on windows

 

Windows10 Accounts

The codes/executables are able to open the connection to the serial port under both Administrator Account and Standard User Account in Windows 10.

 

Opening and Closing a Serial Port

 

we use the CreateFileA() function to open a serial port.

 

CreateFile() is a Win 32 function which is used to create or open a file, stream or an IO device like serial port.

On success CreateFileA() will return a handle which is then used to refer the connection in all subsequent operations.

After opening a serial port using the CreateFileA() function you should close it with CloseHandle() function, otherwise port will become unavailable to other programs.

Now let's write a small program to open and close a serial port on Windows.

Open a text editor like notepad  and type the below code and save it as “serial.c”.If you are using IDE like VS Express, use the one integrated with it.

#include<windows.h>
#include<stdio.h>
int main()
{
 HANDLE hComm;

 hComm = CreateFileA(“\\\\.\\COM24”,                //port name
                     GENERIC_READ | GENERIC_WRITE, //Read/Write
                     0,                            // No Sharing
                     NULL,                         // No Security
                     OPEN_EXISTING,// Open existing port only
                     0,            // Non Overlapped I/O
                     NULL);        // Null for Comm Devices

 if (hComm == INVALID_HANDLE_VALUE)
     printf(“Error in opening serial port”);
 else
     printf(“opening serial port successful”);

 CloseHandle(hComm);//Closing the Serial Port

 return 0;
}

 

Configuring the DCB Structure
In Windows ,settings like Baud rate ,Number of start/Stop bits,data formats etc for the serial port are controlled by the DCB structure.

To Configure the DCB structure we use two functions,
GetCommState() function which retrieves the current control settings of the serial port and
SetCommState() function which configures the serial port with the new values in DCB structure provided by us.

 

ReadIntervalTimeout Specifies the maximum time interval between arrival of two bytes. If the arrival time exceeds these limits the ReadFile() function returns.

ReadTotalTimeoutConstant is used to calculate the total time-out period for read operations. For each read operation, this value is added to the product of the ReadTotalTimeoutMultiplier member and the requested number of bytes.

ReadTotalTimeoutMultiplier is used to calculate the total time-out period for read operations. For each read operation, this value is multiplied by the requested number of bytes to be read.

WriteTotalTimeoutConstant similar to ReadTotalTimeoutConstant but for write operation.

WriteTotalTimeoutMultiplier similar to ReadTotalTimeoutMultiplier but for write operation.

After this you have to set the values using SetCommTimeouts() function.

 

Writing Data to Serial Port
Writing data to the opened serial port is accomplished by the WriteFile() function. WriteFile() function can be used to write both into the files and I/O ports.

Status = WriteFile(hComm,        // Handle to the Serial port
                  lpBuffer,     // Data to be written to the port
                  dNoOFBytestoWrite,  //No of bytes to write
                  &dNoOfBytesWritten, //Bytes written
                  NULL);

 

If your PC does not have any hardware serial ports you can use any USB to Serial Converters(I am using USB2SERIAL).

 

Microcontroller Interface

I have interfaced a microcontroller MSP430G2553/ATmega328P to the serial port like this

Null modem serial connection between microcontroller(MSP430) and PC serial port using USB2SERIAL

You can use any microcontroller of your choice like 8051,AVR or ARM(LPC2148).

The Controller waits for a character to be received and lights up the corresponding LED.

The code for interfacing MSP430  is available in the Github repo.

.If you want to know how to configure the MSP430 controller UART you can check this tutorial.

MSP430 connected to USB to Serial Converter

We have also included code for

interfacing your PC with ATmega328P microcontroller using Serial port
in the Repo too. The connection setup is similar to the MSP430.

 

Please note that if you are using a DB9 RS232 Serial Port of your PC, you will have to build a RS232 signal level converter at the microcontroller side to decode the RS232 signal.
Directly connecting the PC's RS232 Serial port to MSP430 's pins will damage the chip.
 

Here is the screen shot of the Program writing into serial port of Windows 7 Computer

Please note that i have changed the names of the C files in the latest release.

Use the files in the "PC_Transmits" folder.

compiling and running the serial port write program on windows 7

 

Here is the screen shot of the Program writing into serial port of Windows 10Computer

serial port programming tutorial on Windows 10 Windows 7 using Win32/64 API

Reading from the Serial Port
Reading from the serial port is accomplished by the ReadFile() function.

One way to do that is to use polling where the ReadFile() continuously reads from the serial port and checks for any received characters.
Other way is to setup an event and let windows notify us when a character is received.

We are going to use the second method here, following are the steps.

1. Create an Event for a particular action like character reception, change in modem lines etc using SetCommMask() function .
2. Ask windows to wait for the event set by SetCommMask() function using WaitCommEvent() and notify us when the condition happens.
3. Call ReadFile () to read the received data from the Serial port.

Functions used are

SetCommMask() is used to set the events to be monitored for a communication device

WaitCommEvent() is used to wait for the events set by SetCommMask() to happen, i

Codes running on Windows 7 PC.

Please note that i have changed the names of the C files in the latest release.

Use the files in the "PC_Receives" folder.

 

Waiting  for data reception

Reset the Micro controller to transmit the string “Hello from MSP430”.

Data received by the PC serial port

 

Codes running on Windows 10 PC.

 

Serial port driver communication and programming tutorial using win32 API on Windows 10 windows 7  

 

Check out our next section,

If you want to know how to control the RTS and DTR pins of the serial port .