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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 08.04.2012, 01:42
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Пробуй передавать не число, а ссылку на структуру.
Или, как вариант: Перед передачай, подставляй вначале какой-нибудь спец-символ, при приёме - удаляй.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 08.04.2012 в 01:46.
Ответить с цитированием
  #17  
Старый 08.04.2012, 16:05
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

Решение нашел. DWORD(PChar(dt))
dt - переменная для чисел из буфера
Ответить с цитированием
  #18  
Старый 08.04.2012, 18:18
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

raised exception class econverterror with message

Код:
var
   txt,tg:string ;
begin
  txt :=string(mess.WParam);
  tg:=IntToStr(Mess.LParam);
Label8.Caption:=(tg+' || '+txt);
Edit13.Text:=txt;
Edit14.Text:=(tg);
ReadData(StrToInt(tg));
ReadData - процедура перевода байтов в температуру. Собственно постоянно ловлю ошибку: raised exception class econverterror with message"
После первой кавычки идет пустота. Просто ничего нет.. Хелп... Уже последний шаг остался и тут такое
Ответить с цитированием
  #19  
Старый 08.04.2012, 19:42
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

имхо лучше так
Код:
....
ReadData(Mess.LParam);
...
на какой именно строке возникает ошибка? тут как минимум две конвертации, да и еще неизвестно, что в процедуре ReadData
Ответить с цитированием
  #20  
Старый 08.04.2012, 20:03
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от cotseec
имхо лучше так
Код:
....
ReadData(Mess.LParam);
...
на какой именно строке возникает ошибка? тут как минимум две конвертации, да и еще неизвестно, что в процедуре ReadData

Ошибка возникает на Edit14.Text:=(tg);
От ком-порта в приходит набор байтов. Они сначало записываются в массив, а потом слепливаются в одну строку которая передается на WParam. В Lparam передается количество байт в буффере (количество загоняется в переменную n). WParam успешно передается в Edit и так же отрабатывается в процедуре ReadData (в процедуре по формуле каждые 4 байта считаются и уже выходит конечный результат). А вот количество(n) не желает передаваться..
Обработка
Код:
procedure TWorkThread.Execute;
var
i,n:integer;
BufRD:array[0..17] of byte;
TempCab:array[0..1] of byte; //massiv dlya command
  u:Integer; //nomer cabiny
  DT{dry tmp},RDT:string;
begin
u:=FData+128+64;
TempCab[0]:=(u);
TempCab[1]:= 129;
DM.Comm1.SetRTS(true);
Sleep(20);
DM.Comm1.WriteBuf(TempCab, Length(TempCab));
sleep (20);
DM.Comm1.SetRTS(false);
Sleep(50);
Sleep(50);
Sleep(50);
Sleep(50);
Sleep(50);
n:=DM.Comm1.ReadBufUsed;
DM.Comm1.ReadBuf(BufRD[0],n);
for i:=0 to n-1 do DT:=DT+IntToStr(BufRD[i]);
SendMessage(FWndThread,MY_MESSAGE,DWORD(dt),n);   
  end;
procedure TWorkThread.Get;
begin
end;

Код:
procedure TMnFrm.ReadData();
var
  i:Integer;
  ty:integer;
BufMC:array [0..17] of Integer;
DT{dry tmp},RDT:integer;
begin                                 //Edit13 - набор байтов Edit14 - количество
  ty:=StrToInt(Edit14.text);
  for i:=0 to Length(Edit13.Text) do  BufMC[i]:= strtoint(Edit13.Text[i]);
  case ty of
   0:begin
        label2.Color:=clRed;
        label6.Color:=clRed;
        label7.Color:=clRed;
               color:=clred;
        Label9.Caption:='';
        Label9.Caption:=' нет связи!!! ';
        label2.Caption:='XXX';
        label6.Caption:='XXX';
        label7.Caption:='XXX';
        TimerSeren.Enabled:=true;
        TimerRunLabel.Enabled:=true;
      end;

  14:begin
          label2.Color:=clYellow;
          label6.Color:=clYellow;
          label7.Color:=clYellow;
          color:=clyellow;
          Label9.Caption:='';
          TimerRunLabel.Enabled:=false;
          TimerSeren.Enabled:=false;
          TimerDatch.Enabled:=false;        
       DT:=256*BufMC[0]+16*BufMC[1]+BufMC[2];
            if BufMC[3]=0 then BufMC[3]:=1 else
       RDT:=16 mod BufMC[3];
            Label2.Hint:=(IntToStr(DT)+(',')+ FloatToStr(RDT));
            Label2.Caption:=(IntToStr(DT)+(',')+ FloatToStr(RDT));
     Sravn(Edit4.text, edit6.Text,Edit8.text, label2.caption,1);
     end 
         else
    begin
//ShowMessage(IntToStr(n));
       end;
  end;
end;
На то что передается через эдиты прошу не обращать внимания, я уже всё под ряд пытался делать..
Ответить с цитированием
  #21  
Старый 08.04.2012, 21:07
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

передавать данные
Код:
...
   SendMessage(FWndThread,MY_MESSAGE,integer(PChar(DT)),n);
...
принимать данные
Код:
...
   txt :=string(PChar(Mess.Wparam));
   tg:=IntToStr(Mess.LParam);
...

З.Ы. имхо лучше передавать указатель на буфер и работать с байтами, а не конвертировать в String и потом высчитывать (но в этом случае процедуру ReadData необходимо переписать)

Последний раз редактировалось cotseec, 08.04.2012 в 21:15.
Ответить с цитированием
  #22  
Старый 08.04.2012, 23:08
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

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

в чем смысл передавать integer, как указатель (PChar)
у вас массив из 18 байт, а если в порт пришло больше 18 байт и вы читаете это в уже выделенную область памяти - что-нибудь попортите вне этой области (может значение n)
прикрепляю пример, там все передается
Вложения
Тип файла: zip Example.zip (852 байт, 6 просмотров)
Ответить с цитированием
  #24  
Старый 09.04.2012, 20:39
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

Я уже всё пробую. Скоро до бубна шамана дойду Блок передает только фиксированое количество. Это в нём заложено было при создании. Больше 18 его ничто не заставит передать
Ответить с цитированием
  #25  
Старый 09.04.2012, 21:16
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

Я для работы пользуюсь компонентом VaComm (VaSync набор). У него есть встроеная функция GetBufUsed которая позволяет получить количество байт буфера.
Ответить с цитированием
  #26  
Старый 09.04.2012, 22:23
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

Почему визуально количество байт отображается(в label, edit, showmessage), а взаимодействовать с ними не могу (использовать в процедурах наприм. case)??
Ответить с цитированием
  #27  
Старый 09.04.2012, 22:49
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

Попробовал посчитать байты в температуру. Оказалось что цифры которые отображаются в edit в корне отличаются от тех которые приходят от message.
__________________
Благими намерениями вымощена дорога в ад
Ответить с цитированием
  #28  
Старый 09.04.2012, 23:08
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Цитата:
Почему визуально количество байт отображается(в label, edit, showmessage), а взаимодействовать с ними не могу (использовать в процедурах наприм. case)??
вы пытаетесь провести отбор (case) по данным типа string, а case умеет работать только с целочисленными типами
Цитата:
Попробовал посчитать байты в температуру. Оказалось что цифры которые отображаются в edit в корне отличаются от тех которые приходят от message.
от потока у вас приходит сумма символов из которых состоит пришедшая от устройства цепочка байт, при этом как вы пытаетесь разобрать текстовую строку, переданную из потока, зная только количество пришедших байт, для меня осталось загадкой (например, строка '15178' может означать либо байты со значением 15 и 178 либо 151 и 78)
повторюсь,
Цитата:
З.Ы. имхо лучше передавать указатель на буфер и работать с байтами, а не конвертировать в String и потом высчитывать (но в этом случае процедуру ReadData необходимо переписать)

З.Ы. может кошернее считать значение температуры в потоке и передавать только значение?

Последний раз редактировалось cotseec, 09.04.2012 в 23:18.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter