Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение данных со считывателя через COM порт, получаю кракозябры 
:(
    Опции темы
Jen5on
Дата 17.11.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.10.2008
Где: Белорусь, г. Мин ск

Репутация: нет
Всего: нет



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

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

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

Присоединённый файл ( Кол-во скачиваний: 44 )
Присоединённый файл  comprogs.rar 411,07 Kb
PM MAIL   Вверх
mrbrooks
Дата 18.11.2009, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



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

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

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

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

Это нормально. Преобразуй приходящие байты (а они у тебя char) к целым. Обычно в шестнадцатиричной системе.
PM MAIL   Вверх
Jen5on
Дата 18.11.2009, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.10.2008
Где: Белорусь, г. Мин ск

Репутация: нет
Всего: нет



Количество знаков зависит от того какой код был зашит в карточку (скажем так).

Спасибо большое за совет! Буду пробовать.  smile 
PM MAIL   Вверх
mrbrooks
Дата 18.11.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



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

из этого следует что принимаемый буфер постоянен. в таком случае его парсинг не составит труда.  smile 
PM MAIL   Вверх
Jen5on
Дата 27.11.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.10.2008
Где: Белорусь, г. Мин ск

Репутация: нет
Всего: нет



Попытался перевести строку в число с помощью:
Код

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); //очистить буфер (чтобы данные не накладывались друг на друга)
}


А результат такой
user posted image

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

Это сообщение отредактировал(а) Jen5on - 27.11.2009, 15:20

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  Thread.rar 35,15 Kb
PM MAIL   Вверх
mrbrooks
Дата 27.11.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



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

Код

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 
PM MAIL   Вверх
Jen5on
Дата 27.11.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.10.2008
Где: Белорусь, г. Мин ск

Репутация: нет
Всего: нет



Попробовал так:

Код

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


Выдает "0". 
smile 

Наверно опять учудил... smile 
PM MAIL   Вверх
Jen5on
Дата 30.11.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.10.2008
Где: Белорусь, г. Мин ск

Репутация: нет
Всего: нет



А зачем считыватель кроме COM-порта подключается еще к разъему для клавиатуры?
PM MAIL   Вверх
Platov
Дата 30.11.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.7.2009

Репутация: 2
Всего: 2



Цитата

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

Может разработчики считывателя както хотели вводить пинкод?
PM MAIL   Вверх
xvr
Дата 30.11.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



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

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

PM MAIL   Вверх
Jen5on
Дата 2.12.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.10.2008
Где: Белорусь, г. Мин ск

Репутация: нет
Всего: нет



Это по идее должно быть число. от 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 - признак начала считанного кода. После этих символов идет тело секретного кода.


Это сообщение отредактировал(а) Jen5on - 2.12.2009, 13:51
PM MAIL   Вверх
xvr
Дата 2.12.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



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

PM MAIL   Вверх
Jen5on
Дата 2.12.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.10.2008
Где: Белорусь, г. Мин ск

Репутация: нет
Всего: нет



спасибо огромное!!!
Учту все замечания. smile 
PM MAIL   Вверх
Dimitriy
Дата 10.12.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.8.2007
Где: Пермская область

Репутация: нет
Всего: нет



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

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

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

Подскажите как перевести крякозябры в String?
PM MAIL WWW ICQ   Вверх
xvr
Дата 10.12.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



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

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

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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0736 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.