Serial Port Monitor, Sniffer, Logger (Windows)

Serial Port Sniffer, Logger and Monitor

SerialTool's Kernel driver aslo known as SpyPort is a sophisticated feature that elevates its utility for anyone needing to sniff, log, and monitor serial port activity managed by other software applications. This driver operates at a low system level, providing unparalleled access to the data streams flowing through your serial ports, independent of the applications using those ports.

Detailed Description of SerialTool's Kernel Driver

The Kernel driver integrated into SerialTool functions as an intermediary layer between the hardware serial ports and the software applications communicating through these ports. This driver captures all the data packets transmitted and received by the serial ports, allowing users to monitor this activity in real-time.

Real-Time Data Sniffing

One of the primary capabilities of the Kernel driver is real-time data sniffing. It intercepts the data flowing through the serial ports without interrupting or modifying the communication process. This means that as another software application sends or receives data via the serial port, SerialTool can capture these packets instantly. This is incredibly useful for debugging and troubleshooting, as it allows you to see exactly what data is being transmitted and received, including any control signals and communication protocols being used.

Comprehensive Logging

In addition to real-time monitoring, the Kernel driver provides comprehensive logging capabilities. It records every piece of data that passes through the serial ports into detailed logs. These logs can include timestamps, data payloads, and status messages, providing a complete history of serial communication. This logging functionality is invaluable for diagnosing intermittent issues, analyzing communication patterns, and keeping a detailed record for later review.

Seamless Integration

The Kernel driver integrates seamlessly with SerialTool's user interface, making it easy to access and interpret the captured data. Users can visualize the data streams in a user-friendly format, with options to filter and sort the data based on various parameters. This integration ensures that even users with minimal technical expertise can effectively use the sniffing and logging features to gain insights into their serial communications.

Application Independence

One of the standout features of the Kernel driver is its ability to monitor serial port activity independent of the applications using those ports. This means that regardless of which software is accessing the serial port, SerialTool can still capture and display the data. This capability is crucial in scenarios where you need to monitor third-party applications or proprietary systems without interfering with their operation.

A few more words about this feature…

SerialTool’s Kernel driver for Windows is a standout feature that takes your serial port monitoring to the next level. Developing a Kernel driver is no small feat—it requires advanced technical skills and a deep understanding of how Windows operates at a core level. This kind of functionality isn’t something you find in many other serial communication tools. For example, popular tools like CoolTerm and RealTerm don’t offer this level of advanced monitoring.

What makes SerialTool’s Kernel driver so special is that it can sniff, log, and monitor all serial port activities performed by other software. Imagine being able to see every piece of data that passes through your serial ports, no matter which application is using them. This is exactly what SerialTool allows you to do, providing real-time data capture that’s incredibly detailed.

A crucial aspect of Kernel drivers is security. For a Kernel driver to be trusted and used by Windows, it has to be digitally signed by a recognized authority. This signing process confirms that the driver is safe and hasn’t been tampered with. SerialTool’s Kernel driver is fully signed, meaning you can install and run it without having to disable any of your PC’s security features.

The signed Kernel driver ensures you can maintain all your security measures while still benefiting from advanced serial port monitoring. This makes installation straightforward and keeps your system secure. You can monitor data transmissions, capture comprehensive logs, and do all this without any hassle.

Imagine you’re debugging an application or testing a new device. With SerialTool, you can see exactly what’s happening with your serial communications. The Kernel driver captures all data exchanges, presenting them clearly within the SerialTool interface. This helps you quickly identify and fix issues, ensuring everything runs smoothly.

In contrast, if you were using RealTerm or CoolTerm, you’d miss out on these advanced monitoring capabilities. You wouldn’t have the same level of insight into your serial port activities!

This feature truly sets SerialTool apart, offering capabilities that other popular tools simply don’t have.

The only other tool that I can recommend is Advanced Serial Port Monitor even if it is a bit outdated and more expensive and does not provide other special features that SerialTool does.

This function is only availabe for Windows users.

SpyPort Function

SerialTool SpyPort Serial Port Sniffer Logger

 

This screenshot shows the interface just before activating the spying function on the chosen serial port. The screen gives a clear view of the available settings and options, helping you prepare for detailed monitoring.

At the top, I can see options to scan for available serial ports, which helps me identify which ports are ready for monitoring. Currently, the dropdown menu shows ports like COM1 and \Device\Serial1, making it easy to select the one I need. The interface indicates that the target port status is not active yet, which is expected since I haven't started the monitoring process.

There's a green light signaling that the tool is ready to start once I activate it. The baud rate and COM settings are shown as N/A, which will update automatically once the port is active and the spying function is running.

On the right side, the monitor status also shows a green indicator, reassuring me that SpyPort is ready to capture data as soon as I hit the start button. Signal status indicators for lines like CD, DTR, DSR, RTS, CTS, and RI are present, but they're currently inactive, awaiting the start of monitoring.

The central part of the screen is set up to display various types of data once the monitoring begins. There's a section for session packet lists where I’ll be able to see the ID, time, function, data, and length of each packet. The HEX write and read dumps will provide a detailed view of the data being transmitted and received in hexadecimal format, making it easier to analyze communication patterns.

Additional sections for function dumps and R/W dumps are ready to display information once the spying is activated. Options to copy data to the clipboard and clear the displays are conveniently located, which will be useful for managing the captured information.

Finally, a log section at the bottom of the interface will track all activities and events, helping me keep a record of everything that happens during the monitoring session. This setup makes me feel prepared and confident to start spying on the desired port and analyze the serial communication in detail.

 

Driver Installation

SerialTool SpyPort Drivers

 

This screenshot shows the “SpyPort Driver Manager” window in SerialTool, a crucial component for managing the Kernel driver that enables advanced serial port monitoring. The driver is already installed automatically by SerialTool, ensuring that users can start sniffing and logging serial data right away. This interface helps users confirm that the driver is functioning correctly and allows them to update it if necessary.

At the top, you see buttons for finding, removing, installing, and checking the status of the driver. These options provide flexibility in managing the driver, but for most users, the key functionality is to verify the current status and ensure that the driver is up-to-date.

The lower section of the window displays a log, showing that the driver started without any problems. It provides detailed information, such as the driver instances, description, version, and installation date. For example, the log entries show:

  • Driver Status: “Driver started with no problem.”
  • Driver Instances: Indicating that one instance of the driver is running.
  • Driver Description: Identifying it as the “SerialTool System Driver.”
  • Driver Version: Listed as “17.8.50.461.”
  • Driver Date: Installed on “03/12/2024.”

This log helps users verify that everything is working smoothly. If any issues arise or if users suspect they might be using an outdated driver, they can use the options provided to reinstall or update the driver. The “Find Driver” button can help locate the current driver, while “Remove Driver” and “Install Driver” allow users to refresh the installation.

The “Driver Status” button gives a quick overview of the driver’s current state, confirming that it is active and working as expected. If there is a need to clear the log for a fresh start or to declutter the display, users can use the “Clear” button.

 

Port Signals to Sniff, Log and Monitor

SerialTool SpyPort IOCTL IRP Signals

 

First of all, there are plenty of signals that are generated when you use the serial port in Windows. Sometimes it might not be necessary to log all of them to avoid confusion and to make your log more readable. However, SerialTool allows you to decide which signals to track. On the first run, you will find almost all signals flagged for monitoring. You can access and modify these settings by choosing the specific signal from the “Configuration” tab menu under the “Filter Signals” tab.

This screenshot shows the advanced settings in SerialTool’s SpyPort interface, where you can configure which Windows Kernel functions to monitor. This feature allows you to sniff and log detailed serial port activities. Before diving into each function, it's useful to know that these settings give you granular control over what types of data and signals you want to capture.

Simple Description of Each Windows Kernel Function

  • IRP_MJ_CREATE: This function monitors the creation of a new serial port connection. It’s triggered when a handle to a serial port is opened.
  • IRP_MJ_CLOSE: This function logs when a serial port connection is closed, tracking when the handle to the serial port is closed.
  • IRP_MJ_CLEANUP: This function captures cleanup operations on the serial port, ensuring that all pending I/O operations are completed.
  • IRP_MJ_READ: This monitors read operations, capturing data being read from the serial port.
  • IRP_MJ_WRITE: This function logs write operations, capturing data being sent to the serial port.
  • IRP_MJ_FLUSH_BUFFERS: This tracks buffer flush operations, which clear the serial port’s data buffers.
  • IRP_MJ_QUERY_INFORMATION: This captures queries for information about the serial port’s configuration and state.
  • IRP_MJ_SET_INFORMATION: This monitors when settings or configurations on the serial port are changed.
  • IRP_MJ_SYSTEM_CONTROL: This function logs system control operations related to the serial port, such as device-specific control requests.
  • IOCTL_SERIAL_GET_BAUD_RATE: This captures requests to get the current baud rate of the serial port.
  • IOCTL_SERIAL_SET_BAUD_RATE: This monitors when the baud rate of the serial port is set or changed.
  • IOCTL_SERIAL_GET_HANDFLOW: This logs requests to get the handshaking and flow control settings.
  • IOCTL_SERIAL_SET_HANDFLOW: This tracks changes to the handshaking and flow control settings.
  • IOCTL_SERIAL_GET_LINE_CONTROL: This captures requests to get the current line control settings.
  • IOCTL_SERIAL_SET_LINE_CONTROL: This monitors changes to the line control settings.
  • IOCTL_SERIAL_GET_TIMEOUTS: This logs requests to get the timeout settings for read/write operations.
  • IOCTL_SERIAL_SET_TIMEOUTS: This captures when the timeout settings are changed.
  • IOCTL_SERIAL_GET_CHARS: This function logs requests to get special characters for event control.
  • IOCTL_SERIAL_SET_CHARS: This tracks changes to the special characters for event control.
  • IOCTL_SERIAL_CONFIG_SIZE: This monitors requests to get the configuration size of the serial port driver.
  • IOCTL_SERIAL_GET_WAIT_MASK: This captures requests to get the wait mask, which specifies a set of events to wait for.
  • IOCTL_SERIAL_SET_WAIT_MASK: This monitors changes to the wait mask settings.
  • IOCTL_SERIAL_WAIT_ON_MASK: This logs when the system waits for the specified events in the wait mask.
  • IOCTL_SERIAL_SET_QUEUE_SIZE: This tracks changes to the input and output buffer sizes.
  • IOCTL_SERIAL_PURGE: This captures operations that clear various serial port buffers.
  • IOCTL_SERIAL_GET_COMMSTATUS: This logs requests to get the current status of the communication.
  • IOCTL_SERIAL_CLEAR_STATS: This monitors requests to clear the communication statistics.
  • IOCTL_SERIAL_GET_MODEM_CONTROL: This captures requests to get the modem control register.
  • IOCTL_SERIAL_SET_MODEM_CONTROL: This tracks changes to the modem control register.
  • IOCTL_SERIAL_SET_DTR: This logs operations that set the Data Terminal Ready (DTR) signal.
  • IOCTL_SERIAL_CLR_DTR: This captures operations that clear the DTR signal.
  • IOCTL_SERIAL_SET_RTS: This monitors when the Request to Send (RTS) signal is set.
  • IOCTL_SERIAL_CLR_RTS: This logs when the RTS signal is cleared.
  • IOCTL_SERIAL_SET_XOFF: This tracks when the XOFF character is sent to pause transmission.
  • IOCTL_SERIAL_SET_XON: This captures when the XON character is sent to resume transmission.
  • IOCTL_SERIAL_SET_BREAK_ON: This logs when a break condition is initiated on the serial port.
  • IOCTL_SERIAL_SET_BREAK_OFF: This monitors when the break condition is cleared.

For more detailed information about each of these functions, you can refer to the Microsoft Windows Driver documentation.

In the interface, you can check or uncheck these functions based on what you need to monitor. Options to reset to default settings, unflag all signals, or flag all signals help manage these settings quickly. After configuring, you can save the configuration to ensure your preferences are applied during monitoring. This setup makes it easy to tailor the monitoring to specific needs, ensuring you capture all relevant serial port activities.

Start Sniffing, Logging and Monitoring a Serial Port

We're almost there! At this point, we're ready to sniff, log, and monitor our COM port with SerialTool. We've verified that the drivers are installed and that the signals we're interested in are selected.

First, before pressing the start button, we need to ensure that the port we intend to monitor is not already open by another application. If it is, we need to close it before activating the logging.

In our example, we will analyze the Write Multiple Registers command, which is included in our description of the ModBus function supported by SerialTool, and we will verify what happens when we send that command. I chose this example for simplicity because, as explained on the ModBus page, SerialTool opens and closes the COM port each time a ModBus message needs to be sent, making it a very comprehensive example.

Of course, you can analyze any communication generated by third-party software and see what really happens at a low level.

Let's press the “START” button followed by send the Write Multiple Registers 0x10 command from the ModBus window.

SerialTool SpyPort Serial Port Sniffer Main Page

 

Here comes the magic!

This screenshot shows the SerialTool SpyPort interface actively monitoring and logging serial port traffic. We've initiated the sniffing process and sent a ModBus Write Multiple Registers command, allowing us to observe detailed serial communication activities.

The interface is now populated with a variety of data, providing a comprehensive view of the serial port operations. The session packets list in the center details each interaction, including timestamps, function types, and the data length. You can see several operations like reading and setting timeouts, baud rate changes, line control adjustments, and other ModBus-related activities. This list provides a sequential record of all monitored events, making it easy to trace and analyze the communication flow.

On the right, the HEX Write Dump and HEX Read Dump sections display the hexadecimal representation of the data being written to and read from the serial port. This detailed view helps in understanding the exact data being transmitted and received, crucial for debugging and validating ModBus commands. For instance, the command we sent is visible in these dumps, showing how the Write Multiple Registers command is structured at the byte level.

The Functions Dump section offers a summary of the functions being called, including specifics like handflow settings and control signals. This section is especially useful for seeing how the system handles flow control and other configuration details.

At the bottom, the log section records the real-time status of the monitoring session. It confirms that the monitoring was activated and provides timestamps for when the spying started. This log helps keep track of the session’s progress and any notable events that occur during monitoring.

Overall, this setup allows for a detailed examination of serial port activities. By capturing all these aspects, SerialTool’s SpyPort function ensures that you can thoroughly analyze the behavior of your serial communications.

SerialTool SpyPort Logging IOCTL IRP Signals

 

This screenshot displays the “Session Packets List” from SerialTool’s SpyPort interface, logging the monitored serial port activities. Below is a clear listing of the captured signals, including the time, function, data, and length for each packet:

 

ID: 00000000 | Time: 1716140249.128 | Function: IRP_MJ_CREATE | Data: [.] | Length: 0

ID: 00000001 | Time: 1716140249.151 | Function: IOCTL_SERIAL_GET_BAUD_RATE | Data: [.]%[.] | Length: 4

ID: 00000002 | Time: 1716140249.165 | Function: IOCTL_SERIAL_GET_LINE_CONTROL | Data: [.] [.] [.] | Length: 3

ID: 00000003 | Time: 1716140249.180 | Function: IOCTL_SERIAL_GET_CHARS | Data: [.] [.] [.] [.] [.] [.] | Length: 6

ID: 00000004 | Time: 1716140249.196 | Function: IOCTL_SERIAL_GET_HANDFLOW | Data: [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] | Length: 16

ID: 00000005 | Time: 1716140249.211 | Function: IOCTL_SERIAL_GET_BAUD_RATE | Data: [.]%[.] | Length: 4

ID: 00000006 | Time: 1716140249.226 | Function: IOCTL_SERIAL_GET_LINE_CONTROL | Data: [.] [.] [.] | Length: 3

ID: 00000007 | Time: 1716140249.241 | Function: IOCTL_SERIAL_GET_CHARS | Data: [.] [.] [.] [.] [.] [.] | Length: 6

ID: 00000008 | Time: 1716140249.257 | Function: IOCTL_SERIAL_GET_HANDFLOW | Data: [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] | Length: 16

ID: 00000009 | Time: 1716140249.273 | Function: IOCTL_SERIAL_SET_BAUD_RATE | Data: [.]%[.] | Length: 4

ID: 00000010 | Time: 1716140249.288 | Function: IOCTL_SERIAL_SET_DTR | Data: [.] | Length: 0

ID: 00000011 | Time: 1716140249.304 | Function: IOCTL_SERIAL_SET_LINE_CONTROL | Data: [.] [.] [.] | Length: 3

ID: 00000012 | Time: 1716140249.320 | Function: IOCTL_SERIAL_SET_CHARS | Data: [.] [.] [.] [.] [.] [.] | Length: 6

ID: 00000013 | Time: 1716140249.336 | Function: IOCTL_SERIAL_SET_HANDFLOW | Data: [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] | Length: 16

ID: 00000014 | Time: 1716140249.338 | Function: IRP_MJ_WRITE | Data: :011... | Length: 27

ID: 00000015 | Time: 1716140249.340 | Function: IOCTL_SERIAL_SET_TIMEOUTS | Data: [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] | Length: 20

ID: 00000016 | Time: 1716140249.342 | Function: IRP_MJ_READ | Data: [.] | Length: 1

 

The log goes on and ends with…

SerialTool SpyPort Log

 

ID: 00000048 | Time: 1716140249.406 | Function: IRP_MJ_READ | Data: [.] | Length: 1

ID: 00000049 | Time: 1716140249.408 | Function: IOCTL_SERIAL_GET_BAUD_RATE | Data: [.]%[.] | Length: 4

ID: 00000050 | Time: 1716140249.410 | Function: IOCTL_SERIAL_GET_LINE_CONTROL | Data: [.] [.] [.] | Length: 3

ID: 00000051 | Time: 1716140249.412 | Function: IOCTL_SERIAL_GET_CHARS | Data: [.] [.] [.] [.] [.] [.] | Length: 6

ID: 00000052 | Time: 1716140249.414 | Function: IOCTL_SERIAL_GET_HANDFLOW | Data: [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] | Length: 16

ID: 00000053 | Time: 1716140249.416 | Function: IOCTL_SERIAL_SET_BAUD_RATE | Data: [.]%[.] | Length: 4

ID: 00000054 | Time: 1716140249.418 | Function: IOCTL_SERIAL_SET_DTR | Data: [.] | Length: 0

ID: 00000055 | Time: 1716140249.420 | Function: IOCTL_SERIAL_SET_LINE_CONTROL | Data: [.] [.] [.] | Length: 3

ID: 00000056 | Time: 1716140249.422 | Function: IOCTL_SERIAL_SET_CHARS | Data: [.] [.] [.] [.] [.] [.] | Length: 6

ID: 00000057 | Time: 1716140249.424 | Function: IOCTL_SERIAL_SET_HANDFLOW | Data: [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] [.] | Length: 16

ID: 00000058 | Time: 1716140249.426 | Function: IRP_MJ_CLEANUP | Data: [.] | Length: 0

ID: 00000059 | Time: 1716140249.428 | Function: IRP_MJ_CLOSE | Data: [.] | Length: 0

 

The previous log entries mark the conclusion of monitoring the “Write Multiple Registers” command in ModBus. As seen in the Session Packets List, various functions and their corresponding data were captured during this process.

Now let's lee what we have in Function Dump:

 

SerialTool SpyPort Serial Port Signals Log

 

This screenshot displays the “Functions Dump” and “R/W Dump” sections of SerialTool’s SpyPort interface, offering detailed insights into the serial port activities. The Functions Dump contains all the functions called in the log along with their associated data. This includes specific operations like setting handflow parameters, cleanup tasks, and closing the serial port.

For example, you can see:

  • IRP_MJ_CLEANUP packet details with the timestamp and data length, indicating the cleanup operation.
  • IRP_MJ_CLOSE packet details, marking the closure of the serial port session.

The R/W Dump section allows you to view the payload content in various formats. The dropdown menu shows options for Hex, ASCII, Binary, Octal, and Decimal formats, providing flexibility in how you examine the data. Currently, the Hex Format is selected, making it easy to interpret raw data at the byte level. This feature is incredibly useful for in-depth analysis and debugging, as it lets you choose the most convenient representation for your needs.

Here is the full log copied to clipboard:


----------------------------------------------------------------------------------
[IRP_MJ_CREATE] packet: 00000000 at 19-05-2024 19:37:29.128 (1716140249.128)
Data length (bytes): 0

----------------------------------------------------------------------------------
[IOCTL_SERIAL_GET_BAUD_RATE] packet: 00000001 at 19-05-2024 19:37:29.151 (1716140249.151)
Data length (bytes): 4 Data Bytes: 0x80 0x25 0x00 0x00
Function details:
Get Baudrate: 9600

----------------------------------------------------------------------------------
[IOCTL_SERIAL_GET_LINE_CONTROL] packet: 00000002 at 19-05-2024 19:37:29.165 (1716140249.165)
Data length (bytes): 3 Data Bytes: 0x00 0x00 0x08
Function details:
Get COM Controls: 8 Bits, NONE Parity, 1 Stop Bits.

----------------------------------------------------------------------------------
[IOCTL_SERIAL_GET_CHARS] packet: 00000003 at 19-05-2024 19:37:29.180 (1716140249.180)
Data length (bytes): 6 Data Bytes: 0x00 0x00 0x00 0x00 0x11 0x13
Function details:
Get Chars: EofChar=0x00, ErrorChar=0x00, BreakChar=0x00, EventChar=0x00, XonChar=0x11, XoffChar=0x13

----------------------------------------------------------------------------------
[IOCTL_SERIAL_GET_HANDFLOW] packet: 00000004 at 19-05-2024 19:37:29.196 (1716140249.196)
Data length (bytes): 16 Data Bytes: 0x01 0x00 0x00 0x80 0xC0 0x00 0x00 0x00 0x00 0x08 0x00 0x00 0x00 0x02 0x00 0x00
Function details:
Get Handflow: ControlHandShake: Empty, FlowReplace: Empty, XonLimit=2048, XoffLimit=512

----------------------------------------------------------------------------------
[IOCTL_SERIAL_GET_BAUD_RATE] packet: 00000005 at 19-05-2024 19:37:29.211 (1716140249.211)
Data length (bytes): 4 Data Bytes: 0x80 0x25 0x00 0x00
Function details:
Get Baudrate: 9600

----------------------------------------------------------------------------------
[IOCTL_SERIAL_GET_LINE_CONTROL] packet: 00000006 at 19-05-2024 19:37:29.226 (1716140249.226)
Data length (bytes): 3 Data Bytes: 0x00 0x00 0x08
Function details:
Get COM Controls: 8 Bits, NONE Parity, 1 Stop Bits.

----------------------------------------------------------------------------------
[IOCTL_SERIAL_GET_CHARS] packet: 00000007 at 19-05-2024 19:37:29.241 (1716140249.241)
Data length (bytes): 6 Data Bytes: 0x00 0x00 0x00 0x00 0x11 0x13
Function details:
Get Chars: EofChar=0x00, ErrorChar=0x00, BreakChar=0x00, EventChar=0x00, XonChar=0x11, XoffChar=0x13

----------------------------------------------------------------------------------
[IOCTL_SERIAL_GET_HANDFLOW] packet: 00000008 at 19-05-2024 19:37:29.257 (1716140249.257)
Data length (bytes): 16 Data Bytes: 0x01 0x00 0x00 0x80 0xC0 0x00 0x00 0x00 0x00 0x08 0x00 0x00 0x00 0x02 0x00 0x00
Function details:
Get Handflow: ControlHandShake: Empty, FlowReplace: Empty, XonLimit=2048, XoffLimit=512

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_BAUD_RATE] packet: 00000009 at 19-05-2024 19:37:29.273 (1716140249.273)
Data length (bytes): 4 Data Bytes: 0x80 0x25 0x00 0x00
Function details:
Set Baudrate: 9600

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_DTR] packet: 00000010 at 19-05-2024 19:37:29.288 (1716140249.288)
Data length (bytes): 0

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_LINE_CONTROL] packet: 00000011 at 19-05-2024 19:37:29.304 (1716140249.304)
Data length (bytes): 3 Data Bytes: 0x00 0x00 0x08
Function details:
Set COM Controls: 8 Bits, NONE Parity, 1 Stop Bits.

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_CHARS] packet: 00000012 at 19-05-2024 19:37:29.320 (1716140249.320)
Data length (bytes): 6 Data Bytes: 0x00 0x00 0x00 0x00 0x11 0x13
Function details:
Set Chars: EofChar=0x00, ErrorChar=0x00, BreakChar=0x00, EventChar=0x00, XonChar=0x11, XoffChar=0x13

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_HANDFLOW] packet: 00000013 at 19-05-2024 19:37:29.336 (1716140249.336)
Data length (bytes): 16 Data Bytes: 0x01 0x00 0x00 0x00 0xC0 0x00 0x00 0x80 0x00 0x08 0x00 0x00 0x00 0x02 0x00 0x00
Function details:
Set Handflow: ControlHandShake: (SERIAL_DTR_CONTROL), FlowReplace: Empty, XonLimit=2048, XoffLimit=512

----------------------------------------------------------------------------------
[IRP_MJ_WRITE] WRITE packet: 00000014 [00000027 Bytes] at 19-05-2024 19:37:29.338 (1716140249.338)
HEX dump:
3A 30 31 31 30 30 30 30 30 30 30 30 32 30 34 30
30 30 32 30 30 32 31 43 36 0D 0A

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000015 at 19-05-2024 19:37:29.340 (1716140249.340)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000016 [00000001 Bytes] at 19-05-2024 19:37:29.342 (1716140249.342)
HEX dump:
3A

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000017 at 19-05-2024 19:37:29.344 (1716140249.344)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000018 [00000001 Bytes] at 19-05-2024 19:37:29.346 (1716140249.346)
HEX dump:
30

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000019 at 19-05-2024 19:37:29.348 (1716140249.348)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000020 [00000001 Bytes] at 19-05-2024 19:37:29.350 (1716140249.350)
HEX dump:
31

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000021 at 19-05-2024 19:37:29.352 (1716140249.352)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000022 [00000001 Bytes] at 19-05-2024 19:37:29.354 (1716140249.354)
HEX dump:
31

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000023 at 19-05-2024 19:37:29.356 (1716140249.356)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000024 [00000001 Bytes] at 19-05-2024 19:37:29.358 (1716140249.358)
HEX dump:
30

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000025 at 19-05-2024 19:37:29.360 (1716140249.360)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000026 [00000001 Bytes] at 19-05-2024 19:37:29.362 (1716140249.362)
HEX dump:
30

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000027 at 19-05-2024 19:37:29.364 (1716140249.364)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000028 [00000001 Bytes] at 19-05-2024 19:37:29.366 (1716140249.366)
HEX dump:
30

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000029 at 19-05-2024 19:37:29.368 (1716140249.368)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000030 [00000001 Bytes] at 19-05-2024 19:37:29.370 (1716140249.370)
HEX dump:
30

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000031 at 19-05-2024 19:37:29.372 (1716140249.372)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000032 [00000001 Bytes] at 19-05-2024 19:37:29.374 (1716140249.374)
HEX dump:
30

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000033 at 19-05-2024 19:37:29.376 (1716140249.376)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000034 [00000001 Bytes] at 19-05-2024 19:37:29.378 (1716140249.378)
HEX dump:
30

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000035 at 19-05-2024 19:37:29.380 (1716140249.380)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000036 [00000001 Bytes] at 19-05-2024 19:37:29.382 (1716140249.382)
HEX dump:
30

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000037 at 19-05-2024 19:37:29.384 (1716140249.384)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000038 [00000001 Bytes] at 19-05-2024 19:37:29.386 (1716140249.386)
HEX dump:
30

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000039 at 19-05-2024 19:37:29.388 (1716140249.388)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000040 [00000001 Bytes] at 19-05-2024 19:37:29.390 (1716140249.390)
HEX dump:
32

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000041 at 19-05-2024 19:37:29.392 (1716140249.392)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000042 [00000001 Bytes] at 19-05-2024 19:37:29.394 (1716140249.394)
HEX dump:
45

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000043 at 19-05-2024 19:37:29.396 (1716140249.396)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000044 [00000001 Bytes] at 19-05-2024 19:37:29.398 (1716140249.398)
HEX dump:
44

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000045 at 19-05-2024 19:37:29.400 (1716140249.400)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000046 [00000001 Bytes] at 19-05-2024 19:37:29.402 (1716140249.402)
HEX dump:
0D

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_TIMEOUTS] packet: 00000047 at 19-05-2024 19:37:29.404 (1716140249.404)
Data length (bytes): 20 Data Bytes: 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xE8 0x03 0x00 0x00
Function details:
Set Timeouts: ReadIntervalTimeout 500 (0x000001F4), ReadTotalTimeoutMultiplier 0 (0x00000000), ReadTotalTimeoutConstant 500 (0x000001F4), WriteTotalTimeoutMultiplier 0 (0x00000000), WriteTotalTimeoutConstant 1000 (0x000003E8)

----------------------------------------------------------------------------------
[IRP_MJ_READ] READ packet: 00000048 [00000001 Bytes] at 19-05-2024 19:37:29.406 (1716140249.406)
HEX dump:
0A

----------------------------------------------------------------------------------
[IOCTL_SERIAL_GET_BAUD_RATE] packet: 00000049 at 19-05-2024 19:37:29.408 (1716140249.408)
Data length (bytes): 4 Data Bytes: 0x80 0x25 0x00 0x00
Function details:
Get Baudrate: 9600

----------------------------------------------------------------------------------
[IOCTL_SERIAL_GET_LINE_CONTROL] packet: 00000050 at 19-05-2024 19:37:29.410 (1716140249.410)
Data length (bytes): 3 Data Bytes: 0x00 0x00 0x08
Function details:
Get COM Controls: 8 Bits, NONE Parity, 1 Stop Bits.

----------------------------------------------------------------------------------
[IOCTL_SERIAL_GET_CHARS] packet: 00000051 at 19-05-2024 19:37:29.412 (1716140249.412)
Data length (bytes): 6 Data Bytes: 0x00 0x00 0x00 0x00 0x11 0x13
Function details:
Get Chars: EofChar=0x00, ErrorChar=0x00, BreakChar=0x00, EventChar=0x00, XonChar=0x11, XoffChar=0x13

----------------------------------------------------------------------------------
[IOCTL_SERIAL_GET_HANDFLOW] packet: 00000052 at 19-05-2024 19:37:29.414 (1716140249.414)
Data length (bytes): 16 Data Bytes: 0x01 0x00 0x00 0x00 0xC0 0x00 0x00 0x80 0x00 0x08 0x00 0x00 0x00 0x02 0x00 0x00
Function details:
Get Handflow: ControlHandShake: (SERIAL_DTR_CONTROL), FlowReplace: Empty, XonLimit=2048, XoffLimit=512

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_BAUD_RATE] packet: 00000053 at 19-05-2024 19:37:29.416 (1716140249.416)
Data length (bytes): 4 Data Bytes: 0x80 0x25 0x00 0x00
Function details:
Set Baudrate: 9600

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_DTR] packet: 00000054 at 19-05-2024 19:37:29.418 (1716140249.418)
Data length (bytes): 0

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_LINE_CONTROL] packet: 00000055 at 19-05-2024 19:37:29.420 (1716140249.420)
Data length (bytes): 3 Data Bytes: 0x00 0x00 0x08
Function details:
Set COM Controls: 8 Bits, NONE Parity, 1 Stop Bits.

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_CHARS] packet: 00000056 at 19-05-2024 19:37:29.422 (1716140249.422)
Data length (bytes): 6 Data Bytes: 0x00 0x00 0x00 0x00 0x11 0x13
Function details:
Set Chars: EofChar=0x00, ErrorChar=0x00, BreakChar=0x00, EventChar=0x00, XonChar=0x11, XoffChar=0x13

----------------------------------------------------------------------------------
[IOCTL_SERIAL_SET_HANDFLOW] packet: 00000057 at 19-05-2024 19:37:29.424 (1716140249.424)
Data length (bytes): 16 Data Bytes: 0x01 0x00 0x00 0x80 0xC0 0x00 0x00 0x00 0x00 0x08 0x00 0x00 0x00 0x02 0x00 0x00
Function details:
Set Handflow: ControlHandShake: Empty, FlowReplace: Empty, XonLimit=2048, XoffLimit=512

----------------------------------------------------------------------------------
[IRP_MJ_CLEANUP] packet: 00000058 at 19-05-2024 19:37:29.426 (1716140249.426)
Data length (bytes): 0

----------------------------------------------------------------------------------
[IRP_MJ_CLOSE] packet: 00000059 at 19-05-2024 19:37:29.428 (1716140249.428)
Data length (bytes): 0

Here we have the separated hexadecimal dump of IRP_MJ_WRITE and IRP_MR_READ data collected during the log:

 

SerialTool SpyPort Hex Write and Read Dump

This screenshot shows the “HEX Write Dump” and “HEX Read Dump” sections of SerialTool’s SpyPort interface, providing detailed hexadecimal representations of the data being written to and read from the serial port during the monitoring session.

In the HEX Write Dump section, you can see the exact data being sent to the serial port. The addresses and data are presented in hexadecimal format:

  • 0x00000000h-0x0000000Fh: 3A 30 31 31 30 30 30 30 30 30 30 32 30 34 30
  • 0x00000010h-0x0000001Fh: 30 30 32 30 32 31 43 36 0D 0A

These sequences represent the payloads of the write operations, providing a clear view of what is being transmitted.

In the HEX Read Dump section, the data received from the serial port is displayed:

  • 0x00000000h-0x0000000Fh: 3A 30 31 31 30 30 30 30 30 30 30 32 45 44 0D
  • 0x00000010h-0x0000001Fh: 0A

This hex dump shows the data that has been read from the serial port, allowing for easy comparison with the sent data to verify the communication integrity.

Both sections include options to “Copy to Clipboard” or “Clear,” making it convenient to extract or reset the displayed data. This detailed logging and hexadecimal representation are essential for debugging and validating the serial communication, ensuring that you can track exactly what data is being exchanged between your systems.

 

In conclusion, I have to say that SerialTool's SpyPort is an amazing tool for anyone working with serial ports!

I've been able to monitor, log, and analyze all my serial communications effortlessly. The detailed packet listings and function dumps are super helpful, and I love that I can view the data in Hex, ASCII, Binary, Octal, and Decimal formats. Whether you're developing, testing, or troubleshooting, SpyPort makes everything so much easier and clearer. It's definitely a game-changer for serial communication work!