I hope that this blog post is found and helps someone. I wasn’t sure what to title it. Hope Google Juice got you here!
Read this whole post, there’s a lot initially but there’s really just two or three small pieces. It’ll be worth it because you’ll be able to have a nice one click menu and drop directly into a serial port terminal on Windows in the Windows Terminal
Often when you’re doing embedded systems development you’ll want to monitor or talk to the COM/Serial Port just like you SSH into remote system. Folks ask questions like «How to connect to a serial port as simple as using SSH?»
On Linux you’ll use things like «screen /dev/ttyS0» for COM0. With Windows, however, the historical guidance has always been to use Putty. It’ll work but it’s somewhat old, quirky, and it doesn’t integrate well with the Windows Terminal and a more modern workflow.
Say I have a small embedded microcontroller device that talks over a COM Port (usually via a USB->COM bridge) like an Arduino.
Let’s assume this device talks to the COM port as if it were a terminal and it’s outputting stuff I want to see. I’ll use this great little CLI example app for Arduino from Mads Aasvik to simulate such a device.
Here’s what it looks like under Arduino’s Serial Monitor, for example. This is a Windows app doing serial communication with its own interface wrapping around it. I want to do this at a command line, and bonus points if it’s in Windows Terminal.
Setup WSL1
If you have Windows 10 you can the Windows Subsystem for Linux quickly with this command at a Admin prompt:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
Then go to the Windows Store and get any small Linux. Ubuntu or Kali will do for our purposes. Run it and set your user and password. (I tried Alpine but it still has issues with screen and /dev/null/utmp)
NOTE: If you are using WSL2 and have set it as default, run wsl —list -v and ensure that your new distro is using WSL1 as only WSL1 will let us talk to the COM Ports. You can change it to WSL1 with «wsl —set-version DISTRONAME 1» from any command prompt.
To test this out now, run your new distro from any command line prompt like this. Add the «screen» app with sudo apt update
» and «sudo app install screen
«.
You can see here that my Arduino serial device is on COM4. On Linux that device is /dev/ttyS4
That means that I should be able to talk it from any WSL1 Linux Distro on Windows like «screen /dev/ttyS4 9600
» where 9600 is the speed/baud rate.
> wsl --list -v
NAME STATE VERSION
* Ubuntu-18.04 Stopped 2
kali-linux Stopped 1
Ubuntu-20.04 Stopped 2
WLinux Stopped 2
Get Minicom on your WSL1 distro
Screen is somewhat persnickety for Serial Port work so try Minicom. Minicom is a nice little text com program. Install with apt install minicom and run for the first time with «sudo minicom -s» to set your default. Note I’ve change the default port from /dev/modem to /dev/ttyS4 and the speed, in my case, to 9600.
Then I hit enter and save settings as the dft (default) in minicom. You can also turn on Local Echo with «Ctrl-A E» and toggle it if needed. Now I can talk to my Arudino with minicom.
Ensure dialout permissions to talk to the COM port
NOTE: If you get «cannon open /dev/ttyS4: Permission denied, you may need to add your user to the dialout group. This way we don’t need to sudo and get no prompt when running minicom!
> wsl -d kali-linux minicom
minicom: cannot open /dev/ttyS4: Permission denied
> wsl -d kali-linux
$ groups scott
scott : scott adm cdrom sudo dip plugdev
$ sudo gpasswd --add scott dialout
[sudo] password for scott:
Adding user scott to group dialout
I can now run minicom on my configured COM port 4 (/dev/ttyS4) with wsl -d DISTRONAME minicom without sudo
.
Here I’m talking to that Arduino program. This embedded app doesn’t need to me hit enter after I type, so remember your own embedded devices will vary.
Make a nice menu
Bonus points, now I’ll add a menu item for Minicom by changing my Windows Terminal settings AND I’ll get more points for adding a nice serial port icon!
I hit settings and add a new profile like this at the top under profiles in the «list.» Again, your distro name will be different.
{
"guid": "{61c54bbd-a2c6-5271-96e7-009a87fa45cf}",
"name": "Minicom on Serial COM4",
"hidden": false,
"commandline": "wsl -d kali-linux minicom",
"startingDirectory": "%USERPROFILE%",
"icon": "C:/Users/scott/Desktop/serial_port_icon_138204.png"
},
To review:
- Use a WSL1 distro
- Install minicom, run with minicom -s once to make settings
- Make sure you are using the right /dev/ttyS0 device for your situation
- Ensure your flow control, baud, etc are all correct in minicom
- Add your user to the dialout group so you don’t have to sudo minicom
- Make a menu item in Windows Terminal
- or run minicom manually in your WSL1 instance whenever you like
Hope this helps!
Sponsor: Suffering from a lack of clarity around software bugs? Give your customers the experience they deserve and expect with error monitoring from Raygun.com. Installs in minutes, try it today!
About Scott
Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.
About Newsletter
Hosting By
A detailed guide to connecting via serial ports using Windows Terminal
Key Highlights
- Integration with Dedicated Tools: Tools like PuTTY, SimplySerial, and minicom (via WSL) help bridge the gap in Windows Terminal’s native capabilities.
- Flexible Configurations: Customize connections by specifying COM port, baud rate, parity, data bits, and stop bits using various command-line options.
- Advanced Usage Options: Options such as scripting with PowerShell and using GUI alternatives (RealTerm, Tera Term) extend functionalities by providing interactive sessions and additional debugging features.
Overview of Serial COM Tools and Their Integration with Windows Terminal
The Windows Terminal is a versatile command-line interface that supports multiple shell environments such as Command Prompt, PowerShell, and Windows Subsystem for Linux (WSL). However, it does not natively provide the functionality to connect directly to serial COM ports. To bridge this gap, several external tools and methods can be integrated with Windows Terminal, each providing a different set of capabilities tailored for various serial communication needs. In this guide, we discuss several popular tools, their configurations, and best practices for integrating them into your workflow.
Popular Tools and Methods
1. PuTTY and Plink
PuTTY is one of the most recognized terminal emulators, which supports a range of protocols including SSH, Telnet, and serial communications. Its command-line companion, Plink, allows users to initiate serial connections directly from a script or command prompt.
PuTTY
The graphical interface of PuTTY is widely appreciated for its ease of use when establishing serial communications. Users can configure the COM port, baud rate, parity, stop bits, and data bits through the interface. However, it requires launching a separate application outside the Windows Terminal environment.
Plink
Plink facilitates command-line operations as it can be invoked with specific parameters to make serial connections. For example, to connect to COM1 at a baud rate of 115200 with the settings 8 data bits, 1 stop bit, and no parity, the command might look like this:
// Command example using Plink:
//
// plink -serial COM1 -sercfg 115200,8,1,N,N
This method is particularly useful when automating serial connections or when working on remote scripts that require interaction with serial devices.
2. SimplySerial
SimplySerial is a lightweight Windows console application designed specifically for serial communication. Its simplicity and ease of use make it an ideal candidate for direct integration with Windows Terminal.
Features and Usage
SimplySerial provides a straightforward command-line interface where you can specify the COM port, baud rate, and other essential parameters. For instance, using the command «ss» followed by parameters can launch a session directly within Windows Terminal. A typical configuration might involve creating a new profile in Windows Terminal’s settings.json file such as:
{
"commandline": "ss -com:4 -baud:115200",
"name": "COM4"
}
This configuration tells Windows Terminal to start SimplySerial on COM4 at a baud rate of 115200, providing an integrated and seamless experience.
3. Windows Subsystem for Linux (WSL) and Minicom
The Windows Subsystem for Linux (WSL) extends Windows capabilities by allowing users to run a Linux environment directly within Windows. With WSL, you have access to Linux-based terminal emulators like minicom, which is traditionally used for serial port communication on Linux systems.
Using Minicom on WSL
Minicom is highly configurable and supports a wide range of serial communication features. To use minicom via WSL, ensure that your serial device is correctly mapped to the WSL environment. A basic command might entail launching WSL and starting minicom as follows:
// Start minicom on a specified COM port through WSL:
// wsl -d DISTRONAME minicom
This integration makes it possible to leverage powerful Linux tools for serial communication in a Windows setup, providing additional flexibility for developers familiar with Linux environments.
4. PowerShell’s System.IO.Ports.SerialPort Class
For users who prefer native Windows scripting, PowerShell provides a rich set of features for managing serial communications through the System.IO.Ports.SerialPort
class. This class allows you to establish and manage serial connections directly from PowerShell without needing external tools.
Basic PowerShell Serial Connection
An example of initiating and configuring a serial port in PowerShell is as follows:
# PowerShell Example: Initialize and open a serial port session.
$port = New-Object System.IO.Ports.SerialPort COM4,9600,None,8,one
$port.Open()
// Perform operations...
$port.Close()
While this method demands more hands-on coding, it offers tremendous flexibility for integrating serial communications into scripts for testing, automation, and device management.
5. Alternative Tools: RealTerm, Tera Term, and Others
Beyond the aforementioned tools, several alternatives are available for different user preferences and advanced functionalities:
RealTerm
Designed primarily for engineers and developers, RealTerm offers extensive capabilities for debugging serial communications. With features tailored for data capturing, logging, and detailed view functionalities, it represents a robust alternative when detailed analysis of serial data is required.
Tera Term
Tera Term is another terminal emulator that supports serially connected devices, offering a user-friendly GUI interface. Tera Term allows users to quickly configure serial connections, making it a popular choice for less script-intensive environments.
Other Noteworthy Tools
Solutions like Docklight, SerialTerm, and CoolTerm are also worthy mentions for their specialty features such as real-time text color differentiation, control character display, and enhanced logging capabilities. These tools are particularly useful when working on complex projects requiring in-depth serial port debugging and monitoring.
Configuring and Customizing Serial Connections
Effective serial communication often requires careful configuration to ensure that the tool being used can communicate properly with the target device. Here are some detailed configuration parameters commonly adjusted across these tools:
Parameter | Description | Typical Values | Usage |
---|---|---|---|
COM Port | The serial port identifier (e.g., COM1, COM4, etc.) | COM1, COM2, COM3, … | Specifies the physical serial port to connect with. |
Baud Rate | The speed of communication measured in bits per second (bps) | 9600, 115200, etc. | Defines the transmission speed; must match the device’s configuration. |
Parity | Error checking mechanism for data integrity | None, Even, Odd | Ensures that data is sent and received without corruption. |
Data Bits | Number of bits in a transmitted data packet | 7 or 8 | Establishes the amount of data sent in each character. |
Stop Bits | Indicates the end of a data packet | 1 or 2 | Confirms the end of a data transmission sequence. |
This table encapsulates the primary parameters required for a successful serial connection. Most of the discussed tools allow configuring these parameters either through command-line arguments (as seen in PuTTY, SimplySerial, and Plink) or GUI configuration menus (as provided by Tera Term and RealTerm).
Integrating Serial Tools with Windows Terminal
Although Windows Terminal does not directly support serial communications, its capability to host multiple profiles enables you to integrate external tools smoothly.
Setting Up a Custom Profile
For a tool like SimplySerial, you can create a new profile within Windows Terminal by editing the settings.json
file. Below is an example profile configuration:
{
"profiles": {
"list": [
{
"guid": "{some-guid}",
"name": "COM4 Session",
"commandline": "ss -com:4 -baud:115200",
"startingDirectory": "%USERPROFILE%"
}
]
}
}
This configuration allows you to access the serial communication session on COM4 directly from Windows Terminal. Similarly, profiles can also be set up to launch PuTTY, WSL with minicom, or even a PowerShell session that utilizes the System.IO.Ports.SerialPort class.
These integrations make it possible to switch between command line, Linux-based utilities, and serial diagnostics without leaving the unified Windows Terminal interface, leading to a smoother workflow for developers and engineers alike.
Advanced Use Cases and Automation
The options available for serial communication with Windows Terminal not only address basic connectivity but also offer advanced functionalities:
Scripting and Automation
Integrating command-line tools such as Plink with scripting languages (like PowerShell or Bash) opens up opportunities for automation. It enables users to perform batch operations, log data in real time, and develop custom utilities for testing embedded devices. Automation is crucial for systems that require frequent or repetitive communication tasks with serial devices.
Debugging and Data Logging
Tools like RealTerm and CoolTerm offer specialized features for data logging and debugging. They provide visual indicators and logging mechanisms that help developers monitor the transmission and reception of data, which is essential for troubleshooting communication issues.
Cross-Platform Flexibility
Using WSL and Linux-based tools such as minicom gives users the flexibility to operate in a familiar Linux environment while still using Windows Terminal as the primary interface. This cross-platform integration is particularly useful for developers who work in heterogeneous environments and require the versatility to switch operating systems without changing their workflow.
Comparative Table: Serial Communication Tools
Tool | Interface Type | Integration Method | Key Features |
---|---|---|---|
PuTTY/Plink | GUI / Command Line | Separate Application / Integrated via command-line | Widely used, supports multiple protocols, automation with Plink |
SimplySerial | Command Line Console | Direct integration in Windows Terminal via custom profiles | Simple, lightweight, easy to configure |
WSL/Minicom | Linux Terminal (WSL) | Integrated via WSL | Flexible configuration, robust for Linux tool users |
PowerShell | Command Line Scripting | Native Windows | Customizable via System.IO.Ports.SerialPort, great for automation |
RealTerm/Tera Term | GUI | Standalone, can be launched from Windows Terminal | Advanced debugging, data logging, user-friendly interfaces |
The table above summarizes the depth and variety of tools available for achieving serial communications via Windows Terminal. By understanding the strengths of each tool, you can select the one that best fits your operational requirements and technical preferences.
References
- Connecting to Serial Ports with Windows Terminal — Mike Coats
- Connect to a Device over Serial COM Port on Windows 10 — Hanselman
- SimplySerial on GitHub — fasteddy516
- Serial Terminal Basics — SparkFun Learn
- Serial Terminal — Adafruit Learning System
Recommended
- Explore PuTTY for Serial Communication and Automation
- Learn to Set Up Minicom on WSL for Serial Data
- Advanced Scripting with PowerShell’s SerialPort Class
- Dive into RealTerm for Debugging Complex Serial Data
- Customize Windows Terminal Profiles for Serial Tools
Enabling COM Port in Windows 10 might sound technical, but it’s actually pretty straightforward. By following some simple steps, you can make sure your computer recognizes and uses COM ports effectively. Whether you’re setting up a new piece of hardware, troubleshooting a connection, or tweaking settings for an application, enabling COM ports is a critical skill to have.
In the following steps, we’ll go through the process of enabling a COM port on a Windows 10 machine. This will involve accessing the Device Manager, modifying port settings, and ensuring your system recognizes the port.
Step 1: Open the Device Manager
First, right-click on the Start button and select «Device Manager» from the context menu.
Device Manager is your go-to tool for managing hardware and drivers on your computer. It displays all the connected devices and allows you to configure them.
Step 2: Expand the Ports Section
Once in Device Manager, find the «Ports (COM & LPT)» section and click the small arrow next to it.
This section shows you all the available COM ports. If you don’t see it, it means no COM ports are currently recognized by your system.
Step 3: Right-click on a COM Port
Right-click on any of the listed COM ports and select «Properties» from the dropdown menu.
The Properties window gives you detailed information about the selected port and allows you to adjust its settings.
Step 4: Navigate to Port Settings
In the Properties window, go to the «Port Settings» tab and click on «Advanced».
Here you can change various settings related to the COM port, such as baud rate, data bits, and more.
Step 5: Change the COM Port Number
In the Advanced Settings, you can change the COM Port number if needed. Click «OK» to save the changes.
Changing the port number can help resolve conflicts with other devices and ensure smooth operation.
Step 6: Confirm and Close
After making your changes, click «OK» to close the Properties window and then close Device Manager.
Your changes will be saved, and the COM port should now be enabled and ready for use.
After completing these steps, your COM port will be enabled, and your computer should recognize it without any issues. This means you can now connect external devices that use COM ports and configure them as needed.
Tips for Enabling COM Port in Windows 10
- Check for Updates: Make sure your Windows 10 system is up-to-date to avoid compatibility issues with COM ports.
- Use the Correct Drivers: Ensure you have the right drivers installed for your hardware that uses COM ports.
- Troubleshooting: If the port doesn’t show up, try restarting your computer or checking the hardware connections.
- Port Conflicts: If you experience conflicts, try changing the COM port number in the Advanced settings.
- Backup Settings: Keep a record of your port settings before making changes, so you can revert if needed.
Frequently Asked Questions
What is a COM port?
A COM port, or communication port, is a serial port that allows for communication between the computer and external devices.
Why don’t I see any COM ports in Device Manager?
If no COM ports are visible, it could be due to a lack of relevant drivers or that no COM port hardware is currently connected.
Can I use multiple COM ports at once?
Yes, you can use multiple COM ports simultaneously, but ensure there are no conflicts in port numbers.
How do I know which COM port my device is using?
You can check the COM port assignment in Device Manager under the «Ports (COM & LPT)» section.
What do I do if my COM port isn’t working?
Check the device’s drivers, ensure no port conflicts, and verify that the hardware is properly connected and functioning.
Step-by-Step Summary
- Right-click Start button, select «Device Manager».
- Expand «Ports (COM & LPT)» section.
- Right-click on a COM port, select «Properties».
- Go to «Port Settings» tab, click «Advanced».
- Change COM Port number, click «OK».
- Confirm changes and close Device Manager.
Conclusion
Enabling a COM port in Windows 10 is easier than it seems. By following the steps outlined in this guide, you can quickly get your COM port up and running. This process involves accessing the Device Manager, tweaking settings, and ensuring the port is recognized by your system.
So, why wait? Get started right away and make the most of your hardware! For further reading, you can explore more about device management in Windows 10 or delve into troubleshooting common COM port issues. Now that you know how to enable COM port in Windows 10, you’re well-equipped to handle any related challenges that come your way.
Matt Jacobs has been working as an IT consultant for small businesses since receiving his Master’s degree in 2003. While he still does some consulting work, his primary focus now is on creating technology support content for SupportYourTech.com.
His work can be found on many websites and focuses on topics such as Microsoft Office, Apple devices, Android devices, Photoshop, and more.
Представляю на обозрение терминал для работы с COM-портом. Уверен, что с данным портом многие знакомы с детского сада, поэтому не буду останавливаться на нём, а перейду сразу к терминалу. Изначально данная программа представляла собой обычную консоль для работы с COM-портом. При работе с модулями связи и множеством разношерстных датчиков появилась идея создать универсальный терминал для автоматизации рутинных операций и представления входящих данных в графическом виде в реальном времени. Дальше — больше.
От аналогичных программ данный терминал отличается широким функционалом. Программа сильно упростит процесс разработки приборов, которые так или иначе используют UART. Например, всевозможные GSM- и GPS-модули, датчики с выводом данных по RS232/485, приборы с эмулятором COM-порта через USB, беспроводные модули связи c выходом RS232 и т.д.
При правильном использовании данного терминала значительно упрощается процесс отладки и тестирования различных прототипов приборов и датчиков за счёт максимальной автоматизации повторяющихся действий, максимального контроля работы нескольких приборов одновременно и наглядного представления результатов. Гибкость настроек позволяет адаптировать программу для работы с большинством устройств, выводящих данные через UART. Также данный терминал можно использовать в тех случаях, когда ещё нет готового конфигуратора для прототипа нового устройства, что опять же ускоряет процесс разработки со стороны программиста МК, которому не придётся ждать внесения новых изменений от писателя софта для ПК.
Возможности терминала
-
удобное хранение и использование в сумме до 4800 макросов, разбитых на 100 списков с полным описанием каждого макроса + 200 списков по 216 макросов на дополнительной форме.
-
работа в HEX, ASCII и DEC режиме на передачу и в HEX, ASCII, DEC и CUSTOM на приём;
-
4 режима отправки команд или файлов из консольной строки: ручной, периодический, после ответа и при нажатии на кнопку с макросом;
-
режим побайтной ручной отправки содержимого консольной строки в порт;
-
отправка команд или файлов по нажатию настраиваемых “горячих клавиш”;
-
отправка команд или файлов с использованием джойстиков;
-
отправка команд или файлов из списка файла команд;
-
отправка файлов размером до 16 МБ;
-
отправка списков команд с настраиваемыми временными интервалами;
-
автоматический расчёт настраиваемых контрольных сумм при отправке команд;
-
эмулирование ответов на запросы (до 320 запросов по 16 возможных ответов на каждый запрос, конфигурации можно сохранить и прочитать из файла);
-
режим прямой отправки кодов символов с клавиатуры в момент нажатия клавиш;
-
настройка условий для разделения строк;
-
настройка условий для очистки лога;
-
одновременный просмотр лога в HEX, DEC, CUSTOM и ASCII-режимах;
-
фильтрация сообщений перед выводом в лог;
-
захват нужных подстрок с остановкой прокрутки лога;
-
настройка условий для автоматического разворачивания окна терминала из свёрнутого состояния;
-
ведение статистики;
-
логирование событий в файл;
-
запись текстового и бинарного лога с любым расширением;
-
настройка цветов и шрифтов, возможность быстрого поиска по началу введённой команды из списка ранее отправленных;
-
вывод лога через прямой и инверсный фильтр, когда нужно выводить сообщения с заданной подстрокой или игнорировать только их;
-
контроль и индикация прекращения поступления данных в порт в течение заданного времени;
-
отправка пакетов длиной от 1 до 32 байт с перебором всех возможных комбинаций из разрешённых байтов для каждой позиции в случайном или последовательном виде;
-
настраиваемые парсеры для бинарного режима приёма с конвертированием в переменные любого типа: uint8, int8, uint16, int16, uint32, int32, uint24 и float.
-
настраиваемые парсеры для текстового режима приёма с конвертированием в переменные типа string, int32 и float;
-
вывод графика любого параметра, полученного с помощью парсеров HEX и ASCII. Вывод графика возможен в режиме плоттера и в режиме осциллографа. Данные каждого параметра буферизируются в кольцевом буфере (512 000 точек) для возможности просмотра графика любого параметра с предысторией. Для HEX-парсера имеется возможность сохранения и загрузки из файла буферизированных данных для просмотра или продолжения записи графиков.
-
параллельный вывод до 16 любых графиков параметров в режиме плоттера одновременно с возможностью синхронизации графиков по времени, прокрутки и изменения масштаба по вертикальной и горизонтальной шкале. Имеется возможность сохранения и загрузки из файла буферизированных данных для просмотра или продолжения записи графиков.
-
возможна работа одновременно до 3200 парсеров HEX и ASCII (200 списков по 16 парсеров) с выводом результата в лог и/или в файл;
-
работа с 2+16 дополнительными портами на чтение и приём;
-
возможность организации сниффера физического или виртуального COM-порта с получением лога обмена в удобном виде.
Встроенные утилиты:
-
сравнение бинарных файлов;
-
генератор случайных и последовательных чисел.
Первый запуск программы
Считаю нужным предупредить, что нормальное отображение интерфейса возможно только при коэффициенте масштабирования экрана 100%. Так уж сложилось, что в момент начала работы над этим терминалом не учёл данную настройку.
После копирования программы в пустую папку и её запуска создаются несколько пустых файлов для хранения настроек конфигурации, ранее отправленных команд и макросов, после чего открывается главное окно программы:
Настройки порта
При нажатии кнопки “Port” выполняется считывание существующих портов из реестра OC Windows, затем предлагается выбрать нужный порт для подключения. Первым в списке предлагаемых портов будет последний использованный, если такой был.
В открывшемся окне будет предложено выбрать порт и задать его настройки. Если скорость порта нестандартная, то в соответствующем окне можно вручную ввести необходимое значение. В настройках порта имеются две опции для настройки автоматического соединения. Первая нужна для случая, когда порт временно пропадает из системы и заново появляется в ней, например, при перезапуске микроконтроллера устройства или при переподключении кабеля USB. Вторая опция настройка автоматического соединения отвечает за автоматическое нажатие кнопки Connect после запуска терминала. В этой ситуации вероятна ситуация, когда терминал намертво зависнет (порт прописан в файле конфигурации, но из системы удалён вместе с переходником usb-com) и потребуется нажать три кнопки, но после данного способа выхода при повторном запуске эта опция будет отключена. Также здесь имеется возможность включить программное инвертирование каждого бита в принимаемом и отправляемом байте, например байт 0b11010000 будет представлен как 0b00101111. При включении реверсивного представления байтов происходит зеркальное преобразование: 0b11010000->0b00001011. Данные опции очень редко используются, поэтому в файле конфигурации не сохраняются.
Если настроить автоматическое соединение при каждом появлении порта в системе и включить опцию отправки команды при соединении, то можно заметно уменьшить количество лишних движений, когда в каждый из десятков приборов нужно отправить одну и ту же команду или последовательность команд из файла. Все действия сведутся только к поочерёдному подключению кабеля к каждому прибору.
Работа с логом
На данной панели имеется команда очистки окна лога, окно ввода строки фильтра и настройки реакции программы при получении пакета, содержащего в себе заданную последовательность.
Miss – не выводить сообщения, содержащих подстроку из окна фильтра;
Out – в окно лога выводятся только те пакеты, которые содержат указанную подстроку;
Capt – при появлении пакета с заданной подстрокой окно лога останавливается;
No – никакое действие не выполняется (на случай, если нужно временно отключить фильтр);
Skip Reps – пропуск повторяющихся пакетов, т.е. если новый пакет идентичен предыдущему, то он не выводится в лог.
В окне статистики работы терминала отображается значение счётчика полученных подстрок, заданных в фильтре:
Для отображения данной статистики нужно нажать соответствующую кнопку “S”:
Всё это даёт большие удобства, когда нет возможности постоянно следить за логом работы какого-либо прибора, отлавливая глазами нужное сообщение или выполняя его поиск в ранее записанном файле лога, когда уже всё пропало и прибор испустил дух.
“||” — кнопка остановки лога с последующим просмотром в отдельном окне, при этом в главном окне запись лога будет продолжаться. Для возврата в главное окно лога нужно нажать данную кнопку ещё раз (в это время на ней будет символ “>”).
Настройки программы
Start log – кнопка запуска записи лога. После её нажатия будет предложено ввести префикс названия файла, выбрать тип записываемого файла и записываемые данные: отправляемые и/или принимаемые данные для каждого записываемого файла.
Текстовый файл сохраняется в том виде, как его видно в окне лога без учёта фильтра. В бинарный файл сохраняются только те данные, которые были отправлены или получены из порта. Если задать расширение .exe, то можно таким образом принимать исполняемые файлы, которые можно затем запускать.
После завершения записи лога будет предложено открыть записанные файлы для просмотра в блокноте.
Файлы логов также можно просмотреть до остановки записи, нажав одну из соответствующих кнопок:
При нажатии данных кнопок откроется проводник для выбора файла, при этом в качестве пердвыбранного будет задано имя текущего файла.
Second Window – включение второго окна вывода лога, в котором можно указать режим вывода (ASCII, HEX, DEC или CUSTOM) и направление выводимых сообщений (TX и/или RX). Для отправляемых пакетов (TX) отображается только режим ASCII и HEX. На скрине показан пример использования дополнительного окна, когда в левом окне отфильтрованный лог, а в правом полностью весь лог отображается. В левом окне запрещено выводить сообщения, содержащие подстроку “AT+”, в правом окне настроен вывод только прочитанных сообщений и только в формате ASCII. Включена опция игнорирования фильтра, чтобы выводить полный лог. Окно настроек дополнительного окна открывается при открытии этого окна.
Add Menu – отображение дополнительных пунктов меню настройки программы и включения дополнительных режимов программы.
Log window sett. – выбор фонового цвета окна вывода лога, размера и цвета шрифта для отправляемых и принимаемых пакетов, выбор цвета фона для сигнализации прекращения поступления новых данных в порт в течение заданного времени (например, ситуация обрыва линии);
Forms color – выбор цвета главной и дочерних форм на случай, когда запущено одновременно несколько копий терминалов;
Monitor mode/Dialog mode – скрытие/отображение нижней панели программы;
Описание нижеперечисленных кнопок будет в следующих разделах руководства:
Answer emulator – режим эмулятора ответов в ответ на приходящие запросы;
Cmd list mode – режим отправки списков команд с заданными интервалами;
Fast send mode – режим прямой отправки кодов клавиатуры в порт;
Directories – настройки директорий хранения файлов, используемых программой;
Sent commands – окно отправленных в порт данных;
Packet generator – перебор комбинаций из разрешённых комбинаций в пакете нужной длины;
Parser HEX – работа с парсером в бинарном режиме приёма входящих пакетов;
Add. macros – форма со списками дополнительных макросов;
Utilites – дополнительные полезные подпрограммы;
Statistic – статистика прочитанных и отправленных байтов;
Add ports – работа с дополнительными портами на чтение;
CUSTOM Decod – таблица представления данных в логе вывода для режима чтения CUSTOM;
Line separator – настройка разделителя пакетов для отображения в логе;
Autocleaning – настройки автоочистки окна лога;
Buffer FIFO – работа с входным приёмным буфером;
Event alert – настройка отслеживаемых событий;
Event log – логирование событий и работы терминала;
ASCII table – таблица ASCII, актуальная для данной версии Windows.
Отображение лога
Имеется возможность выводить лог в текстовом, бинарном, десятичном и пользовательском режиме, а при необходимости в нескольких режимах. Режим вывода можно менять для главного и для дополнительного окна, в дополнительном окне можно одновременно выводить данные в нескольких режимах и задать опцию для отображения режима вывода каждого пакета наряду с отображением временного штампа и счётчика числа байтов. К каждому пакету можно прикреплять временной штамп со значком направления передачи, именем порта и значение счётчика числа принятых или отправленных байт. Аналогичные дополнительные данные прикрепляются к пакетам в дополнительном окне, что упрощает поиск нужного сообщения, если их нужно посмотреть одновременно в двух режимах.
Если включена запись лога в файл, то в текстовый лог всё пишется вместе с дополнительной информацией, а в бинарный записываются только отправляемые и принимаемые данные.
Режим отправки пакетов
Имеется возможность задать один из нескольких режимов отправки содержимого консольной строки в порт:
Manual – только ручная отправка по нажатию Enter (с очисткой строки), Ctrl+Enter(без очистки строки) или соответствующей кнопки отправки команды справа от окна ввода хвоста команды. Содержимое консольной строки меняется вручную или при нажатии соответствующей кнопки с макросом.
When choosing – отправка команды сразу после нажатия кнопки с соответствующим макросом, при этом содержимое консольной строки не изменяется, что позволяет без лишних движений повторно отправлять вручную содержимое консольной строки.
After answering – отправка содержимого консольной строки сразу после получения ответа на предыдущую команду или после прихода любых данных в общем случае. Содержимое консольной строки можно менять вручную или нажатием соответствующей кнопки с макросом. На частоту отправки команд влияет время, указанное в качестве разделителя строк, указываемое в дополнительном меню (Line separator).
Periodic – периодическая отправка содержимого консольной строки в порт с заданной периодичностью. Точность выдержки периодичности в пределах 10-30 мс, поэтому относительно точно период отправки будет выдерживаться при его значении больше 1000 мс. Содержимое консольной строки в данном режиме можно менять вручную или с помощью кнопок макросов.
Byte by byte – побайтная отправка содержимого консольной строки в порт. Данный режим удобно применять для отладки софта или прошивки. Каждый очередной байт пакета отправляется при нажатии Ctrl+Enter или при нажатии соответствующей кнопки.
Данные режимы отправки актуальны и при отправке команд из файла, в котором каждая команда записывается в текстовом виде с новой строки.
После выбора файла с командами можно организовать их отправку разными способами в зависимости от выбранного режима На скрине ниже показана кнопка, которая в режиме отправки команд из файла при каждом нажатии отправляет следующую команду.
В ручном режиме (Manual) содержимое консольной строки меняется при клике мышкой по соответствующей строке с командой, далее отправка выполняется любым способом вручную, но для минимизации движений при последовательной отправке команд имеется отдельная кнопка, которая при каждом нажатии отправляет в порт следующую команду из файла.
В режиме отправки при выборе (When choosing) в консоль отправляется сразу же та команда из файла, по которой кликнули мышкой.
В режиме отправки “после ответа” (After answering) в консоль отправляется следующая команда из файла после получения ответа на предыдущую, что удобно, например, когда нужно отправить сразу несколько команд, на каждую из которых обязательно нужно получить ответ. Начинать процесс отправки нужно ручной отправкой первой командой. В данном режиме можно задать циклическую отправку команд, когда все команды из файла будут отправляться по кругу бесконечно.
В режиме периодической отправки (Periodic) все команды из файла отправляются по очереди с заданным интервалом вне зависимости от получаемого ответа на предыдущую команду. Аналогично можно задать циклическую отправку в данном режиме.
Файл команд нужно обязательно завершать переходом на новую строку в конце файла.
Если задана опция “Send on connect”, то содержимое консольной строки отправляется в порт сразу после установки соединения, а дальше алгоритм отправки задаётся настройками режима отправки. Данная опция позволяет отправлять в порт при соединении не только содержимое консольной строки, но и файл команд, если он выбран и настроен нужный режим отправки. Вместе с опцией первого вида автоконнекта в настройках порта можно настроить такой алгоритм отправки, когда консольная строка или файл команд будет отправляться в прибор автоматически при подключении USB-кабеля.
Консольная строка
Пакет для отправки данных формируется из содержимого консольной строки и “хвоста сообщений”, которые склеиваются вместе перед отправкой. Для отправки консольной строки нужно нажать Enter, если нужно отправить строку с очисткой содержимого или Ctrl+Enter, если очищать не нужно. Нажатие стрелки вверх при нахождении фокуса ввода в консольной строке будет выполнена очистка окна лога. Нажатие стрелки вниз развернёт окно с историей ранее отправленных команд, начало которых совпадает с частично введённой командой. Если консольная строка пуста, то нажатие стрелки вниз отобразит все ранее отправленные из консольной строки команды (всего запоминается не более 500, повторно отправляемые команды в данный список не добавляются, а ранжируются в списке так, что в верхней строке списка будет последняя отправленная строка). Длина строки консоли не должна превышать 65000 символов для текстового режима и 205000 символов для бинарного.
“Хвост сообщений” – это та сущность, которая всегда добавляется к содержимому консольной строки. Если нужно добавить одно или несколько шестнадцатеричных чисел, то они записываются в виде $XX$YY$ZZ. Если нужно добавлять смешанные данные, то пример хвоста будет такой “text cmd$0D”, также имеется возможность вставки в хвост сообщений шаблона контрольной суммы, рассчитываемого по одному из алгоритмов, например для NMEA-сообщений шаблон будет следующий: “*[XOR_8 (1..n)]$0D$0A”
Данные в консольной строке отправляются в том виде, который задан для отображения лога: ASCII или HEX. Всё ранее написанное было справедливо для текстового режима. При отправке данных из консоли в HEX-режиме строка формируется из двоичных чисел в формате XX через пробел, например “70 77 64 20 31 32 33 34 35 3B 65 63 68 6F 20 6F 66 66 2A 37 37 0D ”, в аналогичном виде формируются строки файла команд, содержимое макросов и содержимое хвоста команд.
При формировании HEX-команды в самом конце следует добавлять пробел, если предполагается прикрепление “хвоста сообщений” (В новой версии терминала необязательно).
В хвост сообщений тоже можно добавлять один или несколько шаблонов контрольных сумм (для извращений) через пробел, например:
В логе выделена та часть отправленного сообщения, которая сформировалась из шаблона контрольной суммы и одного байта в хвосте сообщения, полученный ответ видно в режиме ASCII, как указано в настройке отображения прочитанных данных.
Макросы
В программе имеется возможность сохранения макросов, организованных в виде списков, число которых может быть не больше 100. Всего на главной форме в сумме можно хранить до 4800 макросов с их описанием.
Макросы могут отображаться в виде списков команд или списков названий макросов (жирный шрифт), соответствующий режим выбирается радиокнопками справа от названия списка. При наведении указателя мышки на активный макрос в подсказке отображается содержимое команды или имя макроса в зависимости от выбранного режима отображения. В прямоугольном поле справа может выводиться справочная информация по каждому макросу. Для удобства пользователя макросы можно редактировать. Редактирование может быть простым, когда можно поменять название и содержимое и расширенным, когда дополнительно можно редактировать справочную информацию.
Для переключения в режим простого редактирования нужно выбрать вкладку “Edit”.
В данном режиме можно менять название списка макросов их имена и содержимое, доступно перелистывание списков и переключение между режимами отображения команды и имени. Для каждого списка макросов сохраняется свой хвост сообщений и свой режим работы (ASCII или HEX). Для режима HEX команды записываются в том же виде, как в консоли для данного режима, например: “11 22 33 44 55 0F AB CD ” с обязательным добавлением пробела в конце, если предполагается прикрепление хвоста сообщений.
Для переключения в режим расширенного редактирования макроса нужно на соответствующем макросе дважды кликнуть мышкой, после чего откроется нужное окно редактора:
На главном окне в правом нижнем углу будет отображаться результат редактирования в том виде, в котором он будет виден при наведении указателя мыши на редактируемый макрос. Вместо команды к макросу можно привязать любой файл для отправки, который выбирается после нажатия кнопки “Send file…”. После выбора файла автоматически сформируется и сохранится нужная команда для отправки файла в порт. Данную команду можно редактировать вручную и использовать в других режимах работы терминала, например в режиме эмуляции ответов, когда в качестве возможного ответа нужно отправить какой-либо файл, например файл с расписанием спутников, используемый в режиме AGPS навигационных модулей. Во время отправки файла терминал может сделать вид, что завис, но это не так. После завершения отправки терминал вернётся в рабочее состояние.
Отправка файлов
Имеется возможность отправки файлов в порт по нажатию отдельной кнопки. Размер файла при этом не должен превышать 16 МБ. При отправке файла можно видеть лог отправки всегда в HEX-виде и статистику процесса в правом нижнем углу, которая отображается по нажатию кнопки отображения статистики “S” (Надпись поменяется на “H” – “Help”).
После выбора файла его содержимое копируется в буфер оперативной памяти и на это время возможно временное зависание программы, после чего начнётся процесс отправки, который можно прервать или приостановить в любой момент закрытием порта или нажатием соответствующей кнопки.
Работа с «горячими клавишами»
Данный способ отправки команд удобно использовать, когда нужно разные команды отправлять быстрыми последовательностями и быстро между ними переключаться, например, при управлении видеокамерой.
Для работы с горячими клавишами фокус ввода должен быть в главном окне лога или на кнопке отправки команды (под флажком включения режима работы с горячими кнопками).
Нажатие горячей кнопки имитирует нажатие кнопки с соответствующим макросом. Далее логика работы зависит от выбранного режима отправки команд. Здесь уместнее будет включить режим отправки по нажатию кнопки (When shoosing).
Работа с джойстиками
Каждый макрос можно привязать к коду комбинаций нажатых кнопок на джойстике (не больше двух кнопок). Каждые 20-50 миллисекунд выполняется проверка совпадения текущего состояния кнопок джойстика с заданным для каждого макроса. Если совпадение имеется, то выполняется нажатие кнопки с макросом. Нажатие можно задать однократным (Single Action) или многократным (Multipli Action), пока нажата нужная комбинация кнопок на джойстике. Режим отправки команд следует выбрать «Отправлять по нажатию». Для настройки нужной комбинации нужно по двойному клику открыть окно настройки джойстика для соответствующего макроса, указать номер джойстика, нажать нужные кнопки на джойстике и, не отпуская их, нажать мышкой кнопку «Update key», после чего кнопки на джойстике можно будет отпустить. Работа с джойстиком удобна при работе с видеокамерой.
Теперь вернёмся к описанию дополнительных режимов работы и настройкам терминала, доступных по нажатию кнопки “Add menu”.
Режим эмулятора ответов (Answer emulator)
В данном режиме можно настраивать списки ответов, возвращаемых в порт после получения целого запроса или его части, начало которого совпадает с одним из заданных в списке входящих пакетов. Для активации данного режима нужно нажать нижнюю правую кнопку со значком “>”. В процессе работы можно на ходу делать активными шаблоны входящих запросов и варианты ответов на них установкой галочки в соответствующем чекбоксе. На скрине показан пример настройки режима автоматической отправки ответов на запросы с использованием только текущего списка запросов. В автоматическом режиме в ответ на запросы будут автоматически отправляться в случайном порядке один из активных ответов именно для конкретного запроса. Для каждого запроса можно задать до 16 возможных ответов. Если число возможных запросов не помещаются в списке, то можно задействовать все списки, установив соответствующий режим. Ответы могут отправляться в текстовом или в бинарном виде, что выбирается соотвествующими радиокнопками слева от каждого возможного ответа. Правило записи бинарных последовательностей такое же, как и для консольной строки, т.е. в виде “XX YY ZZ ” с обязательным наличием пробела в конце строки, если предполагается использование хвоста сообщений. Хвост сообщений для данного режима задаётся в соответствующих окнах отдельно для каждого возможного ответа. По нажатию стрелки вниз в окне редактирования хвоста сообщений открывается список шаблонов контрольных сумм, а далее алгоритм формирования такой же, как и при работе с консольной строкой.
Внизу окна находятся кнопки редактирования списков и изменения пропорции ширины окон редактирования запросов и ответов. Данный режим можно применять для эмулирования ответов датчиков, возвращающих данные по запросу. Не составит большого труда составить нужный алгоритм работы с GSM-модулем, если задать ответы-команды на каждое синхронное или асинхронное сообщение данного модуля. Ещё одно применение данного режима можно найти при тестировании софта, который должен работать с каким-либо устройством по последовательному порту. В данном случае следует применить пару виртуальных портов com0com, к одному из которых следует подключить тестируемую программу верхнего уровня, а ко второму данный терминал и задействовать этот режим. Ничто не мешает отвечать программе верхнего уровня вручную или с помощью макросов, но в реальном времени это часто бывает сложно делать из-за необходимости быстро отвечать на запросы и вот тут будет очень удобно применять этот режим. Для каждого устройства или программы можно сохранять и загружать свою конфигурацию запросов и ответов. Также в данном режиме вместо отправляемых пакетов можно указывать отправляемые файлы в формате, который формируется при настройке макросов. В качестве ответа на запрос можно настроить отправку файла. Для выбора отправляемого файла нужно дважды кликнуть по строке эмулируемого ответа.
Режим списка команд (Cmd list mode)
Иногда требуется отправлять последовательно несколько команд с разными интервалами времени. Данный режим доступен в терминале по нажатию соответствующей кнопки в дополнительном меню.
В данном режиме можно формировать список отправляемых команд, после отправки каждой из которых нужно выдержать заданную паузу. Последняя отправленная команда подсвечивается зелёным цветом. Отправка может выполняться вручную или автоматически. В обоих режимах доступными для отправки будут только активные команды. Команды можно редактировать непосредственно в строке или в отдельном окне по двойному клику мыши. Пока ещё несохранённая команда выделяется жирным шрифтом. В отдельном окне редактирования можно также написать краткую справку к каждой команде. Список команд можно отправлять однократно или циклически. Также можно задать диапазон страниц с командами для автоматической отправки, если команд больше 32. Режим отправки данных (HEX, ASCII или DEC) задаётся отдельно для каждого списка команд. Правила формирования сообщений и хвостов такие же, как и для консольной строки. Данный режим можно применять для отправки асинхронных сообщений в порт совместно с другими режимами работы терминала. Также в данном режиме вместо отправляемых пакетов можно указывать отправляемые файлы в формате, который формируется при настройке макросов.
Режим быстрой отправки команд (Fast send mode)
Данный режим позволяет отправлять печатаемые символы в порт сразу после нажатия.
Окно просмотра ранее отправленных команд (Sent commands)
В данном окне отображаются все ранее отправленные команды и опционально их режим отправки ([H] – HEX, [A] – ASCII, [D] – DEC). Данное окно очищается автоматически и/или вручную при нажатии соответствующей кнопки.
Бывают ситуации, когда главное окно терминала закрывает окно дополнительного режима или окно дополнительного режима не разворачивается. В этом случае в дополнительном меню главного окна нужно повторно нажать на соответствующую кнопку.
Настройки директорий (Directories)
Для устранения неудобств при поиске нужных файлов имеется возможность настроить нужные пути к файлам разных типов, но будет удобнее хранить их все в одной директории.
Если пути к файлам не заданы, то они будут храниться в директории с программой.
Следующие настройки не открываются в отдельных окнах:
По нажатию каждой из кнопок открывается соответствующая панель с настройками. Для простоты и удобства повествования все эти панели показаны на одном скрине.
Здесь имеются следующие возможности:
-
настроить условия разделения пакетов (переход на новую строку) для вывода следующего в новой строке лога (данная настройка особенно актуальна при работе с парсером HEX-пакетов);
-
настроить условие автоочистки окна лога;
-
сбросить входной буфер, если нет желания томительно ожидать, пока он весь выгрузится в окно лога, также можно настроить условия для автоматического сброса входного буфера;
-
настроить условия регистрации определённых событий и задать возможность автоматического разворачивания окна терминала при наступлении заданного события, что удобно, когда нужно посидеть за чаем в интернетах, но ещё нужнее в это время отслеживать появление нужного сообщения или ситуации в логе;
-
включить/выключить опцию записи лога событий и просмотреть этот самый журнал с помощью блокнота.
Перебор комбинаций пакетов (Packet generator)
Данный режим предназначен для формирования пакетов заданной длины перебором всех возможных комбинаций выбранных байтов для каждой позиции. Имеются два режима перебора: последовательный и случайный. В режиме случайного перебора на каждую позицию каждого нового пакета выставляется случайный байт из разрешённых для данной позиции.
Это удобно на случай подбора контрольной суммы или пароля, для тестирования реакции прибора на получение различных комбинаций входящих данных. На скрине ниже показан результат работы переборщика в последовательном и случайном режиме.
Пример 1: нужно подобрать контрольную сумму для последовательности 11 22 33 44 55 XX
Первый байт указываем 0x11, второй байт 0x22, третий 0x33, четвёртый 0x44, пятый 0x55, а в шестом байте указываем все 256 позиций и запускаем отправку, предварительно задав интервал отправки.
Пример 2: известно, что пароль отправляется в формате «pwd XXXX\r», где X — число от 0 до 9. В этом случае указываем 1-4 байты как «p», «w», «d», » «, затем для каждого из 5-8 байтов выбираем числа от «0» до «9», 9 байт будет 0x0D, затем нажимаем на запуск отправки и любуемся тем, как программа перебирает комбинации. Для приёма входящих ответов можно настроить соответствующие события в меню «Event alert» или в настройках фильтра.
Имеется возможность выбора пределов длины пакета. Длина отправляемого пакета варьируется в пределах указанного диапазона с использованием генератора случайных чисел. Если длина сформированного пакета больше максимальной длины, то отбрасываются байты справа. Если длина меньше минимальной, то количество байт задаётся настройками количеством позиций отправляемых байтов в пакете. Если задать максимальную и минимальную длину 32 байта, то данная настройка никак не повлияет на работу генератора комбинаций пакетов.
Работа с парсером HEX-пакетов (Parser HEX)
Парсер позволяет фильтровать и выделять одновременно до 16 параметров из входящих пакетов в HEX-виде. При настройке парсера следует указать порт источника. Если используется главный порт, то в качестве источника следует указать Port MAIN. Для фильрации указываются сравниваемые байты в позиции от 0 до 15. Если сравниваемый байт не указан, то в данной позиции может быть любой байт. Далее нужно указать тип переменной параметра и указать номера байтов, из которых будет складываться нужный параметр. Нумерация байтов начинается с нуля. Длина входящего пакета может быть любая, но фильтрация будет выполняться по указанным байтам. Всего можно настроить до 200 списков парсеров по 16 параметров. При желании их переключение можно синхронизировать с переключением списков макросов установкой соответствующего флажка (первые 100 списков).
Примеры:
1. Нужно фильтровать пакеты, начинающиеся на 3E и байты 2,3,4,5 конвертировать в переменную типа float.
Для этого указываем условие совпадения первого байта пакета с числом 3E, длина пакета произвольная или фиксированная (тоже критерий фильтрации), тип переменной — float, далее указываем используемые байты 2,3,4,5 (позиция начинается с нуля). Жмём OK и первый параметр отображается.
2. Нужно фильтровать пакеты фиксированной длины, начинающихся с байтов 11 22 и третий байт выводить в виде переменной типа int8.
Аналогично указываем условие совпадения первых двух байтов , указываем тип переменной int8_t и её позицию 2 (позиция начинается с нуля).
3. Нужно подключиться к линии RS485 и парсить пакеты в режиме монитора. Есть датчик топлива, у которого все запросы начинаются на 0x31, а ответы имеют структуру: 0x3E ADDR CMD TEMP[1] FREQ[2] LEVEL[2] CRC. Т.е. известна длина пакета, первые три байта, тип и расположение параметров в пакете. Для разбора нужных пакетов сначала нужно настроить переход на новую строку по условиям : переход перед байтом 0x31 и переход перед байтом 0x3E. Затем в парсере настроить выделение трёх параметров. Общим для каждого параметра будет фильтр по первым трём байтам и длине пакета в 10 байт. Далее для каждого параметра указываем свои настройки. Для температуры это будет тип переменной int8_t и позиция байта 3. Для частоты и уровня тип переменных будет uint16_t и позиции 4,5 и 6,7 соответственно. Возможно, придётся поменять позиции местами.
Парсер не срабатывает в случаях:
1. В качестве источника данных указан не тот порт или в настройках дополнительного порта в качестве приёмника не указан парсер;
2. Входящий пакет не соответствует критериям фильтрации;
3. Позиция одного из извлекаемого из пакета байтов выходит за границы длины пакета;
4. Приём данных ведётся в режиме ASCII.
Перед использованием парсера нужно сначала настроить критерий перехода на новую строку, если терминал используется в качестве монитора линии передачи данных.
Если прибор опрашивается самим терминалом, то критерии перехода на новую строку и настройки парсера упрощаются.
В настройках парсера можно указать границы и пороги значений для изменения подсветки параметра в списке и для отображения цветовых зон в области вывода графика в окне графопостроителя. Также можно включить автоматическое разворачивание окна терминала, если значение параметра попало в один из указанных диапазонов.
Парсер отслеживает минимальное и максимальное значение каждого параметра. Для отображения данной пары значений нужно кликнуть мышкой в области значения соответствующего параметра. Имеется возможность сброса данной пары значений.
На форме списка парсеров имеются кнопки для открытия окна редактирования, копирования, вставки, удаления конкретного парсера, кнопки открытия окна графопостроителя или окна гистограммы для любого параметра. Данные каждого парсера записываются в свой отдельный буфер с целью вывода графика. Всего буферов 16 по 512000 точек. Буферизация данных возможна только для одного списка парсеров. Данный список указывается радиокнопкой “Use graphis buffers for this parser”. При переключении на другой список парсеров буферизация для выбранного списка не прерывается. Для очистки буфера следует предварительно кликнуть по соответствующей радиокнопке, чтобы активировать кнопку очистки соответствующего буфера. Данное усложнение исключает возможность случайного удаления данных. Имеется возможность сохранения в файл всех настроек списка парсера со всеми буферизированными данными. Данный файл можно будет загрузить обратно с целью просмотра графиков данных и/или продолжения записи данных. Для этого нужно предварительно отключить буферизацию, сняв галочку в чекбоксе “Write plotter data to buffers”, при этом активируются две кнопки справа для загрузки и сохранения списка парсеров с буферизированными данными в файл. Также имеется возможность вести запись лога парсера. При необходимости в лог можно записывать только те строки, в которых имеется выход какого-либо параметра в заданную зону (запись события). Для этого нужно установить галку в чекбоксе “Log only events”
В любой момент времени может работать может только активный список парсеров, список с включенной буферизацией данных и списки, в которых включен вывод данных в окна лога. Если какие-то данные в лог выводить не нужно, то в данных списках парсеров нужно снять галки вывода данных в лог, т.к. это дополнительная нагрузка на процессор. Для сброса настройки вывода результатов в лог сразу для всех списков имеется кнопка “Reset ALL”, для приостановки/возобновления вывода в лог имеется соответствующая кнопка слева от кнопки сброса.
Для возможности просмотра результата работы парсера имеется соответствующее окно вывода лога работы парсера. Размер шрифта данного окна лога задаётся одновременно с
размером шрифта в главном окне вывода лога.
Также лог работы парсера можно выводить в главное и дополнительное окно вывода лога на главной форме.
Графопостроитель
На основе полученных парсером значений параметра можно построить график его изменения. Для отображения графика параметра нужно нажать кнопку “Graph” напротив соответствующего параметра в списке парсеров. На форме вывода графика можно задавать верхний и нижний предел шкалы по вертикали. По горизонтали каждая следующая позиция привязана к каждому входящему пакету.
На форме графопостроителя можно просматривать данные в режиме осциллографа и плоттера. Режим осциллографа доступен в том случае, если для соответствующего списка парсеров включена буферизация данных. В данном режиме график параметра передвигается в левую сторону при каждом получении новых данных, также имеется возможность просмотра ранее буферизированных данных. Имеется возможность запоминать нужную позицию графика кликом мышки по интересующему месту. Время интересующей позиции запоминается и отображается на соответствующей кнопке внизу. Затем можно перейти к графику другого параметра и нажатием кнопки с зафиксированным моментом времени переместить график на нужную позицию. Аналогично можно сделать и перед изменением масштаба. Например, если нужно найти интересное место на графике, то можно его сжать по горизонтали, кликнуть на интересующее место графика, затем растянуть график по горизонтали и нажать на кнопку перемещения в нужную позицию. Это избавляет от необходимости ручной прокрутки графика, которая может занимать много времени.
В режиме плоттера отрисовка графика выполняется слева направо с последующей перерисовкой при достижении правого края окна вывода графика. Данный режим имеет максимальное быстродействие ввиду отсутствия необходимости перерисовки всего графика при получении очередного значения параметра.
Далее на скрине показана форма графопостроителя со всеми настройками и кнопками управления. Размеры формы можно менять вручную с помощью мыши.
Если нажата кнопка паузы вывода графика, то буферизация данных будет продолжаться, если она не приостановлена снятием соответствующей галки буферизации данных.
В этом случае форма графопостроителя будет оранжевого цвета. В режиме осциллографа после приостановки можно прокручивать график влево и вправо. При наведении курсора в определённое место графика в правом верхнем углу на зелёном фоне будет отображаться время и значение для той точки, на которой находится указатель мыши в данный момент.
Если в процессе просмотра графика в режиме осциллографа параметр вышел за границы окна вывода или весь график по вертикали уменьшился до размеров в несколько пикселей, то следует переустановить галку “Autosize”. Возможно, это нужно будет сделать несколько раз.
При открытии окна “Chart” в реальном времени выводится гистограмма распределения значений параметра.
В данном окне можно менять границы и шаг гистограммы. Можно сбрасывать текущую гистограмму, но при передвижении или при изменении масштаба будет выполнен пересчёт на основе всех ранее буферизированных данных, если буферизация включена. Если интересно сбросить текущую гистограмму, то нужно предварительно установить нужную позицию и масштаб по горизонтали, сбросить гистограмму и больше не менять смещение и масштаб по горизонтали. Столбец с последним значением параметра подсвечивается зелёным цветом. Если значение параметра не попадает в текущее окно, то в верхней части значение параметра отображается на жёлтом фоне. Настройки гистограммы сохраняются в файле конфигурации. Имеется возможность для ручного изменения масштабы гистограммы по вертикали. Для этого нужно снять галочку автоматического расчёта высоты в левом верхнем углу формы. Справа появится ползунок масштабирования по вертикали. Это нужно в тех случаях, когда нужно посмотреть столбцы с высотой меньше одного пикселя.
При нажатии на кнопку Multigraph открывается окно для вывода до четырёх графиков одновременно.
На данной форме можно выбирать параметры для вывода графика, настраивать масштаб и смещение каждого графика по вертикали и горизонтали. Имеется настройка масштаба по горизонтали для всех графиков одновременно. Графики выводятся только в режиме графопостроителя.
Дополнительные макросы (Add. macros)
Данная форма дополняет список макросов главной формы программы. Режим отправки макросов задаётся также на главной форме.
Statistic – форма, отображающая значения счётчиков каждого принятого и отправленного байта. Данное наглядное представление статистики удобно для обнаружения каких-либо закономерностей и тестирования. Доступна статистика для каждого порта.
Форма для работы с дополнительными портами (Add ports)
Терминал может работать с двумя дополнительными портами только для чтения. На форме имеются два идентичных окна для настройки работы с двумя портами. Для каждого порта можно настроить:
-
отображение данных в логе (порт, время, счётчик, направление и режим HEX / ASCII / DEC / CUSTOM);
-
условия разделения пакетов для перехода на новую строку;
-
приёмники данных порта (главный и дополнительный лог, парсер, второй дополнительный порт, текстовый и бинарный файл);
-
действия при приёме нужных пакетов.
Для каждого порта имеется возможность открыть отдельный лог для просмотра отправленных и принятых пакетов.
На форме можно указать режим быстрого чтения порта, но при этом будет максимальная нагрузка на процессор, т.к. в этом случае поток будет работать без пауз для переключения на другие потоки. Если в процессоре несколько логических ядер, то данный режим не загрузит процессор на 100%. Быстрый режим позволяет считывать данные порта в реальном времени, в логе время будет отображаться с точностью 1 мс.
Возможность отправки данных в парсер позволяет мониторить одновременно работу двух приборов. При этом в настройках парсера в качестве источника данных следует указать Port1 и Port2.
Имеется возможность вести запись в текстовый и бинарный файл с возможностью перезаписи или дополнения файла, что выбирается при установке соответствующей галки.
Отправка данных в другой порт позволяет осуществить связь между двумя приборами, у которых отличается скорость порта. Также данная возможность позволит организовать сниффер порта для ведения записи лога принимаемых и отправляемых пакетов.
Логирование в режиме сниффера можно организовать двумя способами:
-
мониторинг линий TX и RX физического порта, подключив линии RX каждого порта к линиям TX и RX интересующего нас прибора;
-
мониторинг виртуального порта с использованием виртуальной пары com0com.
В первом случае желательно работать с TTL-уровнями UART, а во втором случае нужно сделать настройки как на скрине:
Здесь важно правильно настроить разделитель линий. Если протокол неизвестен, то можно настроить вот так:
Пакеты в логе могут быть рваными, но на обмен это не повлияет. По пакетам можно будет сориентироваться и задать правильные настройки.
Также сниффер можно организовать с помощью отдельного окна лога каждого порта, имеется также возможность записи лога в файл и копирование видимого лога в буфер обмена без потери данных о цвете строк. (Можно вставить в документ Word или WordPad).
При нажатии на кнопку CUSTOM Decod. открывается окно настройки режима отображения данных для соответствующего режима чтения:
Данный режим позволяет настроить способ отображения входящих данных для каждого байта. В частности, на нижнем скрине показано, как настроить запрет вывода некоторых непечатаемых символов в окно лога при чтении данных из порта. Также имеются 4 предустановленных и 32 изменяемых таблицы декодирования. Для выбора, например, двоичного режима вывода нужно нажать на кнопку “BIN” и затем “Save as CUSTOM”.
Утилиты (Utilites)
На данной форме имеется генератор чисел и утилита побайтного сравнения файлов.
На скринах показан пример генерации таблицы случайных чисел и пример сравнения двух файлов. Отличающиеся байты подсвечиваются красным фоном. Максимальный размер сравниваемых файлов 8МБ.
При нажатии на кнопку ASCII открывается окно с соответствующей таблицей:
Таблица формируется программным способом, поэтому для каждой версии Windows может отличаться от представленной на рисунке.
Данный терминал можно скачать по ссылке . Пароль архива 1111.
На 16.04.2024 Актуальная версия TerminalTMB v5.153b
UPD 24/04/24:
Добавлена форма с возможностью одновременного получения данных, вывода их в главное/дополнительное окно лога, в отдельные окна лога для каждого порта, передавать в парсер, записывать в текстовый и/или бинарный файл.
Для каждого порта можно задать цвет лога, настроить условия разделения линий и способ отображения данных в логе (ASCII, HEX, DEC или CUSTOM).
Соответственно, в настройках парсера дополнен список источников данных
Скачать можно по ссылке.
На 24.04.2024 актуальная версия TerminalTMB v6.020b
UPD 29/04/2024
Добавлена возможность отправки данных из консоли во все открытые дополнительные порты одновременно или выборочно.
Добавлена возможность переотправки получаемых данных в другие дополнительные порты
Данная возможность удобна в том случае, когда получаемые данные с одного порта нужно переотправить сразу на несколько других портов. Это удобно в том случае, когда используется данные приходят по эмулятору порта и их нужно отправить нескольким устройствам, но соответствующего хаба нет. Также применительно к данному терминалу появляется возможность вывода одновременно нескольких графиков параметров в режиме осциллографа, если задействовать в построении пути данных виртуальные пары com0com.
На 29/04/2024 актуальная версия TerminalTMB v6.030b, скачать можно здесь. Пароль архива 1111
UPD 24/05/2024
В эмуляторе ответов добавлена возможность формирования паузы перед отправкой эмулируемого ответа
Добавлена опциональная возможность отображения даты во временном штампе. Настройка применяется ко всем логам для всех портов и для парсера.
Для дополнительных портов 1 и 2 добавлена возможность настройки вывода нужных данных, что позволяет, например, в режиме сниффера вывести в разных окнах отдельно запросы и ответы.
На 21/06/2024 актуальная версия терминала TerminalTMB v6.046b, скачать можно на Яндекс-диске
UPD 24/06/2024
Добавлена возможность отключения отображения непечатаемых символов для режима ASCII. Т.е. при необходимости можно выключить, например, отображение «[$0D][$0A]» в конце строк как для отправляемых, так и для принимаемых пакетов.
На 24/06/2024 актуальная версия терминала TerminalTMB v6.047b, скачать можно на Яндекс-диске
UPD 10/07/2024Добавлена настройка автоматического сохранения положения формы в момент закрытия программы.
В эмуляторе ответов добавлена возможность работы с шаблонами, чтобы не плодить схожие варианты ответов, отличающихся незначительно.
На 10/07/2024 актуальная версия терминала TerminalTMB v6.065b, скачать можно на Яндекс-диске
UPD 11/07/2024
В эмуляторе ответов добавлена возможность вставки непечатаемых символов в ASCII-строки с помощью шаблонов. В частности, таким способом можно формировать многострочные ответы. Пример формирования такого ответа показан на скрине
Для ответов в режиме HEX можно аналогично использовать шаблоны, если нужно делать подмену каких-либо байтов. Соответственно, будет пересчитана контрольная сумма, если она используется. Здесь следует не забывать ставить пробелы с двух сторон шаблонов, чтобы подменяемые байты правильно вставились в пакет.
На 11/07/2024 актуальная версия терминала TerminalTMB v6.067b, скачать можно на Яндекс-диске
UPD 19/07/2024
— добавлена форма и алгоритм для подсчёта числа пакетов, содержащих указанные подстроки.
Это удобно, если нужно отслеживать и вести подсчёт пакетов в логе с нужными подстроками. Данный алгоритм работает для всех режимов чтения данных: ASCII, HEX, DEC и CUSTOM.
На 19/07/2024 актуальная версия терминала TerminalTMB v6.075b, скачать можно на Яндекс-диске
UPD 24/07/2024
— добавлена дополнительная проверка файлов конфигурации при старте, чтобы уменьшить вероятность возникновения данной ситуации:
— добавлена возможность вывода в отдельный лог и/или файл результата фильтрации лога:
На 24/07/2024 актуальная версия терминала TerminalTMB v6.085b, скачать можно на Яндекс-диске
На 02/08/2024 актуальная версия терминала TerminalTMB v6.096b, скачать можно на Яндекс-диске, также дополнил руководство до актуальной версии и тоже добавил на диск.
UPD 14/08/2024
Версия TerminalTMB 7.027b
— на форме счётчика пакетов добавлена возможность выбора источника данных (TX и/или RX), до этого была возможность анализировать только входящие пакеты на предмет совпадения подстрок.
Данная возможность позволяет вести статистику запросов и ответов.
Версия 7.027b
— на форме счётчика пакетов добавлена возможность выбора источника данных (TX и/или RX), до этого была возможность анализировать только входящие пакеты на предмет совпадения подстрок.
Данная возможность позволяет вести статистику запросов и ответов.
— добавлена возможность парсить ASCII-логи
Иногда появляется необходимость автоматизировать обработку текстового лога, например, лога NMEA-сообщений GPS-модуля или какого-нибудь CAN-лога.
Новый функционал аналогичен функционалу HEX-парсера, отличия только в настройках парсеров.
В настройках парсера нужно задать:
— Начало строки для захвата нужной строки по соответствующему совпадению. Если начало строки не указано, то парсер будет разбирать все входящие строки.
— Наличие подстроки внутри строки и по совместительству данная подстрока будет считаться нулевым элементом при разборе. Актуально в случае, если нужная подстрока может оказаться в любом месте строки.
— Разделители элементов строки;
— Порядковый номер искомой подстроки;
— Тип переменной, в которую будет конвертирована найденная подстрока.
На форме настройки парсера есть окно ввода тестовой строки для проверки результата. На следующем скрине показан пример настройки парсера для выделения координаты из NMEA-строки. Конвертирование в тип float будет выполнено после выделения нужного элемента парсером, а в данном окне настраиваются только условия для выделения нужной подстроки.
На 14/08/2024 актуальная версия терминала TerminalTMB v7.027b, скачать можно на Яндекс-диске, руководство пока не дополнял по части ASCII-парсера, т.к. возможны изменения в алгоритмах и интерфейсе.
UPD 17/02/2024
Добавлена кнопка выбора предустановленного набора настроек. Если изначально можно было перелистывать только списки макросов, то со временем к спискам макросов добавились дополнительные настройки и потребовалось уже список наборов настроек отделить от списков макросов и вынести отдельно, назвав всё это списком терминалов.
Перекомпанованы визуальные элементы на форме парсера и графопостроителя, добавлена возможность включения синхронизации графиков параметров по времени, что актуально, если пакеты с нужными данными приходят не одновременно, с разной периодичностью или из разных портов, а затем нужно просмотреть графики параметров, совмещённые по времени на форме мультиграфа.
На форме мультиграфа добавлены кнопки прокрутки графиков влево/вправо и кнопка установки начальной позиции буфера на то место, где она была в момент открытия формы. Также на графике синей синусодиды показан момент пропуска нескольких пакетов подряд и в этом случае для синхронизации временных меток используется последнее полученное значение до момента, когда параметр обновится.
Также добавлено много дополнительной информации и возможностей на форме построения одного графика:
-
добавлена возможность отображения горизонтальных линий и соответствующей вертикальной шкалы;
-
добавлена возможность измерения разницы между двумя значениями по вертикали с помощью двух линий уровня. Для фиксации первой линии уровня (красная) нужно нажать кнопку «M», после чего при перемещении того же самого ползунка автоматически будет пересчитываться изменение уровня относительно зафиксированной линии уровня. Для отключения фиксированной линии уровня нужно повторно нажать кнопку «M».
-
добавлена возможность более удобного изменения масштаба и смещения по вертикали с помощью соответствующих кнопок слева;
-
добавлена возможность помещения самой левой точки видимого графика ровно по центру вертикальной шкалы, что позволит более удобно применять зум по вертикали и при этом график не будет уползать вверх или вниз;
-
по двойному клику в нужной области графика можно посмотреть время и значение. Данная точка графика будет отмечена синей вертикальной линией.
В настройках парсеров добавлена возможность настройки цвета параметра на случай, если нужно отслеживать изменение параметра, а не его нахождение в заданном интервале.
На 17/02/2025 актуальная версия терминала TerminalTMB v7.102b, скачать можно на Яндекс-диске, руководство пока не дополнял, т.к. возможны изменения в алгоритмах и интерфейсе.
UPD 22/02/2025
-
Доработано окно мультиграфа для возможности вывода одновременно до 16 графиков параметров с возможностью прокрутки.
Имеется возможность сохранения и загрузки из файла буферизированных данных для просмотра или продолжения записи графиков. Также можно использовать ранее сохранённые данные в файлах *.tmb для просмотра графиков параметров.
На 22/02/2025 актуальная версия терминала TerminalTMB v7.108b, скачать можно на Яндекс-диске, руководство пока не дополнял, т.к. возможны изменения в алгоритмах и интерфейсе.
COM-порт в Windows (программирование)
Написать программу, управляющую устройством через COM-порт, для MS-DOS не так сложно.
С платформой Win32 дело обстоит сложнее. Но только на первый взгляд. Конечно напрямую работать с регистрами портов нельзя, Windows это не позволяет, зато можно не обращать внимания на тонкости различных реализаций (i8251, 16450, 16550A) и не возиться с обработкой прерываний.
С последовательными и параллельными портами в Win32 работают как с файлами. Для открытия порта используется функция CreateFile
. Эта функция предоставляется Win32 API. Ее прототип выглядит так:
HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );
Указатель на строку с именем открываемого или создаваемого файла. Формат этой строки может быть очень «хитрым». В частности можно указывать сетевые имена для доступа к файлам на других компьютерах. Можно открывать логические разделы или физические диски и работать в обход файловой системы.
Последовательные порты имеют имена «COM1», «COM2», «COM3», «COM4», «COM5», «COM6», «COM7», «COM8», «COM9». Для доступа к портам, чей номер больше 9, необходимо указывать имя порта как «\\.\COMx», где x — номер порта. Например, «\\.\COM72» (в нотации языка C/C++ строка будет выглядеть «\\\\.\\COM72»). Такой синтаксис подходит для любого номера порта. Точно так же они назывались в MS-DOS. Параллельные порты называются «LPT1», «LPT2» и так далее.
Задает тип доступа к файлу. Возможно использование следующих значений:
0
Опрос атрибутов устройства без получения доступа к нему.GENERIC_READ
Файл будет считываться.GENERIC_WRITE
Файл будет записываться.GENERIC_READ|GENERIC_WRITE
Файл будет и считываться и записываться.
Задает параметры совместного доступа к файлу. Коммуникационные порты нельзя делать разделяемыми, поэтому данный параметр должен быть равен 0.
Задает атрибуты защиты файла. Поддерживается только в Windows NT. Однако при работе с портами должен в любом случае равняться NULL
.
Управляет режимами автосоздания, автоусечения файла и им подобными. Для коммуникационных портов всегда должно задаваться OPEN_EXISTING
.
Задает атрибуты создаваемого файла. Также управляет различными режимами обработки. При работе с портом этот параметр должен быть или равным 0
, или FILE_FLAG_OVERLAPPED
. Нулевое значение используется при синхронной работе с портом, а FILE_FLAG_OVERLAPPED
при асинхронной, или, другими словами, при фоновой обработке ввода/вывода. Подробнее про асинхронный ввод/вывод я расскажу позже.
Задает описатель файла-шаблона. При работе с портами всегда должен быть равен NULL
.
При успешном открытии файла, в данном случае порта, функция возвращает дескриптор (HANDLE
) файла. При ошибке [[|INVALID HANDLE VALUE
]]. Код ошибки можно получитить вызвав функцию [[|GetLastError
]].
Открытый порт должен быть закрыт перед завершением работы программы. В Win32 закрытие объекта по его дескриптору выполняет функция CloseHandle
:
BOOL CloseHandle( HANDLE hObject );
При успешном завершении функция возвращает не нулевое значение, при ошибке нуль.
Пример открытия/закрытия на языке C
[править]
#include <windows.h> //. . . HANDLE Port; //. . . Port = CreateFile(L"\\\\.\\COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (Port == INVALID_HANDLE_VALUE) { MessageBox(NULL, "Невозможно открыть последовательный порт", "Error", MB_OK); ExitProcess(1); } //. . . CloseHandle(Port); //. . .
В данном примере открывается порт СОМ2
для чтения и записи, используется синхронный режим обмена. Проверяется успешность открытия порта, при ошибке выводится сообщение и программа завершается. Если порт открыт успешно, то он закрывается.
Основные параметры последовательного порта описываются структурой DCB
. Временные параметры — структурой COMMTIMEOUTS
. Существует еще несколько информационных и управляющих структур, но они используются реже. Настройка порта заключается в заполнении управляющих структур и последующем вызове функций настройки.
Основную информацию содержит структура DCB
:
typedef struct _DCB { DWORD DCBlength; // sizeof(DCB) DWORD BaudRate; // current baud rate DWORD fBinary:1; // binary mode, no EOF check DWORD fParity:1; // enable parity checking DWORD fOutxCtsFlow:1; // CTS output flow control DWORD fOutxDsrFlow:1; // DSR output flow control DWORD fDtrControl:2; // DTR flow control type DWORD fDsrSensitivity:1; // DSR sensitivity DWORD fTXContinueOnXoff:1; // XOFF continues Tx DWORD fOutX:1; // XON/XOFF out flow control DWORD fInX:1; // XON/XOFF in flow control DWORD fErrorChar:1; // enable error replacement DWORD fNull:1; // enable null stripping DWORD fRtsControl:2; // RTS flow control DWORD fAbortOnError:1; // abort reads/writes on error DWORD fDummy2:17; // reserved WORD wReserved; // not currently used WORD XonLim; // transmit XON threshold WORD XoffLim; // transmit XOFF threshold BYTE ByteSize; // number of bits/byte, 4-8 BYTE Parity; // 0-4=no,odd,even,mark,space BYTE StopBits; // 0,1,2 = 1, 1.5, 2 char XonChar; // Tx and Rx XON character char XoffChar; // Tx and Rx XOFF character char ErrorChar; // error replacement character char EofChar; // end of input character char EvtChar; // received event character WORD wReserved1; // reserved; do not use } DCB;
Эта структура содержит почти всю управляющую информацию, которая в реальности располагается в различных регистрах последовательного порта.
Задает длину, в байтах, структуры DCB
. Используется для контроля корректности структуры при передаче ее адреса в функции настройки порта.
Скорость передачи данных. Возможно указание следующих констант: CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600, CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600, CBR_115200, CBR_128000, CBR_256000
. Эти константы соответствуют всем стандартным скоростям обмена. На самом деле, это поле содержит числовое значение скорости передачи, а константы просто являются символическими именами. Поэтому можно указывать, например, и CBR_9600
, и просто 9600
. Однако рекомендуется указывать символические константы, поскольку при компиляции программы проверяется корректность их имен.
Включает двоичный режим обмена. Win32 не поддерживает недвоичный режим, поэтому данное поле всегда должно быть равно 1
, или логической константе TRUE
(что предпочтительней). В Windows 3.1, если это поле было равно FALSE
, включался текстовый режим обмена. В этом режиме поступивший на вход порта символ, заданный полем EofChar
, свидетельствовал о конце принимаемых данных.
Включает режим контроля четности. Если это поле равно TRUE
, то выполняется проверка четности, при ошибке, в вызывающую программу, выдается соответствующий код завершения.
Включает режим слежения за сигналом [[|CTS
]]. Если это поле равно [[|TRUE
]] и сигнал [[|CTS
]] сброшен, передача данных приостанавливается до установки сигнала CTS
. Это позволяет подключеному к компьютеру прибору приостановить поток передаваемой в него информации, если он не успевает ее обрабатывать.
Включает режим слежения за сигналом [[|DSR
]]. Если это поле равно TRUE
и сигнал DSR
сброшен, передача данных прекращается до установки сигнала DSR
.
Задает режим управления обменом для сигнала [[|DTR
]]. Поле может принимать следующие значения:
- DTR_CONTROL_DISABLE Сигнал DTR снимается при открытии порта. У открытого порта может быть изменён функцией EscapeCommFunction.
- DTR_CONTROL_ENABLE Сигнал DTR устанавливается при открытии порта. У открытого порта может быть изменён функцией EscapeCommFunction.
- DTR_CONTROL_HANDSHAKE Сигнал DTR автоматически устанавливается/снимается в ходе работы с портом. Не может быть изменён функцией EscapeCommFunction.
Задает чувствительсть коммуникационного драйвера к состоянию линии [[|DSR
]]. Если это поле равно TRUE
, то все принимаемые данные игнорируются драйвером (коммуникационный драйвер расположен в операционной системе), за исключением тех, которые принимаются при установленом сигнале DSR
.
Задает, прекращается ли передача при переполнении приемного буфера и передаче драйвером символа XoffChar
. Если это поле равно TRUE
, то передача продолжается, несмотря на то, что приемный буфер содержит более XoffLim
символов и близок к переполнению, а драйвер передал символ XoffChar
для приостановления потока принимаемых данных. Если поле равно FALSE
, то передача не будет продолжена до тех пор, пока в приемном буфере не останется меньше XonLim
символов и драйвер не передаст символ XonChar
для возобновления потока принимаемых данных. Таким образом это поле вводит некую зависимость между управлением входным и выходным потоками информации.
Задает использование XON/XOFF
управления потоком при передаче. Если это поле равно TRUE
, то передача останавливается при приеме символа XoffChar
, и возобновляется при приеме символа XonChar
.
Задает использование XON/XOFF
управления потоком при приеме. Если это поле равно TRUE
, то драйвер передает символ XoffChar
, когда в приемном буфере находится более XoffLim
, и XonChar
, когда в приемном буфере остается менее XonLim символов.
Указывает на необходимость замены символов с ошибкой четности на символ задаваемый полем ErrorChar
. Если это поле равно TRUE
, и поле fParity
равно TRUE
, то выполняется замена.
Определяет действие выполняемое при приеме нулевого байта. Если это поле TRUE
, то нулевые байты отбрасываются при передаче.
Задает режим управления потоком для сигнала RTS. Поле может принимать следующие значения:
- RTS_CONTROL_DISABLE Сигнал RTS снимается при открытии порта. У открытого порта может быть изменён функцией EscapeCommFunction.
- RTS_CONTROL_ENABLE Сигнал RTS устанавливается при открытии порта. У открытого порта может быть изменён функцией EscapeCommFunction.
- RTS_CONTROL_HANDSHAKE Сигнал RTS автоматически устанавливается/снимается в ходе работы с портом. Не может быть изменён функцией EscapeCommFunction. Сигнал RTS устанавливается, когда приемный буфер заполнен менее, чем на половину, и снимается, когда буфер заполняется более чем на три четверти.
- RTS_CONTROL_TOGGLE Задаёт, что сигнал RTS установлен, когда есть данные для передачи. Когда все символы из передающего буфера переданы, сигнал снимается.
Задает игнорирование всех операций чтения/записи при возникновении ошибки. Если это поле равно TRUE
, драйвер прекращает все операции чтения/записи для порта при возникновении ошибки. Продолжать работать с портом можно будет только после устранения причины ошибки и вызова функции ClearCommError.
Зарезервировано и не используется.
Не используется, должно быть установлено в 0
.
Задает минимальное число символов в приемном буфере перед посылкой символа XON
.
Определяет максимальное количество байт в приемном буфере перед посылкой символа XOFF
. Максимально допустимое количество байт в буфере вычисляется вычитанием данного значения из размера приемного буфера в байтах.
Определяет число информационных бит в передаваемых и принимаемых байтах. Число информационных бит может быть в диапазоне от 4
до 8
.
Определяет выбор схемы контроля четности. Данное поле должно содержать одно из следующих значений:
- EVENPARITY Дополнение до четности
- MARKPARITY Бит четности всегда 1
- NOPARITY Бит четности отсутствует
- ODDPARITY Дополнение до нечетности
- SPACEPARITY Бит четности всегда 0
Задает количество стоповых бит. Поле может принимать следующие значения:
- ONESTOPBIT Один стоповый бит
- ONE5STOPBIT Полтора стоповых бита
- TWOSTOPBITS Два стоповых бита
Задает символ XON
используемый как для приема, так и для передачи. Обычно 0x11
(17
).
Задает символ XOFF
используемый как для приема, так и для передачи. Обычно 0x13
(19
).
Задает символ, использующийся для замены символов с ошибочной четностью.
Задает символ, использующийся для сигнализации о конце данных.
Задает символ, использующийся для сигнализации о событии.
Зарезервировано и не используется.
Если структура DCB
содержит конфигурацию для последовательного порта, совместимого с 8250, то к значениям полей ByteSize
и StopBits
применяются следующие ограничения:
- Количество информационных бит должно быть от
5
до8
. - Не допускается использование
5
информационных бит с2
стоповыми битами, также как6
,7
или8
информационных бит с1,5
стоповыми битами.
winbase.h
typedef struct _COMMTIMEOUTS { DWORD ReadIntervalTimeout; /* Maximum time between read chars. */ DWORD ReadTotalTimeoutMultiplier; /* Multiplier of characters. */ DWORD ReadTotalTimeoutConstant; /* Constant in milliseconds. */ DWORD WriteTotalTimeoutMultiplier; /* Multiplier of characters. */ DWORD WriteTotalTimeoutConstant; /* Constant in milliseconds. */ } COMMTIMEOUTS,*LPCOMMTIMEOUTS;
ReadIntervalTimeout — время в миллисекундах, задающее максимальное время, для интервала между поступлением двух символов по линии связи. Если интервал между поступлением каких-либо двух символов будет больше этой величины, операция ReadFile завершается и любые буферизированные данные возвращаются.
Чтобы операция ReadFile немедленно возвращала управление со всеми полученными данными (асинхронный режим) следует задавать следующие значения:
ReadIntervalTimeout=0xFFFFFFFF; ReadTotalTimeoutConstant=0; ReadTotalTimeoutMultiplier=0;
ReadTotalTimeoutMultiplier — Множитель, используемый, чтобы вычислить полный период времени простоя для операций чтения, в миллисекундах. Для каждой операции чтения, это значение умножается на затребованное число байтов, которые читаются.
ReadTotalTimeoutConstant — Константа, используемая, чтобы вычислить полный (максимальный) период времени простоя для операций чтения, в миллисекундах. Для каждой операции чтения, это значение добавляется к произведению члена структуры ReadTotalTimeoutMultiplier и прочитанного числа байтов.
Значение нуля и для члена ReadTotalTimeoutMultiplier, и для члена ReadTotalTimeoutConstant указывает, что полное время простоя не используются для операций чтения.
WriteTotalTimeoutMultiplier — Множитель, используемый, чтобы вычислить полный период времени простоя для операций записи, в миллисекундах. Для каждой операции записи, это значение умножается на число записываемых байтов.
WriteTotalTimeoutConstant — Константа, используемая, чтобы вычислить полный период времени простоя для операций записи, в миллисекундах. Для каждой операции записи, это значение добавляется к произведению члена структуры WriteTotalTimeoutMultiplier и записанного числа байтов.
Значение нуля и для члена WriteTotalTimeoutMultiplier, и для члена WriteTotalTimeoutConstant указывает, что полное время простоя не используются для операций записи.
Заполнение структуры COMMTIMEOUTS
[править]
Вариант 1: (максимальная задержка при чтении и записи = TIMEOUT)
COMMTIMEOUTS CommTimeOuts; CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = TIMEOUT; CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = TIMEOUT;
Вариант 2: Инициализация значениями (без задержки при чтении)
COMMTIMEOUTS CommTimeOuts={0xFFFFFFFF,0,0,0,1500};
Стандартный диалог настройки порта
[править]
Для настройки параметров COM — порта может быть вызвано штатное окно Windows. Вызов осуществляется функцией CommConfigDialog(), которая в качестве параметров принимает имя настраиваемого порта, хендл родительского окна и указатель на структуру COMMCONFIG.
Следует отметить, что для корректного вызова окна, структура COMMCONFIG должна быть заполнена значениями заранее.
Настройку структуры можно выполнить вручную или при помощи функции GetCommConfig().
Например:
/* Получение существующих настроек */ unsigned long new_size = 0; if (!GetCommConfig(port->handle, &port->settings,&new_size)) goto error; /* Вызов окна и установка новых параметров */ if (CommConfigDialog(port->name, 0, &port->settings)) { if (SetCommConfig(port->handle, &port->settings, port->settings.dwSize)) return 1; goto error; }
Выделение памяти для структуры COMMPORT
[править]
Прием и передача данных для последовательного порта может выполнятся в синхронном или асинхронном режимах. Асинхронный режим позволяет реализовать работу по событиям, в то время как синхронный лишен этой возможности, но является более простым в реализации.
Для работы в синхронном режиме, порт должен быть открыт следующим образом:
CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
Предпоследний параметр dwFlagsAndAttributes должен быть равен 0.
После успешного открытия порта, данные могут быть считаны или записаны при помощи функций ReadFile() и WriteFile().
HANDLE port = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); unsigned char dst[1024] = {0}; unsigned long size = sizeof(dst); if(port!= INVALID_HANDLE_VALUE) if(ReadFile(port,dst,size, &size,0)) printf("\nRead %d bytes",size);
Функция ReadFile/WriteFile осуществляет чтение/запись из файла (устройства) начиная с текущей позиции после окончания чтения обновляет указатель в файле.
BOOL ReadFile( HANDLE hFile, // хендл файла LPVOID lpBuffer, //указатель на буфер DWORD nNumberOfBytesToRead, // размер данных LPDWORD lpNumberOfBytesRead, //размер считанных данных LPOVERLAPPED lpOverlapped //структура OVERLAPPED );
Недостатком этого способа является то, что вызывая функцию ReadFile(), мы не знаем есть ли данные для чтения. Можно циклически проверять их наличие, но это приводит к дополнительным расходам времени ЦП.
Поэтому на практике часто удобней использовать асинхронный режим. Для этого при вызове функции CreateFile() параметр dwFlagsAndAttributes должен быть равен FILE_FLAG_OVERLAPPED.
CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
Далее, необходимо настроить реакцию порта на события при помощи функции SetCommMask() и используя функции WaitCommEvent() и WaitForSingleObject() ожидать событие или тайм аут.
Например:
const int READ_TIME = 100; OVERLAPPED sync = {0}; int reuslt = 0; unsigned long wait = 0, read = 0, state = 0; /* Создаем объект синхронизации */ sync.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); /* Устанавливаем маску на события порта */ if(SetCommMask(port, EV_RXCHAR)) { /* Связываем порт и объект синхронизации*/ WaitCommEvent(port, &state, &sync); /* Начинаем ожидание данных*/ wait = WaitForSingleObject(sync.hEvent, READ_TIME); /* Данные получены */ if(wait == WAIT_OBJECT_0) { /* Начинаем чтение данных */ ReadFile(port, dst, size, &read, &sync); /* Ждем завершения операции чтения */ wait = WaitForSingleObject(sync.hEvent, READ_TIME); /* Если все успешно завершено, узнаем какой объем данных прочитан */ if(wait == WAIT_OBJECT_0) if(GetOverlappedResult(port, &sync, &read, FALSE)) reuslt = read; } } CloseHandle(sync.hEvent);
Пример настройки порта и выполнения чтения/записи данных
[править]
Код для работы с COM-портом. Многострадальный, соответственно относительно простой и понятный, при этом обходит основные подводные камни. Надеюсь, может быть полезен.
#ifndef TTY_H #define TTY_H #define NOMINMAX //иначе API windows определит макросы min и max, конфликтующие с std::max и std::min в vector #include <windows.h> #include <vector> #include <string> using namespace std; struct TTY { TTY(); virtual ~TTY(); bool IsOK() const; void Connect(const string& port, int baudrate); void Disconnect(); virtual void Write(const vector<unsigned char>& data); virtual void Read(vector<unsigned char>& data); HANDLE m_Handle; }; struct TTYException { }; #endif
#include "tty.h" #include <iostream> #include <assert.h> #include <windows.h> using namespace std; static int TIMEOUT = 1000; TTY::TTY() { m_Handle = INVALID_HANDLE_VALUE; } TTY::~TTY() { Disconnect(); } bool TTY::IsOK() const { return m_Handle != INVALID_HANDLE_VALUE; } void TTY::Connect(const string& port, int baudrate) { Disconnect(); m_Handle = CreateFile( port.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(m_Handle == INVALID_HANDLE_VALUE) { throw TTYException(); } SetCommMask(m_Handle, EV_RXCHAR); SetupComm(m_Handle, 1500, 1500); COMMTIMEOUTS CommTimeOuts; CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = TIMEOUT; CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = TIMEOUT; if(!SetCommTimeouts(m_Handle, &CommTimeOuts)) { CloseHandle(m_Handle); m_Handle = INVALID_HANDLE_VALUE; throw TTYException(); } DCB ComDCM; memset(&ComDCM,0,sizeof(ComDCM)); ComDCM.DCBlength = sizeof(DCB); GetCommState(m_Handle, &ComDCM); ComDCM.BaudRate = DWORD(baudrate); ComDCM.ByteSize = 8; ComDCM.Parity = NOPARITY; ComDCM.StopBits = ONESTOPBIT; ComDCM.fAbortOnError = TRUE; ComDCM.fDtrControl = DTR_CONTROL_DISABLE; ComDCM.fRtsControl = RTS_CONTROL_DISABLE; ComDCM.fBinary = TRUE; ComDCM.fParity = FALSE; ComDCM.fInX = FALSE; ComDCM.fOutX = FALSE; ComDCM.XonChar = 0; ComDCM.XoffChar = (unsigned char)0xFF; ComDCM.fErrorChar = FALSE; ComDCM.fNull = FALSE; ComDCM.fOutxCtsFlow = FALSE; ComDCM.fOutxDsrFlow = FALSE; ComDCM.XonLim = 128; ComDCM.XoffLim = 128; if(!SetCommState(m_Handle, &ComDCM)) { CloseHandle(m_Handle); m_Handle = INVALID_HANDLE_VALUE; throw TTYException(); } } void TTY::Disconnect() { if(m_Handle != INVALID_HANDLE_VALUE) { CloseHandle(m_Handle); m_Handle = INVALID_HANDLE_VALUE; } } void TTY::Write(const vector<unsigned char>& data) { if(m_Handle == INVALID_HANDLE_VALUE) { throw TTYException(); } DWORD feedback; if(!WriteFile(m_Handle, &data[0], (DWORD)data.size(), &feedback, 0) || feedback != (DWORD)data.size()) { CloseHandle(m_Handle); m_Handle = INVALID_HANDLE_VALUE; throw TTYException(); } // In some cases it's worth uncommenting //FlushFileBuffers(m_Handle); } void TTY::Read(vector<unsigned char>& data) { if(m_Handle == INVALID_HANDLE_VALUE) { throw TTYException(); } DWORD begin = GetTickCount(); DWORD feedback = 0; unsigned char* buf = &data[0]; DWORD len = (DWORD)data.size(); int attempts = 3; while(len && (attempts || (GetTickCount()-begin) < (DWORD)TIMEOUT/3)) { if(attempts) attempts--; if(!ReadFile(m_Handle, buf, len, &feedback, NULL)) { CloseHandle(m_Handle); m_Handle = INVALID_HANDLE_VALUE; throw TTYException(); } assert(feedback <= len); len -= feedback; buf += feedback; } if(len) { CloseHandle(m_Handle); m_Handle = INVALID_HANDLE_VALUE; throw TTYException(); } } using namespace std; int main(int argc, char *argv[]) { TTY tty; tty.Connect("COM4",9600); for(int i=0;i<1000;i++) { std::vector<unsigned char> the_vectsor; the_vectsor.push_back(5); tty.Read(the_vectsor); std::cout << (char)(the_vectsor[0]); //output text } system("PAUSE"); return EXIT_SUCCESS; }