Страницы

Поиск по вопросам

Показаны сообщения с ярлыком port. Показать все сообщения
Показаны сообщения с ярлыком port. Показать все сообщения

суббота, 22 июня 2019 г.

Определение порта, к которому подключено устройство

Использую библиотеку jssc для использования COM-портов в java. Такая ситуация: к компьютеру подключена arduino, и надо в коде определить, к какому порту она подключена. Как это реализовать?


Ответ

С точки зрения компьютера, Ардуина является конвертером USB->COM, обычным USB-устройством, со своими VID и PID.
Вам нужно прочитать ветку реестра, выудить оттуда VID и PID, и по ним узнать имя COM порта.
Как это делается на C++ я уволок отсюда
///

/// Compile an array of COM port names associated with given VID and PID /// /// /// /// List ComPortNames(String VID, String PID) { String pattern = String.Format("^VID_{0}.PID_{1}", VID,PID); Regex _rx = new Regex(pattern, RegexOptions.IgnoreCase); List comports = new List(); RegistryKey rk1 = Registry.LocalMachine; RegistryKey rk2 = rk1.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum"); foreach (String s3 in rk2.GetSubKeyNames()) { RegistryKey rk3 = rk2.OpenSubKey(s3); foreach (String s in rk3.GetSubKeyNames()) { if (_rx.Match(s).Success) { RegistryKey rk4 = rk3.OpenSubKey(s); foreach (String s2 in rk4.GetSubKeyNames()) { RegistryKey rk5 = rk4.OpenSubKey(s2); RegistryKey rk6 = rk5.OpenSubKey("Device Parameters"); comports.Add((string)rk6.GetValue("PortName")); } } } } return comports; }
static void Main(string[] args) { List names = ComPortNames("0403", "6001"); if (names.Count > 0) { foreach (String s in SerialPort.GetPortNames()) { if (names.Contains(s)) Console.WriteLine("My Arduino port is " + s); } } else Console.WriteLine("No COM ports found"); }

среда, 12 июня 2019 г.

Как работать с ethernet портом на c++

Здравствуйте. У меня есть пульт который подключается к специальному контроллеру через ethernet кабель. Пульт состоит из двух кнопок, а в кабеле имеется только 3 провода. Я хочу подключить компьютеру к контроллеру, что бы компьютер выполнял функции пульта.
План был такой: Сперва я хотел подключить пульт к компьютеру и узнать какого рода команды он подаёт контроллеру нажимая на кнопки. Далее написать не большой код на основе полученной информации, который давал бы команды на контроллер. Потом уже добавил бы те функции программе которые не мог выполнять пульт.
Проблема в том, что у меня и так не большой опыт в программировании на c++, а о работе с портами я вообще не чего не знаю.
Вопрос: Что потребуется для написания программы которая будет отображать сигнал поступающий на ethernet порт компьютера? Как отправлять сигнал на ethernet порт с помощью c++? Возможно ли вообще всё это?
Ниже приведена "схема" подключений. 1011 символизирует информацию. (1. Нынешнее подключение. 2. Получение сигнала от пульта на компьютер. 3. Отправка сигнала с компьютера на контроллер)
Также фотография пульта с обратной стороны.
Заранее спасибо!


Ответ

Как уже выяснили в комментариях, это не Ethernet. И даже не com. По-моему, эта вещичка устроена так:

На средний провод подаётся постоянное напряжение, а кнопки замыкают соответствующие цепи, и тогда напряжение появляется на других линиях. Из интерфейсов, существующих в компьютере, здесь подойдёт только LPT-порт: центральный провод соединить с линией strobe и подать на него высокий уровень (логическую единицу). Другие линии соединить с любой из линий состояния и постоянно проверять на них логический уровень.
Проблема в том, что на современных компьютерах такого порта давно уже нет. Поэтому я могу посоветовать брать свой контроллер (например, STM32F103), с его помощью проверять состояние кнопок. Это легко делается через порты GPIO. На компьютер можно передавать данные с помощью USB, который встроен в этот контроллер. Но USB - штука довольно сложная, поэтому вам легче будет воспользоваться преобразователем USB-UART, например, CP2102.

вторник, 11 июня 2019 г.

C++ open разных файлов, возвращает одинаковый дескриптор

Здравствуйте, пытаюсь в линуксе перечислить доступные порты. Находит два, но при этом почему то возвращает одинаковые дескрипторы, хотя программа не закрывает файлы.
printf("Ports enumeration:
");
int portDesc; std::string pathBasis = "/dev/ttyS"; for (uint counter = 0; counter <= 64; counter++) { std::string searchString = pathBasis; searchString += std::to_string(counter); portDesc = open(searchString.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); if (portDesc != -1) { printf("%s%s%s%x%s","Found serial port: ", searchString.c_str(), "
Port descriptor: ", std::to_string(portDesc), "
"); } }


Ответ

Вам надо заменить строчку
printf("%s%s%s%x%s","Found serial port: ", searchString.c_str(), "
Port descriptor: ", std::to_string(portDesc), "
");
на
printf("%s%s%s%x%s","Found serial port: ", searchString.c_str(), "
Port descriptor: ", portDesc, "
");
Потому как вы преобразовываете дескриптор в строку, а потом зачем-то выводите ее как целое шестнадцатеричное число (формат %x) - вот в этом косяк. У вас выводится не дескриптор - а не понятно что.
А еще лучше - на
printf("Found serial port: %s
Port descriptor: %x
", searchString.c_str(), portDesc);
А еще лучше - юзать потоки ввода-вывода стандартной библиотеки, чтобы так не попадать.