Прочитать COM порт

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Андрей
Старожил
Сообщения: 280
Зарегистрирован: 30 Октябрь 2005, 3:58

Прочитать COM порт

Сообщение Андрей »

Всех приветствую !

Возникла задача взять данные с COM порта. Изучив форум, вижу что топики старые и что-то у меня ничего не получается. Да собственно как получится, если нет в системе никакого WinComm.dll ?
Module('WinComm.dll')

CreateFile(*CString lpFileName, ULONG DesiredAccess, ULONG ShareMode, |
ULONG SecurityAttributes=0, ULONG CreationDisposition, ULONG Flags, |
UnSigned TemplateFile=0),UnSigned, PASCAL,RAW,Name('CreateFileA'),DLL(TRUE)
Не поделится ли кто примером работающего кода ?
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5874
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 24 раза
Поблагодарили: 86 раз

Прочитать COM порт

Сообщение finsoftrz »

Заодно отправка смс через модем.
Вложения
fscom.clw
(19.56 КБ) 17 скачиваний
fscom.inc
(2.47 КБ) 18 скачиваний
C6/C12, ШВС, tps/btrieve.
Андрей
Старожил
Сообщения: 280
Зарегистрирован: 30 Октябрь 2005, 3:58

Прочитать COM порт

Сообщение Андрей »

Спасибо !

Еще бы парочку строчек кода примера, мне только чтение :)

Начало типа такого как понял
FsComL.Init('COM3')
FsComL.SetUpString('baud=9600')

А само чтение - как там использовать эту функцию и проверять буфер порта ?
FsComL.Read(l:buf,?,?)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5874
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 24 раза
Поблагодарили: 86 раз

Прочитать COM порт

Сообщение finsoftrz »

Подключение да, примерно так. Лучше вариант, который поддерживает более одной цифры в номере com порта. После запуска процедуры инициализация класса:

Код: Выделить всё

  if FsComScan.Init('\\.\COM' & PAR:DevScanCom)=0
     message('Ошибка подключения сканера: ' & clip(FsComScan.LastError))
  else   
     if FsComScan.SetUpString('baud=9600 parity=N data=8 stop=1')=0
           message('Ошибка при установке параметров порта: ' & clip(FsComScan.LastError))
     .  
  . 
Перед завершением процедуры:

Код: Выделить всё

    FsComScan.Kill
Для чтения надо на окно повесить таймер. В событии обработки EVENT:Timer прописать код чтения, типа такого:

Код: Выделить всё

    window{PROP:TIMER}=0
    Loc:BarCode=''
     loop
         if FsComScan.Read(Loc:Buffer,1,Loc:BytesRead)=0
            break
        .
        if Loc:BytesRead=0
            break
        .
        if Loc:Buffer[1] = '<10>'
           cycle
        .
        if Loc:Buffer[1] = '<02>'
           cycle
        .
        if Loc:Buffer[1] = '<03>'
           cycle
        .
        if Loc:Buffer[1] = '<13>'  !завершение штрих-кода
            break
        .
        Loc:BarCode = clip(Loc:BarCode) & Loc:Buffer[1]
      .

      if Loc:BarCode<>''
         loc:shtrih=Loc:BarCode
      .

     window{PROP:TIMER}=100

В примере переменные

Код: Выделить всё

loc:shtrih          string(150)
Loc:BarCode      string(150)
Loc:Buffer          cstring(255)
Loc:BytesRead    ulong
Последний раз редактировалось finsoftrz 09 Март 2026, 7:40, всего редактировалось 1 раз.
C6/C12, ШВС, tps/btrieve.
Андрей
Старожил
Сообщения: 280
Зарегистрирован: 30 Октябрь 2005, 3:58

Прочитать COM порт

Сообщение Андрей »

Благодарю !
Но что-то у меня не получается, не пойму как так.
Объявляю экземпляр хоть в локальных, хоть в глобальных
FsComL FsCom

Проверка подключения проходит. Однако когда добавляю основную обработку в таймере, получаю ошибку
на
if FsComL.Read(Loc:Buffer,1,Loc:BytesRead)=0

Unknown function label и No matching prototype available
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5874
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 24 раза
Поблагодарили: 86 раз

Прочитать COM порт

Сообщение finsoftrz »

Код: Выделить всё

Loc:Buffer          cstring(255)
C6/C12, ШВС, tps/btrieve.
kreator
✯ Ветеран ✯
Сообщения: 5310
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 12 раз
Поблагодарили: 28 раз

Прочитать COM порт

Сообщение kreator »

Андрей, я тоже использую подобный класс. Уже не помню кто автор. Только советовали делать так. Делаю функцию на основе этого класса. Вызываю её в отдельном потоке при запуске программы. Эта функция постоянно читает порт и записывает данные в глобальную очередь. А там, где надо, читаем данные из очереди. И если успешно, то обрабатываем и записи из очереди удаляем.
В общем, если не получиться, могу предоставить мой вариант.
We are hard at work… for you. :)
Аватара пользователя
Admin
Администратор
Сообщения: 4048
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 70 раз
Поблагодарили: 47 раз
Контактная информация:

Прочитать COM порт

Сообщение Admin »

В свое время вообще перешел не отдельную программу которая читала из порта данные в файл, а уже из файла программы подхватывали.
Из плюсов, все программы могли одновременно работать + на терминальном сервере при логине под одним именем тоже работало так как файлы делились по номеру сессии. В ту же программу добавил хоткей на вызов окошка для ввода штрихкода, на случай когда сканер сломан или он клавиатурный и не предусмотрена его обработка в каком то месте программ.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5874
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 24 раза
Поблагодарили: 86 раз

Прочитать COM порт

Сообщение finsoftrz »

Есть еще утилита (использует тот же класс работы с com), которая вешается в трей, читает из com порта и результат кладет в клавиатурный буфер. В результате в приложении можно работать одинаково как с клавиатурным сканером, так и со сканером, подключенным через com, в обычных полях ввода.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8564
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 37 раз
Поблагодарили: 127 раз

Прочитать COM порт

Сообщение Игорь Столяров »

Андрей писал(а): 08 Март 2026, 11:07 Не поделится ли кто примером работающего кода ?
В архивах есть вот такой класс для работы с COM портом.
Взято из открытых источников, краткое описание прилагается.
Сам я его не юзал - т.к. нет задач и потребности. 🤷‍♀️
Автор: г-н Истомин А.А.
Вложения
comport.zip
Класс для COM порта
(8.57 КБ) 3 скачивания
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5874
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 24 раза
Поблагодарили: 86 раз

Прочитать COM порт

Сообщение finsoftrz »

Игорь Столяров писал(а): 10 Март 2026, 8:55 Сам я его не юзал - т.к. нет задач и потребности. 🤷‍♀️
А как Вы со сканером на com порту работаете? Практически все торговое оборудование через com порт (или его эмуляцию) подключается к ПК.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8564
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 37 раз
Поблагодарили: 127 раз

Прочитать COM порт

Сообщение Игорь Столяров »

finsoftrz писал(а): 10 Март 2026, 9:48 А как Вы со сканером на com порту работаете
А мы и не работаем с COM портом вообще. Немцы-то ушли уже ... :D
Только USB & HID интерфейс (буфер клавиатуры). И никогда не работали. Нет нигде уже COM портов-то этих.
Лет 20 назад вопрос поднимался для обмена с каким-то драйвером ККТ (АТОЛ ?) ... но как-то обошлось. :D

Всё оборудование сейчас прекрасно поддерживает обмен через USB / HID или буфер клавиатуры.
Эмуляция COM порта имеет смысл, если есть ископаемый софт и его нужно заставить работать с современным оборудованием.
Нам проще изменить прикладную программу, чем заставлять юзеров настраивать эмуляции и потом ещё с этими эмуляциями
и самим иметься ... 🤦‍♀️
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5874
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 24 раза
Поблагодарили: 86 раз

Прочитать COM порт

Сообщение finsoftrz »

Понятно, у Вас самое современное ПО, разработанное на самом современном инструменте разработки, которое работает только с самыми современными версиями операционной системы и самым современным оборудованием. :lol:
Если серьезно, то в специализированных POS системах картина другая. Некоторые виды оборудования работают только через com, клавиатурные сканеры там не используют.
Если Вы можете сказать клиенту, наше ПО не работает с таким оборудованием, то не факт, что это приведет к покупке нового оборудования. Это как с Windows7, Вы объявляете, что больше не поддерживаете ее, а приходит клиент и вправляет мозги на место. :-)
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8564
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 37 раз
Поблагодарили: 127 раз

Прочитать COM порт

Сообщение Игорь Столяров »

finsoftrz писал(а): 10 Март 2026, 10:30 то в специализированных POS системах работают только через com, клавиатурные сканеры там не используют
Есть такое. Но для POS систем, как правило, и свой софт. Там как бы идёт рабочее место кассира "всё включено".
Что касается остального ... Вы давно устройство с COM портом видели ? А сам COM порт на компьютере ?
Я реально уже лет 5 не видел точно, а может и больше. Ни в ремонте, ни у пользователей.

Был такой большой период, где-то между 2005 - 2015 г., когда все занимались своим делом и прикладной
торговый софт работал лет по 5 без изменений. Сейчас каждый год законодательство всё ставит с ног на голову.
И если уж прикручивается, например, тот же ТС ПИоТ, то заменить эмуляцию COM порта на нативный HID проблем не составляет.
Хотя бы для простоты настройки у пользователей. Потому что настройка эмуляции, да ещё и в терминале - это нужно уметь. 😎
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
George
Активист
Сообщения: 113
Зарегистрирован: 04 Август 2009, 10:48
Благодарил (а): 2 раза

Прочитать COM порт

Сообщение George »

Добрый день!
В свое время использовал вот это.
Вложения
voyager.zip
(2.64 КБ) 1 скачивание
Ответить