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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.11.2008, 18:48   #1  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Решил добавить еще один пример работы с RS-232 он же COM.
Использован код AndyD, за что ему большое спасибо!
Принцип работы - непосредственно через WinApi, по таймеру.
Изображения
Тип файла: bmp BarCode_Form.bmp (132.0 Кб, 586 просмотров)
Вложения
Тип файла: xpo BarCodeScan_Example.xpo (11.4 Кб, 683 просмотров)
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
За это сообщение автора поблагодарили: mbal (1), jasper (1), Ace of Database (10).
Старый 16.05.2014, 14:44   #2  
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   #3  
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   #4  
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   #5  
virhundo is offline
virhundo
Участник
 
33 / 16 (1) ++
Регистрация: 29.03.2007
Если есть терпение и время, очень интересно попробовать сделать перехват сообщений от HID клавиатуры с фильтром по VID/PID . Конечно проще настроить префикс и ловить данные со сканера в активный элемент с нулевой высотой к примеру.
Старый 01.09.2014, 11:42   #6  
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, время: 00:04.