Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.07.2011, 14:48
fen fen вне форума
Прохожий
 
Регистрация: 23.01.2008
Сообщения: 7
Репутация: 10
По умолчанию Как преобразовать данные с COM-порта

Тема: Необходимо преобразовать данные, полученные с COM-порта (с бесконтактной карты EmMarine, поднесенной к proximity-считывателю) в десятичный формат (должны получить числовой идентификатор типа 61281581286128254128696102152254128120128254)
Код:
procedure TMainForm.ReadDataClick(Sender: TObject);
Var
  RCBuf:PChar;        //Буфер данных для приема
  nToRead:Cardinal;   //Число байт для чтения
  nRead:Cardinal;     //Число прочитанных байт
  ComStat:TComStat;   //Состояние порта
  Errs:Dword;
begin
  ClearCommError(POrt,Errs,@ComStat); //Считываем состояние порта
  nToRead:=ComStat.cbInQue;  //Считываем число байт для чтения из структуры
  nToReadLabel.Caption:=IntToStr(nToRead);  //Выводим на форму число байт для чтения
  ReadFile(Port,RCBuf^,nToRead,nRead,nil);  //Считываем данные
  nReadLabel.Caption:=IntToStr(nRead);      //Выводим на форму число прочитанных байт
  RcDataLabel.Caption:=RCBuf; //Выводим на форму считанные данные
end;

proximity-считыватель присоединен к порту COM №1
Порт открывается
Число байт для чтения: 11
Число прочитанных байт: 11
Данные принимаются, но в формате иероглифов (см. скрин)


Как эти данные преобразовать в человеческий вид. Типа в 61281581286128254128696102152254128120128254. Как реализовать это через массив, или другими способами?
Ответить с цитированием
  #2  
Старый 05.07.2011, 14:50
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

В hex однако приходит, тебе нужно в 10-чное преобразовать
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 05.07.2011, 19:30
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Код:
var
  i:integer;
  tmpDec,tmpHex:string;
begin
  tmpHex:='';
  tmpDec:='';
  for i:=0 to nRead-1 do
  begin
    tmpDec:=tmpDec+IntToStr(byte(RCBuf[i]));// для десятичных значений
    tmpHex:= tmpHex+IntToHex(byte(RCBuf[i]),2);// для шестнадцатиричных значений
  end;
    RcDataLabel.Caption:=tmpDec;// то, что вам надо
// или    RcDataLabel.Caption:=tmpHex;
end;
без разницы в чем приходит - ведь приходят значения байтов ... а вот как это дело интерпретировать - в Hex, Integer или ASCII (как вы пытаетесь, но видимо ридер отвечает не в ASCII) - головная боль разработчика обработчика

З.Ы. буфер для приема (у вас RCBuf:PChar) лучше делать как Pointer и перед чтением распределять память, а потом освобождать (PChar - указатель на строку, где конец строки обозначается байтом со значением 0, а если в ответе устройства будет значение нуля, то данные после нуля (да и сам нуль) вы потеряете)
З.Ы.Ы. IntToHex, вроде как, начиная только с Delphi7, если Delphi младше (всякое бывает), то IntToHex писать самому - ну а тут гугл в помощь
З.Ы.Ы.Ы. RFID'ами балуетесь?

Последний раз редактировалось cotseec, 05.07.2011 в 20:35.
Ответить с цитированием
  #4  
Старый 06.07.2011, 19:17
fen fen вне форума
Прохожий
 
Регистрация: 23.01.2008
Сообщения: 7
Репутация: 10
Хорошо

Цитата:
Сообщение от cotseec
Код:
var
  i:integer;
  tmpDec,tmpHex:string;
begin
  tmpHex:='';
  tmpDec:='';
  for i:=0 to nRead-1 do
  begin
    tmpDec:=tmpDec+IntToStr(byte(RCBuf[i]));// для десятичных значений
    tmpHex:= tmpHex+IntToHex(byte(RCBuf[i]),2);// для шестнадцатиричных значений
  end;
    RcDataLabel.Caption:=tmpDec;// то, что вам надо
// или    RcDataLabel.Caption:=tmpHex;
end;

Благодарю за работающий код.
Цитата:
З.Ы.Ы. IntToHex, вроде как, начиная только с Delphi7, если Delphi младше (всякое бывает), то IntToHex писать самому - ну а тут гугл в помощь
Да,на Delphi 7.
Цитата:
З.Ы.Ы.Ы. RFID'ами балуетесь? :
Переписываю с нуля программу по учету посещений, рабочего времени на предприятии.
Проблема осталась в том, что предыдущая программа интерпретировала данные с RFID-карты как 612815812861289619224825415824815830248 (40 знаков), по твоему алгоритму выдаёт данные 1111160254255160255110147 (26 знаков).
Не хочется 150 карточек сотрудников перезаписывать в базу, но судя по всему придётся.
Ответить с цитированием
  #5  
Старый 06.07.2011, 22:55
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Цитата:
Сообщение от fen
Проблема осталась в том, что предыдущая программа интерпретировала данные с RFID-карты как 612815812861289619224825415824815830248 (40 знаков), по твоему алгоритму выдаёт данные 1111160254255160255110147 (26 знаков).
Не хочется 150 карточек сотрудников перезаписывать в базу, но судя по всему придётся.
а сколько за раз приходит байт? по идее как раз 26 (в моем примере цикл идет до значения количества пришедших байт), если так, то попробуйте увеличить системный буфер приема SetupComm, т.к. могут происходить склейки и разрывы данных, то накапливать данные в локальный буфер, а потом парсить. да и стоит попробовать просто посмотреть, что именно принимает переделываемая программа например вот этим и корректность скорости и прочих параметров стурктуры DCB
судя по разительному отличию данных "правильной" программы и вашей - вполне вероятно выставлена неверная скорость приема порта.

еще закрадываются смутные сомнения по поводу правильного понимания смысла приходящих данных т.е. их интерпретации... алгоритм, что я привел, подразумевает, что ридер присылает номер карточки никак "не обернутым" и в одном байте посылки содержится значение одной цифры номера...но это сможет показать уже тот же PortMon небезызвестного Руссиновича (ИМХО: программа хороша, но для коротких посылок/ответов; при размере посылки в 300 байт у меня отображала только первые 24 байта, но зато при отправке/приеме раз в 50-100 мс отлично себя показала), как альтернативу могу предложить Free Serial Port Monitor

Последний раз редактировалось cotseec, 06.07.2011 в 23:08.
Ответить с цитированием
  #6  
Старый 06.07.2011, 23:56
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Цитата:
Сообщение от fen
как 612815812861289619224825415824815830248 (40 знаков), по твоему алгоритму выдаёт данные 1111160254255160255110147 (26 знаков).
Не хочется 150 карточек сотрудников перезаписывать в базу, но судя по всему придётся.
Тут проблема в том как ты рассматриваешь данные, ведь
FFFF=65535, а можно FFFF=256256.

Первое что нужно сделать перевести в НЕХ по-байтно и уже смотреть.
Тоесть скажем ты получил
11111000 10101010 01101001
Переводишь в НЕХ:
F8 AA 69
А дальше уже нужно смотреть что именно использует прога.

И как уже заметил Aristarh:
61 28 15 81 28 61 28 - не факт что тут не НЕХ.
Если у тебя постоянно 40 чисел, то тогда тут больше всего что не DEC а НЕХ.

Последний раз редактировалось Konrad, 07.07.2011 в 00:12.
Ответить с цитированием
  #7  
Старый 07.07.2011, 00:22
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Так-с...
Дано 11 байт.
Получить 40 чисел.

3,6364 байта на число?

Даже если 3 числа на байт = 33 числа.
Это если преобразовывать 1-байт - его DEC-представление.
На самом деле меньше:
может быть число 0-9 (0,04) 10-99 (0,35) 100-255 (0,61)
тогда
11*0,04*1+11*0,35*2+11*0,61*3= 28,27 +/- разброс[ min 11 - max 33, наиболее вероятно 28, если строить график будет горка с вершиной в 28].
( и было получено 26, что не удивительно).

Если же преобразовать вместе:
256^11=309485009821345068724781056 (max 27 чисел).

Не получается никак

Переписывать базу 150 сотрудников не советую до тех пор, пока не убедишься что данные считываются полностью и правильно.


П.с.: а вообще это должны делать те, кто знает как нужно.

Я бы назвал то чем ты(ТС) сейчас занимаешся(эти пробы и ошибки, поиск алгоритма) аматорство и раздолбайство. Которое зачастую вылазит боком.

Последний раз редактировалось Konrad, 07.07.2011 в 01:09.
Ответить с цитированием
  #8  
Старый 07.07.2011, 10:44
fen fen вне форума
Прохожий
 
Регистрация: 23.01.2008
Сообщения: 7
Репутация: 10
Радость

Цитата:
Сообщение от cotseec
еще закрадываются смутные сомнения по поводу правильного понимания смысла приходящих данных т.е. их интерпретации... алгоритм, что я привел, подразумевает, что ридер присылает номер карточки никак "не обернутым" и в одном байте посылки содержится значение одной цифры номера...но это сможет показать уже тот же PortMon небезызвестного Руссиновича (ИМХО: программа хороша, но для коротких посылок/ответов; при размере посылки в 300 байт у меня отображала только первые 24 байта, но зато при отправке/приеме раз в 50-100 мс отлично себя показала), как альтернативу могу предложить Free Serial Port Monitor
большое спасибо тебе, уже разбираюсь.
Цитата:
Сообщение от Konrad
Переписывать базу 150 сотрудников не советую до тех пор, пока не убедишься что данные считываются полностью и правильно.

П.с.: а вообще это должны делать те, кто знает как нужно.

Я бы назвал то чем ты(ТС) сейчас занимаешся(эти пробы и ошибки, поиск алгоритма) аматорство и раздолбайство. Которое зачастую вылазит боком.
Благодарю за подсказки.
Действительно я не программист, а техник. Поверхностные знания по работе с COM-портом, и алгоритмами перевода систем счислений.Но опыт работы в delphi есть, программу почти закончил, остался последний момент с RFID-картами.Программа пишется по ходу свободного времени. Боков по ходу тестирования не наблюдал, вроде. Еще раз спасибо за направления, как закончу отпишусь.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:06.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter