Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Получение данных со считывателя через COM порт


Автор: Jen5on 17.11.2009, 22:37
Есть считыватель для бесконтактных карт. Подключается через COM порт + разъем для клавиатуры. 
Считываю с помощь программы в архиве. (там исходник и ехе-шник). Это стандартная программа для чтения/записи данных из com порта.

Получать должен число от 5 до 11 знаков, но вмето этого получаю кракозябры. 
Числа же не обязательно преводить в ANSI, но пробовал и так результат то же.
Моежет кому приходилось работать со считывателем???
И еще, зачем считыватель подключается еще к разъему для клавиатуры?

Буду премного благодарен за любую информацию.

Автор: mrbrooks 18.11.2009, 09:18
Цитата(Jen5on @  17.11.2009,  22:37 Найти цитируемый пост)

Получать должен число от 5 до 11 знаков

от чего это зависит?

Цитата(Jen5on @  17.11.2009,  22:37 Найти цитируемый пост)
но вмето этого получаю кракозябры. 

Это нормально. Преобразуй приходящие байты (а они у тебя char) к целым. Обычно в шестнадцатиричной системе.

Автор: Jen5on 18.11.2009, 09:51
Количество знаков зависит от того какой код был зашит в карточку (скажем так).

Спасибо большое за совет! Буду пробовать.  smile 

Автор: mrbrooks 18.11.2009, 11:10
Цитата(Jen5on @  18.11.2009,  09:51 Найти цитируемый пост)
Количество знаков зависит от того какой код был зашит в карточку (скажем так).

из этого следует что принимаемый буфер постоянен. в таком случае его парсинг не составит труда.  smile 

Автор: Jen5on 27.11.2009, 15:18
Попытался перевести строку в число с помощью:
Код

void __fastcall T::Printing()
{
        long ch;
        ch = strtoul((char*)bufrd,NULL,0);
        MainForm->Memo1->Lines->Add(FloatToStr(ch));
        MainForm->Memo1->Lines->Add((char*)bufrd);
        memset(bufrd, 0, BUFSIZE); //очистить буфер (чтобы данные не накладывались друг на друга)
}


А результат такой
http://ipicture.ru/

Я на всякий случай прилагаю исходник.
Я так понимаю что преобразование происходит не успешно раз ноль выдает.
Может сразу видно ошибку подскажите пожалуйста.

Автор: mrbrooks 27.11.2009, 16:02
Как то ты не по христиански переводишь. Тем более в билдере.
Если ты точно уверен что в буфере целое число то:

Код

int res = String(bufrd).ToIntDef(0);


вернет тебе либо число, либо 0 в случае неудачи.

Добавлено через 4 минуты и 38 секунд
интересный подход камрад  
Цитата(Jen5on @  27.11.2009,  15:18 Найти цитируемый пост)
Попытался перевести строку в число с помощью:

Код

void __fastcall T::Printing()
{
        long ch;
        ch = strtoul((char*)bufrd,NULL,0);
        MainForm->Memo1->Lines->Add(FloatToStr(ch));
}



буфер в целое, а потом целое, как вещественное, в строку. smile 

Автор: Jen5on 27.11.2009, 17:24
Попробовал так:

Код

 int res = String((char*)bufrd).ToIntDef(0);
 Form1->Memo1->Lines->Add(IntToStr(res)); //выводим принятую строку в Memo


Выдает "0". 
smile 

Наверно опять учудил... smile 

Автор: Jen5on 30.11.2009, 09:59
А зачем считыватель кроме COM-порта подключается еще к разъему для клавиатуры?

Автор: Platov 30.11.2009, 10:55
Цитата

А зачем считыватель кроме COM-порта подключается еще к разъему для клавиатуры? 

Может разработчики считывателя както хотели вводить пинкод?

Автор: xvr 30.11.2009, 17:19
Цитата(Jen5on @ 30.11.2009,  09:59)
А зачем считыватель кроме COM-порта подключается еще к разъему для клавиатуры?

Скорее всего для получения питания на считыватель.
Попробуй подключиться к считывателю обычным терминалом и посмотреть, что он отправляет. Судя по твоим строкам - это совсем не текст (или скорость COM порта не настроенна)

Автор: Jen5on 2.12.2009, 13:49
Это по идее должно быть число. от 5 до 12-11 знаков.
Скорость на 9600. А в первом сообщении в исходнике ее менять даже можно, но от етого лучше не становится smile 

Может есть какая документация по работе со считывателями (но только для программиста)?

Добавлено через 13 минут и 41 секунду
 smile  smile  smile 

Нашел на одном сайте))))

http://aksep-t.com/predlagaem.html

Посмотрим как оно...

Описание работы с устройство

1.    Правильно подключите изделие к персональному компьютеру в соответствие с разделом Подключение (не забывайте о необходимости подключения внешнего источника питания 12В.)
2.    Запустите программу Hyper terminal, входящую в поставку Windows.
3.    Создайте соединение с параметрами: скорость – 9600 бод., 8бит, без четности, 1 стоповый бит.
4.    Поднесите карту к считывателю.
5.    Прочтите код карты в окне Hyper terminal.

     #F5674CE…….., где #F - признак начала считанного кода. После этих символов идет тело секретного кода.

Автор: xvr 2.12.2009, 17:16
Посмотрел на прогу, чтение из порта сделано неправильно.
  •  Нулевые таймауты для COM порта обычно не ставят - будешь получать символы поштучно, если повезет  smile 
  •  WaitCommEvent не нужен - делай сразу ReadFile и жди на ЕГО overlapped (только timeout'ы COM порту все же поставь осмысленные)
  •  Результат ReadFile стоит проверять, и уж точно стоит проверять реальный размер считанных данных, а не брать btr вместо этого
  •  Прочтенная строка не завершается 0, так что в нее попадает всякий мусор за последним прочтенным с COM символом, что и наблюдается

Автор: Jen5on 2.12.2009, 17:25
спасибо огромное!!!
Учту все замечания. smile 

Автор: Dimitriy 10.12.2009, 15:28
Не хочу тему создавать, српошу тут, примерно та же проблема но с русскими буквами.

Посылаю в COM порт например "Привет!" а принимаю крякозябры, с английскими буквами всё ок.

Такое только в С++ Rad Studio 2009 и 2010, в Borland 2006 всё нормально.

Подскажите как перевести крякозябры в String?

Автор: xvr 10.12.2009, 18:38
Цитата(Dimitriy @ 10.12.2009,  15:28)
Посылаю в COM порт например "Привет!" а принимаю крякозябры, с английскими буквами всё ок.

Такое только в С++ Rad Studio 2009 и 2010, в Borland 2006 всё нормально.

Ключевое слово - Unicode. В RAD 2009 он уже есть, так что в порт отправляются не русские буквы в 1251 кодировке, а младшие половинки от Unicode'овых русских символов
Цитата

Подскажите как перевести крякозябры в String?
Перевести в не-Unicode (какая то из ?_str() функций вроде выдает char*)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)