![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
||||
|
||||
|
Пробуй передавать не число, а ссылку на структуру.
Или, как вариант: Перед передачай, подставляй вначале какой-нибудь спец-символ, при приёме - удаляй. Последний раз редактировалось angvelem, 08.04.2012 в 01:46. |
|
#17
|
||||
|
||||
|
Решение нашел. DWORD(PChar(dt))
dt - переменная для чисел из буфера |
|
#18
|
||||
|
||||
|
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)); После первой кавычки идет пустота. Просто ничего нет.. Хелп... Уже последний шаг остался и тут такое |
|
#19
|
||||
|
||||
|
имхо лучше так
Код:
.... ReadData(Mess.LParam); ... |
|
#20
|
||||
|
||||
|
Цитата:
Ошибка возникает на 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
|
||||
|
||||
|
передавать данные
Код:
... 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
|
||||
|
||||
|
Считывание байтов как и их пересчет работают словно часы. Проблема возникла именно с передачей количества. Хотя сейчас попробую применить PChar и для количества
|
|
#23
|
||||
|
||||
|
в чем смысл передавать integer, как указатель (PChar)
у вас массив из 18 байт, а если в порт пришло больше 18 байт и вы читаете это в уже выделенную область памяти - что-нибудь попортите вне этой области (может значение n) прикрепляю пример, там все передается |
|
#24
|
||||
|
||||
|
Я уже всё пробую. Скоро до бубна шамана дойду
Блок передает только фиксированое количество. Это в нём заложено было при создании. Больше 18 его ничто не заставит передать |
|
#25
|
||||
|
||||
|
Я для работы пользуюсь компонентом VaComm (VaSync набор). У него есть встроеная функция GetBufUsed которая позволяет получить количество байт буфера.
|
|
#26
|
||||
|
||||
|
Почему визуально количество байт отображается(в label, edit, showmessage), а взаимодействовать с ними не могу (использовать в процедурах наприм. case)??
|
|
#27
|
||||
|
||||
|
Попробовал посчитать байты в температуру. Оказалось что цифры которые отображаются в edit в корне отличаются от тех которые приходят от message.
|
|
#28
|
||||
|
||||
|
Цитата:
Цитата:
повторюсь, Цитата:
З.Ы. может кошернее считать значение температуры в потоке и передавать только значение? Последний раз редактировалось cotseec, 09.04.2012 в 23:18. |