I’m trying to send files over a COM port, but failed every time.
First, I configure a serial on each machine like this:
MODE COMx:115200,N,8
where x is the COM port number.
After this I’m trying to do:
COPY file.zip COM1: /B
and the reverse on the receiving PC.
In most cases I’ve gotten a broken archive. But last tries gave me nothing at all — first PC says that the file was sent, but the second is just waiting for data. Is there somebody who knows how to solve this?
asked Apr 6, 2016 at 6:27
4
This works for me to send a binary file to an Arduino :
mode COM21 BAUD=115200 PARITY=n DATA=8
copy yourfile.txt \\.\COM21
Notice the \\.\
which is mandatory for port numbers >= 10, and can be used too for port numbers 1-9.
Stephan
54.2k10 gold badges58 silver badges93 bronze badges
answered Sep 24, 2016 at 7:05
BenBen
1,5781 gold badge11 silver badges12 bronze badges
6
You need to specify /B for binary file after the .zip file (or whatever else it is) as well as at the end of the command line. e.g. COPY ABinary.File /B COM1 /B
otherwise it will stop at the first non-text ASCII character.
Try using Hyperterminal at the receiving end and Transfer > Capture Text
answered Dec 16, 2016 at 11:23
JamesJames
311 bronze badge
Мне часто нужно посылать короткие строки символов в последовательный порт на операционной системе Windows (перевод статьи [1]). Это можно использовать для отправки команд роботу или в другие устройства, основанным на микроконтроллерах. Для соединения с устройством можно использовать аппаратный преобразователь USB-to-serial, которые в обилии можно найти на сайтах AliExpress, Ebay и dx.com. Для отправки символов есть удобная утилита SerialSend [2], но также можно использовать встроенные команды Windows: echo, set и mode.
К примеру, нужно послать строку «hello» в COM1 (имя первого последовательного порта Windows). Для этого можно просто ввести в консоли cmd.exe следующую команду:
Команда echo обычно используется для отображения строк в консоли командной строки, когда нужно вывести какое-нибудь информационное сообщение из скрипта команд *.BAT или *.CMD. Однако в этом примере с помощью символа > применено перенаправление вывода в специальный файл COM1, который в действительности не файл на диске, а последовательный порт. По этой причине строка «hello» отправляется в последовательный порт вместо экрана консоли.
Но для такого вывода текста в последовательный порт есть несколько препятствий:
• Нужно заранее знать номер COM-порта, который хотите использовать. Если Вы используете преобразователь USB-to-serial, то этот номер может неожиданно поменяться, особенно если Вы подключили его в другой разъем USB (программа SerialSend [2] предоставляет простой альтернативный метод отправки строк в любой доступный COM-порт с самым высоким порядковым номером, что может быть очень полезным).
• Строка, которая отправляется в нашем примере, в действительности имеет длину 8 байт, потому что она включает 1 байт завершающего пробела (код ASCII 0x20) плюс символ возврата каретки (CR, код 0x0D) и перевода строки (LF, код 0x0A).
• Отправлять можно только обычные символы текста. К примеру, произвольные байты с кодами 0x00 .. 0x19 отправлять не получится, на это способна только утилита SerialSend [2].
• Последовательный порт, который Вы хотите использовать, может быть настроен не на ту скорость, которая Вам нужна. В таком случае дополнительно нужно использовать команду mode, чтобы сконфигурировать скорость baudrate (и/или другие параметры фрейма последовательного протокола).
• COM-порты с большими номерами могут быть не распознаны для такого примера, но для их использования есть обходной маневр, описанный ниже.
Следующий пример — более надежный аналог команды из примера выше:
set /p x="hello" < nul >\\.\COM22
Эта команда может выглядеть поначалу довольно непонятной, давайте разберем её по частям.
Команда set обычно используется для установки значения для так называемой переменной окружения (environment variable). Например, следующая команда должна использоваться для установки переменной окружения с именем x в значение строки «sunshine»:
Когда в команде set используется ключ /p, то команда set выводит приглашение для пользователя, чтобы он ввел значение для устанавливаемой переменной окружения. Приглашение отображается на экране в виде строки, предоставленной в команде. Например:
set /p x="Введите значение для x: "
Конечно, нас в сущности не интересует установка значения переменной x как таковой, сейчас это просто средство для достижения другой цели. Все, что мы хотим — вывести строку «hello» без символов CR и LF, и команда set только лишь предоставляет способ для решения этой задачи.
Мы не хотим, чтобы команда set остановилась на ожидании ввода пользователя, чтобы он ввел значение для переменной x, для этого команда set перенаправлена на ввод из nul (т. е. нет ввода как такового, вместо обычного ввода, который обычно происходил бы из консоли). Это означает, что команда сразу завершит работу, вместо того, чтобы ожидать ввода пользователя. Перенаправление ввода осуществляется символом < , указанным перед nul.
set /p x="Enter a value for x: " < nul
Теперь, чтобы вывести только корректные символы, и только их, нам нужно перенаправить вывод в COM22. Чтобы гарантировать, что имя COM-порта будет правильно распознано, и произошло перенаправление вывода, здесь вместо специального системного имени используется его полная форма «\\.\COM22».
set /p x="hello" < nul > \\.\COM22
И наконец, чтобы сконфигурировать скорость перед отправкой строки в последовательный порт, можно использовать команду mode. Например, для настройки COM8 на 38400 бод, 8 бит данных, без проверочного бита четности, нужна следующая команда:
mode COM8 BAUD=38400 PARITY=n DATA=8
Вот полный пример на скриншоте окна консоли:
[Ссылки]
1. Simple command line trick for sending characters to a serial port in Windows site:batchloaf.wordpress.com.
2. SerialSend: утилита для работы с виртуальным COM-портом.
I’m trying to send files over a COM port, but failed every time.
First, I configure a serial on each machine like this:
MODE COMx:115200,N,8
where x is the COM port number.
After this I’m trying to do:
COPY file.zip COM1: /B
and the reverse on the receiving PC.
In most cases I’ve gotten a broken archive. But last tries gave me nothing at all — first PC says that the file was sent, but the second is just waiting for data. Is there somebody who knows how to solve this?
asked Apr 6, 2016 at 6:27
4
This works for me to send a binary file to an Arduino :
mode COM21 BAUD=115200 PARITY=n DATA=8
copy yourfile.txt \\.\COM21
Notice the \\.\
which is mandatory for port numbers >= 10, and can be used too for port numbers 1-9.
Stephan
54.2k10 gold badges58 silver badges93 bronze badges
answered Sep 24, 2016 at 7:05
BenBen
1,5781 gold badge11 silver badges12 bronze badges
6
You need to specify /B for binary file after the .zip file (or whatever else it is) as well as at the end of the command line. e.g. COPY ABinary.File /B COM1 /B
otherwise it will stop at the first non-text ASCII character.
Try using Hyperterminal at the receiving end and Transfer > Capture Text
answered Dec 16, 2016 at 11:23
JamesJames
311 bronze badge
I often need to send short character strings to a serial port in Windows. The sort of thing I might use this for is sending a command to a robot or other microcontroller-based device that I’m building using a USB-to-serial converter. I actually developed a small command line utility called SerialSend for doing exactly this, but in many cases you can get away without using any special programs at all. Instead you can just use Windows’ built-in echo, set and mode commands.
The simplest case is something like the following which sends the string “hello” to COM1 (the first serial port). You can just type this command into a normal Windows console:
echo hello > COM1
The echo command is typically used to display a string in the console. Here however, its output is redirected (using the “>” character) to the special filename “COM1”, which is actually a serial port rather than a file on disk. So the string “hello” gets sent to the serial port rather than to the screen.
There are a couple of potential snags though:
- You need to know the number of the COM port you want to send to. If you’re using a USB-to-serial converter, this number may change over time, especially if you plug the device into different USB sockets. (SerialSend provides an easy alternative method of sending strings to whatever the highest numbered available COM port is, which can be very useful.)
- The string that gets sent in the above example is actually 8 bytes long because it includes the trailing space character after the word “hello” as well as carriage return and line feed characters. I tested this myself by capturing the transmitted bytes using a microcontroller and then echoing their numerical values back to the screen – the values were: “104 101 108 108 111 32 13 10”. The first five byte values in the sequence are just the letters of the word “hello”, but the last three are the space, carriage return and line feed characters. An alternative method of sending the string without these trailing characters using the set command is shown below.
- The serial port you’re using may not already be set to the baudrate you desire. In this case, an additional mode command can be used to configure the baudrate (and/or other serial parameters).
- Higher numbered COM ports may not be recognised when written this way, but a workaround is shown below.
The following example is a more robust version of the command shown above:
set /p x="hello" <nul >\\.\COM22
This probably looks a bit confusing, so let’s break it down.
The set command is normally used to set the value of an environment variable. For example, the following command could be used to set an environment variable called x equal to the string “sunshine”:
set x="sunshine"
When used with the “/p” switch, the set command prompts the user to enter a value for the environment variable. The prompt displayed on screen is the string provided in the command. For example,
set /p x="Enter a value for x: "
Of course, we’re actually not interested in setting the value of x at all – it’s just a means to a different end. All we really want is a way of outputting the string “hello” without any carriage return and line feed characters, and the set command just happens to provide a convenient way of doing it.
We don’t want the set command to sit around waiting for the user to enter a value for x, so the input to the set command is redirected from “nul” (i.e. no input at all, rather than input from the console which would normally be the case). This means that the command finishes immediately rather than waiting for something to be typed in. Input redirection is performed using the “<» character.
set /p x="Enter a value for x: " <nul
Now that we’re outputting the correct characters (and only the correct characters), we need to redirect the output to COM22. To ensure that the COM port name is recognised when redirecting the output, its special filename is written in its full form, «\\.\COM22».
set /p x="hello" <nul >\\.\COM22
Finally, to configure the baudrate before sending a string to the serial port, the mode command can be used. For example, to set COM22 to 38,400 baud with 8 data bits and no parity checking:
mode COM22 BAUD=38400 PARITY=n DATA=8
Here’s a complete example as it appeared in my console window:
Командная строка – мощный инструмент для работы с операционной системой Windows. Она позволяет пользователям выполнять различные операции без необходимости использования графического интерфейса.
Одной из полезных возможностей командной строки является возможность работы с COM-портами Windows. COM-порты – это интерфейсы, используемые для подключения устройств ввода-вывода, таких как модемы, принтеры и сканеры, к компьютеру.
В этой статье мы рассмотрим, как можно открыть, прочитать и записать данные в COM-порты Windows с помощью командной строки.
1. Открытие COM-порта
Для начала работы с COM-портом необходимо его открыть. Для этого можно использовать команду MODE в командной строке. Синтаксис этой команды выглядит следующим образом:
MODE COM<номер порта>[:<скорость> [<бит/сек> [парность(e|o|n|m|s) [биты данных(5-8) [стоповые биты(1-2)]]]]]
Например, чтобы открыть COM1 порт с паритетом и без установки скорости, можно использовать команду:
MODE COM1:,,P
После выполнения этой команды COM1 порт будет открыт и готов для использования.
2. Чтение данных из COM-порта
После открытия COM-порта можно прочитать данные, поступающие с подключенного устройства. Для этого существует несколько способов.
2.1. Использование команды TYPE
Команда TYPE позволяет читать содержимое файла, однако она также может быть использована для чтения данных из COM-порта.
Для чтения данных из COM-порта с помощью команды TYPE необходимо указать имя порта. Например, чтобы прочитать данные из COM1 порта, выполните следующую команду:
TYPE COM1
После выполнения этой команды в консоли будут отображены данные, приходящие с подключенного устройства.
2.2. Использование команды COPY
Команда COPY позволяет копировать содержимое файла. Также она может быть использована для чтения данных из COM-порта.
Для чтения данных из COM-порта с помощью команды COPY необходимо указать имя порта и имя файла, в который будут скопированы данные. Например, чтобы прочитать данные из COM1 порта и сохранить их в файле data.txt, выполните следующую команду:
COPY COM1 data.txt
После выполнения этой команды данные будут скопированы из COM1 порта в файл data.txt.
3. Запись данных в COM-порт
После открытия COM-порта можно записывать данные в подключенное устройство. Для этого также существует несколько способов.
3.1. Использование команды ECHO
Команда ECHO позволяет выводить текст на экран, но она также может быть использована для записи данных в COM-порт.
Для записи данных в COM-порт с помощью команды ECHO необходимо указать данные и имя порта. Например, чтобы записать «Hello, World!» в COM1 порт, выполните следующую команду:
ECHO Hello, World! > COM1
После выполнения этой команды данные будут записаны в COM1 порт и отправлены подключенному устройству.
3.2. Использование команды COPY
Команда COPY также можно использовать для записи данных в COM-порт. Для этого необходимо указать имя файла, содержащего данные, и имя порта.
Например, чтобы записать содержимое файла data.txt в COM1 порт, выполните следующую команду:
COPY data.txt COM1
После выполнения этой команды данные из файла data.txt будут скопированы в COM1 порт.
Заключение
Командная строка Windows предоставляет мощные инструменты для работы с COM-портами. С ее помощью можно открывать, читать и записывать данные в COM-порты.
В этой статье мы рассмотрели основные команды для работы с COM-портами в командной строке. Однако, стоит отметить, что использование командной строки может быть достаточно сложным для пользователей, не знакомых с ее синтаксисом.
Если вы хотите получить более мощные и удобные инструменты для работы с COM-портами, рекомендуется использовать специализированные программы или библиотеки для программирования.
Понимание работы с COM-портами может быть полезным, особенно для программистов и системных администраторов, которые могут столкнуться с необходимостью работы с устройствами подключенными через COM-порты.
Надеюсь, что эта статья помогла вам понять, как из командной строки можно открыть, прочитать и записать данные в COM-порт Windows.