|
![]() |
#1 |
Участник
|
Подниму тему.
Понимаю, конечно, что это скорее всего невозможно, но спрошу на всякий случай. Если посмотреть на различные примеры функций обработки КОМ-портов для сканеров ШК, то видим, что имя порта, к которому подключено устройство указывается строкой. Так как мой сканер использует первый следующий свободный порт (что на каждом компьютере может быть разным), получется потребуется производить настройку порта для каждого пользователя/компьютера индивидуально. Вопрос: существуют ли способы определить к какому порту подключено моё устройство-сканер на текущей машине? Или давать каждому пользователю возможности настройки КОМ-порта для подключения сканера (скажем, прямо на форме) вручную и запоминать их через SysLastValue (к примеру)? Спасибо! Приведу свой код с использованием .NET в X++ для обработки получения данных COM-порта. Может пригодится. X++: str message; boolean keepTrying; InteropPermission lclsInteropPerm; System.IO.Ports.SerialPort SerialPort; ; lclsInteropPerm = new InteropPermission(InteropKind::ClrInterop); lclsInteropPerm.assert(); try { SerialPort = new System.IO.Ports.SerialPort('COM3'); // Parameters SerialPort.set_BaudRate(9600); SerialPort.set_Parity(System.IO.Ports.Parity::None); SerialPort.set_StopBits(System.IO.Ports.StopBits::One); SerialPort.set_DataBits(8); SerialPort.set_Handshake(System.IO.Ports.Handshake::None); // Timeout SerialPort.set_ReadTimeout(500); SerialPort.Open(); keepTrying = true; while (keepTrying) { message = SerialPort.ReadExisting(); if (message) { keepTrying = false; info(message); } } } catch (Exception::Internal) { error(AIFUtil::getClrErrorMessage()); } catch (Exception::CLRError) { error(AIFUtil::getClrErrorMessage()); } if (!CLRINterop::isNull(SerialPort)) { SerialPort.Close(); } CodeAccessPermission::revertAssert(); |
|
![]() |
#2 |
Участник
|
Лучше создать настроечную табличку жёсткого соответствия ComputerName - COM порт. Если нельзя такого сделать можно смотреть в сторону команды change port, devcon. И если работаете через эмулятор USB-COM , то лучше административными мерами запретить пользователям переподключать сканеры к разным машинам, так как система выдает новые номера COM портов согласно идентификатору устройства.
|
|
|
За это сообщение автора поблагодарили: Cardagant (1). |
![]() |
#3 |
Участник
|
Использую эмулятор USB-COM.
Спасибо за ответ! В принципе, так и думал. Сейчас задумался, возможно стоит поразмыслить об использовании мканера в режиме HID-клавиатуры (или разрыва клавиатуры) с настройками ASCII префиксов/суффиксов (Ctrl + N and Ctrl + S при работе с Grid). Или же перехватывать специальную клавишу, настроенную как префикс (например, F1) и производить обработку. Или вообще просто на validateField() таблицы проверять корректность введённого значения без всего вышеуказанного. Как считаете, что может быть эффективнее в плане реализации и использования? Последний раз редактировалось Cardagant; 16.05.2014 в 17:38. |
|
![]() |
#4 |
Участник
|
Если есть терпение и время, очень интересно попробовать сделать перехват сообщений от HID клавиатуры с фильтром по VID/PID . Конечно проще настроить префикс и ловить данные со сканера в активный элемент с нулевой высотой к примеру.
|
|
![]() |
#5 |
Участник
|
Добрый день!
Приведенный код .net работает не так, как нужно. Ах ничего не выводит в инфолог, при завершении все выводится в редактор кода X++. Работаем через терминал, при этом в блокнот все сканируется нормально. Цитата:
Сообщение от Cardagant
![]() Приведу свой код с использованием .NET в X++ для обработки получения данных COM-порта. Может пригодится. X++: str message; boolean keepTrying; InteropPermission lclsInteropPerm; System.IO.Ports.SerialPort SerialPort; ; lclsInteropPerm = new InteropPermission(InteropKind::ClrInterop); lclsInteropPerm.assert(); try { SerialPort = new System.IO.Ports.SerialPort('COM3'); // Parameters SerialPort.set_BaudRate(9600); SerialPort.set_Parity(System.IO.Ports.Parity::None); SerialPort.set_StopBits(System.IO.Ports.StopBits::One); SerialPort.set_DataBits(8); SerialPort.set_Handshake(System.IO.Ports.Handshake::None); // Timeout SerialPort.set_ReadTimeout(500); SerialPort.Open(); keepTrying = true; while (keepTrying) { message = SerialPort.ReadExisting(); if (message) { keepTrying = false; info(message); } } } catch (Exception::Internal) { error(AIFUtil::getClrErrorMessage()); } catch (Exception::CLRError) { error(AIFUtil::getClrErrorMessage()); } if (!CLRINterop::isNull(SerialPort)) { SerialPort.Close(); } CodeAccessPermission::revertAssert(); |
|