Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2014, 12:41   #1
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию Работа со сканером шрихкодов через TBComPort

Сканер подключен через com.
Использую
Код:
procedure TDm.BComRxChar(Sender: TObject; Count: Integer);
var
  S : AnsiString;
begin
BCom.ReadStr(s, Count);
showmessage(s);
// Передаю s в функцию поиска товара по штрих коду в БД.
end;
получаю 2 мессаги, причем при использовании одного типа штрихкода - в одной первую половину, во второй вторую половину. при использовании другого типа - в первой месаге весь штрихкод вторая - пустая.
Почему у меня месага 2 раза?
Как мне при разделении ШК на 2 части соединить в одну и передать и передать ШК в функцию поиска по БД?
Спасибо.
tarakan1983 вне форума Ответить с цитированием
Старый 22.03.2014, 12:48   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Почему у меня месага 2 раза?
Что гласит документация по сканеру?
Цитата:
Как мне при разделении ШК на 2 части соединить в одну
Конкатенация не помогает?
Цитата:
передать ШК в функцию поиска по БД
Что собой представляет функция поиска по БД? Функцию в студию.
Streletz вне форума Ответить с цитированием
Старый 22.03.2014, 12:53   #3
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Что гласит документация по сканеру?
По этому поводу я ничего там не нашел!
Цитата:
Конкатенация не помогает?
Что это? можно подробнее?
Цитата:
Что собой представляет функция поиска по БД? Функцию в студию.
есть FibDataset.
ему передаю
Код:
selectSql.add('SELECT * FROM TOVAR WHERE BARCODE LIKE :BARCODE');
parambyNAME('BARCODE').asstring=S;
active=tru;
примерно такая функция, там получаю ID товара и дальше еще много чего
tarakan1983 вне форума Ответить с цитированием
Старый 22.03.2014, 13:02   #4
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Что это? можно подробнее?
Конкатенация - операция соединения нескольких строк в одну. Простейший пример:
Код:
s1:='aaa';
s2:='bbb';
s1:=s1+s2;
//Результат будет: aaabbb
Синтаксис SQL запроса правильный. В чём конкретно состоит проблема с передачей штрих кода в запрос к БД?
Streletz вне форума Ответить с цитированием
Старый 22.03.2014, 13:11   #5
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

ну смотрите предположим пишу такую процедуру
Код:
procedure TDm.BComRxChar(Sender: TObject; Count: Integer);
var
  S : AnsiString;
begin
s:=''; //обнуляем s
BCom.ReadStr(s, Count);
//showmessage(s);
// Передаю s в функцию поиска товара по штрих коду в БД.
s:=s+s;
IDTOVARA=Poisk_v_BD(s);
end;
Получается функция поиска прогоняется 2 раза по первой половине ШК и по всему ШК в случае разделения ШК пополам, и когда в первый раз не находит, то IDTOVARA становиться 0 и получается чихарда!
Дело в том, что если функция находит товар она добавляет его в текущий чек, иначе выдает месагу о том что товар не найден

Последний раз редактировалось tarakan1983; 22.03.2014 в 13:15.
tarakan1983 вне форума Ответить с цитированием
Старый 22.03.2014, 13:57   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Мессаги склеивать и проверять CRC кода, это очевидно.

А вообще, у вас что-то с настройками порта, таймаутов, размера буфера. Если такое творится и в стороннем терминале с данными, то значит сие особенность ПО сканнера.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 22.03.2014 в 13:59.
raxp вне форума Ответить с цитированием
Старый 22.03.2014, 14:12   #7
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от tarakan1983 Посмотреть сообщение
ну смотрите предположим пишу такую процедуру
Код:
procedure TDm.BComRxChar(Sender: TObject; Count: Integer);
var
  S : AnsiString;
begin
s:=''; //обнуляем s
BCom.ReadStr(s, Count);
//showmessage(s);
// Передаю s в функцию поиска товара по штрих коду в БД.
s:=s+s;
IDTOVARA=Poisk_v_BD(s);
end;
Получается функция поиска прогоняется 2 раза по первой половине ШК и по всему ШК в случае разделения ШК пополам, и когда в первый раз не находит, то IDTOVARA становиться 0 и получается чихарда!
Дело в том, что если функция находит товар она добавляет его в текущий чек, иначе выдает месагу о том что товар не найден
А, где у Вас в процедуре чтение второй части штрих кода?
Если Вы запустите процедуру в таком виде, то у Вас получится, что 1я и 2я половины будут одинаковые. Посмотрите Ваш код внимательно.
Сделайте чтение 2й половины. И, только после этого, данные из обеих половин склеивайте конкатенацией.
Streletz вне форума Ответить с цитированием
Старый 22.03.2014, 14:18   #8
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
А, где у Вас в процедуре чтение второй части штрих кода?
Если Вы запустите процедуру в таком виде, то у Вас получится, что 1я и 2я половины будут одинаковые. Посмотрите Ваш код внимательно.
Сделайте чтение 2й половины. И, только после этого, данные из обеих половин склеивайте конкатенацией.
Я же объясняю, я запускаю процедуру 1 раз
Код:
BCom.ReadStr(s, Count);
showmessage(s);
а получаю 2 сообщения, и не пойму почему так происходит!
tarakan1983 вне форума Ответить с цитированием
Старый 22.03.2014, 14:32   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

- описание настроек порта для сканнера из его доков в тему
- описание настроек порта в вашей утилите в тему
- логи посылок сканнера сниффером Portmon в HEX отображении в виде экспорта в txt-файл в тему

Штрих-код имеет контрольную сумму. Объединить две посылки в одну и проверить CRC, если они таковыми и являются - не проблема.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 22.03.2014, 15:37   #10
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Всем спасибо за внимание, глюк в компоненте.
У самой компоненты в функции ReadStr(s, Count) : Integer;
в самом начале поставил Sleep(50) и все стало на свои места.
Потому что в режиме отладки все работает нормально, а скомпилированый проект такую фигню делает.
tarakan1983 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа со сканером kodagen Общие вопросы C/C++ 3 17.08.2011 12:27
Работа со сканером HP Scanjet AlexNez Компоненты Delphi 2 28.02.2011 12:02
Работа со сканером в Delphi artemavd Общие вопросы Delphi 20 01.07.2010 09:41
Работа со сканером Terran Софт 3 06.01.2009 13:58