AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.10.2008, 15:30   #21  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от lev Посмотреть сообщение
у нас это реализовано с помощью element.setTimeOut("GetBarcode", TimeOut);
на формах геде должно быть сканирование добавляется метод GetBarcode();
в init() формы инициализируется ком порт и выставляется таймер на просмотр метода GetBarcode();
в этом методе проверяем есть ли что в ком порте, а далле получаем штрих код, и делаем всё что нам надо.
Попробывал я по вашим советам . В init СОМ1 порт открываеться , всё как и работает , но вот в методе GetBarkod всё повеситься на Read ... . Что неправильно я здесь сделаю ?

Код :
Код:
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 );
}
Пробывал считать и как контейнер , и как строку . Непонимаю чего нехватает етому comPrt.read() методу ...
Старый 02.10.2008, 16:10   #22  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
У нас немного по другому:
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  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от Rimantas Посмотреть сообщение
Здраствуйте ,

По поиску нашёл классы от EVGL ( SF_MSComm32 ) . Но никак не могу найти решения , как считать информацию из СОМ порта и поставить инфо в нужное поле в форме . Имеем здесь несколько старых рабочих сканеров , которые привязанные к СОМ портам . Надо считать баркоды и поставить их в форму . Обьект классы создаеться , СОМ порт открываеться - дальше не понимаю , как описать опознание и наблюдение процесса СОМ порта ...

Заранее спасибо за помочь ! С уважением , Римантас
В упомянутом классе SF_MSComm32 (точнее, в xxxAppl, в надстройках) для этого использовался цикл с постоянным опросом порта. Кажется.
Старый 02.10.2008, 20:26   #24  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Здесь Работа с COM-портом рассматривалась возможность работы со сканерами из Аксапты, в том числе прямое считывание с com-порта.
Но я бы посоветовал найти программу для перенаправления с com-порта на клавиатуру и просто обрабатывать клавиатурный ввод
__________________
Axapta v.3.0 sp5 kr2
Старый 03.10.2008, 09:31   #25  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от lev Посмотреть сообщение
У нас немного по другому:
X++:
void init()
{
   ...
   sc = new ComPortMSComm();
   sc.initParmDefault();
   ...
}
Где можно найти етот класс - ComPortMsComm ?
Старый 06.10.2008, 17:30   #26  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от Rimantas Посмотреть сообщение
Где можно найти етот класс - ComPortMsComm ?
Спасибо вам , Лев , за помочь ...

Осталось одна проблема - немогу вызвать 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 is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от 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 ...

И немогу понять , почему я немогу пускать етого ОСХ-а . Регистрация проходит , в регистре ключ есть ... как и всё хорошо ...

С уважением , Римантас
Все проблемы решены ! Всё работает . Для успешной регистрации ОСХ-а , надо ещё добавить в реестр такое ( vbctrs.reg файлик ) :

Код:
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  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Решил добавить еще один пример работы с RS-232 он же COM.
Использован код AndyD, за что ему большое спасибо!
Принцип работы - непосредственно через WinApi, по таймеру.
Изображения
Тип файла: bmp BarCode_Form.bmp (132.0 Кб, 519 просмотров)
Вложения
Тип файла: xpo BarCodeScan_Example.xpo (11.4 Кб, 617 просмотров)
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
За это сообщение автора поблагодарили: mbal (1), jasper (1), Ace of Database (10).
Старый 16.05.2014, 14:44   #29  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Подниму тему.

Понимаю, конечно, что это скорее всего невозможно, но спрошу на всякий случай. Если посмотреть на различные примеры функций обработки КОМ-портов для сканеров ШК, то видим, что имя порта, к которому подключено устройство указывается строкой. Так как мой сканер использует первый следующий свободный порт (что на каждом компьютере может быть разным), получется потребуется производить настройку порта для каждого пользователя/компьютера индивидуально.
Вопрос: существуют ли способы определить к какому порту подключено моё устройство-сканер на текущей машине? Или давать каждому пользователю возможности настройки КОМ-порта для подключения сканера (скажем, прямо на форме) вручную и запоминать их через 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  
virhundo is offline
virhundo
Участник
 
33 / 16 (1) ++
Регистрация: 29.03.2007
Лучше создать настроечную табличку жёсткого соответствия ComputerName - COM порт. Если нельзя такого сделать можно смотреть в сторону команды change port, devcon. И если работаете через эмулятор USB-COM , то лучше административными мерами запретить пользователям переподключать сканеры к разным машинам, так как система выдает новые номера COM портов согласно идентификатору устройства.
За это сообщение автора поблагодарили: Cardagant (1).
Старый 16.05.2014, 17:26   #31  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Использую эмулятор USB-COM.
Спасибо за ответ! В принципе, так и думал.

Сейчас задумался, возможно стоит поразмыслить об использовании мканера в режиме HID-клавиатуры (или разрыва клавиатуры) с настройками ASCII префиксов/суффиксов (Ctrl + N and Ctrl + S при работе с Grid).
Или же перехватывать специальную клавишу, настроенную как префикс (например, F1) и производить обработку.
Или вообще просто на validateField() таблицы проверять корректность введённого значения без всего вышеуказанного.
Как считаете, что может быть эффективнее в плане реализации и использования?

Последний раз редактировалось Cardagant; 16.05.2014 в 17:38.
Старый 16.05.2014, 18:31   #32  
virhundo is offline
virhundo
Участник
 
33 / 16 (1) ++
Регистрация: 29.03.2007
Если есть терпение и время, очень интересно попробовать сделать перехват сообщений от HID клавиатуры с фильтром по VID/PID . Конечно проще настроить префикс и ловить данные со сканера в активный элемент с нулевой высотой к примеру.
Старый 01.09.2014, 11:42   #33  
byte is offline
byte
Участник
 
36 / 31 (2) +++
Регистрация: 21.08.2007
Добрый день!

Приведенный код .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();
Теги
com port, rs232, winapi, ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
COM / RS232 simple intergation project EVGL DAX: База знаний и проекты 10 18.03.2014 15:04
Kurt Hatlevik: Sneak preview of the WMS E&E Blog bot DAX Blogs 0 20.11.2008 01:10
msdynamicsax: VB script that test the com connector for Dynamics Ax 4.0 Blog bot DAX Blogs 0 25.08.2008 18:05
Solutions Monkey: Enterprise Portal Screencasts at Channel9.msdn.com Blog bot DAX Blogs 6 01.07.2008 19:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:57.