Как решить проблему с COM-портом через командную строку

#command-line #arduino #usb #port

#командная строка #arduino #usb #порт

Вопрос:

Я выполняю следующий код в разных системах. Мне требуется обобщенный параметр соответствия, чтобы код нормально работал на всех системах в зависимости от COM-ПОРТА, используемого для этого устройства.

C:arduinosetuphardware/tools/avr/bin/avrdude -CC:arduinosetuphardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -carduino -P.COM121 -b115200 -D -Uflash:w: C:UsersXYZABCfilesabc.cpp.hex: я

Ответ №1:

Я предполагаю, что вы используете Windows и хотите, чтобы ваши команды работали на разных компьютерах с Windows, даже если Arduino подключены к разным COM-портам. Большинство Arduino в наши дни используют usbser.sys . Если вы предполагаете, что существует только одно устройство, использующее usbser.sys подключенный к системе, и это Arduino, тогда к Arduino можно получить доступ по объекту с именем USBSER000. Вы можете передать \.USBSER000 в качестве аргумента порта в AVRDUDE для ссылки на порт Arduino.

Вы должны правильно экранировать эту строку, поэтому фактическая команда, которую вы пишете, будет примерно такой:

 avrdude -P\\.\USBSER000 ...
 

Другие вещи, которые могут вам помочь:

  • Знаете ли вы, что вы можете изменить порт, на который включен Arduino, из диспетчера устройств? Я предпочитаю хранить все свои Arduino на COM7.
  • Вы можете установить переменную среды на каждой машине, чтобы указать, на какой порт подключен Arduino, а затем ссылаться на нее в своих командах с помощью чего-то вроде %VARNAME% или $VARNAME .

Ответ №2:

Вы пытались проверить скорость передачи данных в бодах? Вероятно, это вызывает проблему. Лучше, если вы используете как можно более низкую скорость передачи данных. Кроме того, скорость передачи данных в бодах должна совпадать в вашем коде и в конфигурации COM-порта. (проверьте в диспетчере устройств)

Комментарии:

1. На самом деле я хочу использовать эту команду в разных системах. но разные системы будут иметь разные com-порты, такие как COM121 или COM51 и т. Д. Итак, мне нужна обобщенная команда, чтобы мне не нужно было менять код в каждой системе

Ответ №3:

Поскольку у меня нет доступа к комментариям, я собираюсь ответить, ПРЕДПОЛАГАЯ, что вы пытаетесь это сделать в операционной системе WINDOWS.

Во-первых, было бы немного проще и несколько элегантнее написать служебную программу для этого запроса, потому что ни один конкретный параметр в вашей командной строке не может учитывать все возможные настройки COM-порта в разных системах.

В Windows нет команды ‘Alias’ для связывания общего имени с элементом конфигурации, таким как COM-порт, поэтому применение общего имени невозможно. Вы можете написать цикл FOR и поместить его в файл CMD или BAT с логикой, которая пытается отобразить текст в списке типичных имен COM-портов, таких как COM1, COM2 и т.д.

Если вы введете эту строку в окне CMD или командной строки в MS-DOS или Windows:

  echo "This is a test" > COM1:
 

Вы либо не получите ответа (хорошо), либо ОС ответит:

  The system cannot find the file specified.
 

Последнее сигнализирует о том, что такого устройства нет. Цикл FOR может тестировать итерации для первого устройства, которое не возвращает ошибку. Проблема здесь в том, что в системах с несколькими последовательными портами (как это обычно бывает) ваш код попытается использовать ПЕРВОЕ найденное устройство. Если пользователь подключил последовательный кабель к другому порту, он не будет работать.

Вот почему я предлагаю вам написать служебную программу. Утилита может составить список доступных последовательных портов, а затем попытаться запросить каждый порт для устройства с помощью запроса. Это единственный известный мне способ гарантировать, что «командная строка», которую вы хотите использовать, будет единой для всех систем.

Комментарии:

1. Я понимаю концепцию, но в моей системе может использоваться несколько портов. для ex COM121 используются оба COM 11, и при тестировании вышеуказанной команды на обоих из них это подтверждается отсутствием ответа. Но как определить, что мое устройство arduino подключено к 121, а не к 11.

2. Вот почему я сказал, что написание утилиты — единственный способ убедиться, что у вас правильный порт. Если Arduino можно запрограммировать, я предлагаю написать короткий блок кода, который отвечает на запрос, поступающий через порт. Итак, на стороне ПК вы отправляете уникальную строку на COM-порт. На Arduino у вас есть слушатель, который отслеживает трафик COM-порта для этой строки. Когда он «видит» строку, он отвечает отправкой ответа — или повторяет саму строку. Логика в вашей компьютерной утилите видит ответ и может уведомить вызывающее приложение или, в данном случае, сценарий оболочки.

Ответ №4:

Дэвид Грейсон, ваш ответ был потрясающим. Я также нашел какое-то решение:

 using System;
using System.IO.Ports;
public class ports 
{
static public void Main ()
{
    var portNames = SerialPort.GetPortNames();
        foreach(var port in portNames) {
        Console.WriteLine (port);
}
}
}
 

скомпилировал и выполнил этот код с помощью компилятора mono C #, используя команды в командной строке

 mcs ports.cs
mono ports.exe
 

теперь ports.exe может использоваться в любой системе для получения списка доступных com-портов.