02.10.2008, 15:30 | #21 |
Участник
|
Цитата:
Сообщение от lev
у нас это реализовано с помощью element.setTimeOut("GetBarcode", TimeOut);
на формах геде должно быть сканирование добавляется метод GetBarcode(); в init() формы инициализируется ком порт и выставляется таймер на просмотр метода GetBarcode(); в этом методе проверяем есть ли что в ком порте, а далле получаем штрих код, и делаем всё что нам надо. Код : Код: public void init() { ; cRez = "1"; if ( element.args().parm() ) cRez = element.args().parm(); super(); if ( cRez == "2" ) { comPrt = new CommaIo( "COM1:", "r" ); comPrt.outRecordDelimiter('\r\n'); element.setTimeOut( "GetBarkod", 100, true ); } } void GetBarkod() { Container aRead; ; if ( comPrt.status() == IO_Status::Ok ) { [cBarkod] = comPrt.read(); //aRead = comPrt.read(); //cBarkod = conpeek( aRead, 1 ); Barkod.text( cBarkod ); Barkod.modified(); } element.setTimeOut( "GetBarkod", 100 ); } |
|
02.10.2008, 16:10 | #22 |
Ищущий знания...
|
У нас немного по другому:
X++: void init() { ... sc = new ComPortMSComm(); sc.initParmDefault(); ... } void GetBarcode() { Barcode input; ComVariant res; str 1 ch; int i, template; ; i = sc.InBufferCount(); input = ""; if(i) { sleep(50); i = sc.InBufferCount(); while(i > 0) { res = null; ch = ""; res = sc.Input(); ch = res.bStr(); input = input + ch; i = sc.InBufferCount(); } } element.setTimeOut("GetBarcode", 100); }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
02.10.2008, 18:20 | #23 |
Banned
|
Цитата:
Сообщение от Rimantas
Здраствуйте ,
По поиску нашёл классы от EVGL ( SF_MSComm32 ) . Но никак не могу найти решения , как считать информацию из СОМ порта и поставить инфо в нужное поле в форме . Имеем здесь несколько старых рабочих сканеров , которые привязанные к СОМ портам . Надо считать баркоды и поставить их в форму . Обьект классы создаеться , СОМ порт открываеться - дальше не понимаю , как описать опознание и наблюдение процесса СОМ порта ... Заранее спасибо за помочь ! С уважением , Римантас |
|
02.10.2008, 20:26 | #24 |
Участник
|
Здесь Работа с COM-портом рассматривалась возможность работы со сканерами из Аксапты, в том числе прямое считывание с com-порта.
Но я бы посоветовал найти программу для перенаправления с com-порта на клавиатуру и просто обрабатывать клавиатурный ввод
__________________
Axapta v.3.0 sp5 kr2 |
|
03.10.2008, 09:31 | #25 |
Участник
|
|
|
06.10.2008, 17:30 | #26 |
Участник
|
Спасибо вам , Лев , за помочь ...
Осталось одна проблема - немогу вызвать MsComm32.ОСХ . Идёт такая ошибка : COM object of class '{648A5600-2C6E-101B-82B6-000000000014}' could not be created. Ensure that the object has been properly registered on computer 'RIMANTAS'. Object 'COM' could not be created ... И немогу понять , почему я немогу пускать етого ОСХ-а . Регистрация проходит , в регистре ключ есть ... как и всё хорошо ... С уважением , Римантас |
|
07.10.2008, 16:51 | #27 |
Участник
|
Цитата:
Сообщение от Rimantas
Спасибо вам , Лев , за помочь ...
Осталось одна проблема - немогу вызвать MsComm32.ОСХ . Идёт такая ошибка : COM object of class '{648A5600-2C6E-101B-82B6-000000000014}' could not be created. Ensure that the object has been properly registered on computer 'RIMANTAS'. Object 'COM' could not be created ... И немогу понять , почему я немогу пускать етого ОСХ-а . Регистрация проходит , в регистре ключ есть ... как и всё хорошо ... С уважением , Римантас Код: REGEDIT HKEY_CLASSES_ROOT\Licenses = Licensing: Copying the keys may be a violation of established copyrights. // The 16 bit and 32-bit OCX Professional license follows: HKEY_CLASSES_ROOT\Licenses\DB4C0D00-400B-101B-A3C9-08002B2F49FB = mgkgtgnnmnmninigthkgogggvmkhinjggnvm // The 32 bit OCX Professional license follows: HKEY_CLASSES_ROOT\Licenses\7BC20EDC-4A42-101B-A3C9-08002B2F49FB = gifblihbhiiihbciocfbkifbqcfcdiebbiqh // spin32 DB key // anibtn DB key // gauge 7B key // grid DB key // keysta DB key // msoutl DB key // threed DB key |
|
26.11.2008, 18:48 | #28 |
Британский учённый
|
Решил добавить еще один пример работы с RS-232 он же COM.
Использован код AndyD, за что ему большое спасибо! Принцип работы - непосредственно через WinApi, по таймеру.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
|
За это сообщение автора поблагодарили: mbal (1), jasper (1), Ace of Database (10). |
16.05.2014, 14:44 | #29 |
Участник
|
Подниму тему.
Понимаю, конечно, что это скорее всего невозможно, но спрошу на всякий случай. Если посмотреть на различные примеры функций обработки КОМ-портов для сканеров ШК, то видим, что имя порта, к которому подключено устройство указывается строкой. Так как мой сканер использует первый следующий свободный порт (что на каждом компьютере может быть разным), получется потребуется производить настройку порта для каждого пользователя/компьютера индивидуально. Вопрос: существуют ли способы определить к какому порту подключено моё устройство-сканер на текущей машине? Или давать каждому пользователю возможности настройки КОМ-порта для подключения сканера (скажем, прямо на форме) вручную и запоминать их через 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(); |
|
16.05.2014, 17:03 | #30 |
Участник
|
Лучше создать настроечную табличку жёсткого соответствия ComputerName - COM порт. Если нельзя такого сделать можно смотреть в сторону команды change port, devcon. И если работаете через эмулятор USB-COM , то лучше административными мерами запретить пользователям переподключать сканеры к разным машинам, так как система выдает новые номера COM портов согласно идентификатору устройства.
|
|
|
За это сообщение автора поблагодарили: Cardagant (1). |
16.05.2014, 17:26 | #31 |
Участник
|
Использую эмулятор USB-COM.
Спасибо за ответ! В принципе, так и думал. Сейчас задумался, возможно стоит поразмыслить об использовании мканера в режиме HID-клавиатуры (или разрыва клавиатуры) с настройками ASCII префиксов/суффиксов (Ctrl + N and Ctrl + S при работе с Grid). Или же перехватывать специальную клавишу, настроенную как префикс (например, F1) и производить обработку. Или вообще просто на validateField() таблицы проверять корректность введённого значения без всего вышеуказанного. Как считаете, что может быть эффективнее в плане реализации и использования? Последний раз редактировалось Cardagant; 16.05.2014 в 17:38. |
|
16.05.2014, 18:31 | #32 |
Участник
|
Если есть терпение и время, очень интересно попробовать сделать перехват сообщений от HID клавиатуры с фильтром по VID/PID . Конечно проще настроить префикс и ловить данные со сканера в активный элемент с нулевой высотой к примеру.
|
|
01.09.2014, 11:42 | #33 |
Участник
|
Добрый день!
Приведенный код .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(); |
|