Собственно сабж. Проблема возникла в следующем:
Появилась необходимость каждые 10 секунд обращаться к блоку измерения температур для получения данных с него. Сам вопрос состоит в том: "Почему при обращении к процедуре запроса данных с блока и чтения данных с блока, ничего не происходит, а при обращении к этим же процедурам через кнопки, всё работает и информация отображается."
Для обмена данными используются компоненты: TMS Asvnc32, в частности VaComm1 и VaBuffer.
Код процедуры отправки данных блоку
Код:
procedure TForm1.SendData(numb: integer);
var
blknum:integer; //номер блока к которому происходит обращение
TempCab:array [0..2] of byte; //массив в который записываются номер блока и номер команды
begin
blkNum:=128+64+numb;
TempCab[0]:=(BlkNum);
TempCab[1]:= 129; //129 - "ответить", т.е. отправить данные с датчиков
DM.Comm1.SetRTS(true);
DM.Comm1.WriteBuf(TempCab, Length(TempCab));
DM.Comm1.SetRTS(false);
end;
В этом участке кода отображается считывание байтов с буфера, расчет по формуле и вывод в лейбл. Код для одного лейбла, а так их 4. Байтов в буфере при получении - 18.
Код:
procedure TForm1.ReadData();
var
BufRD:array[0..17]of byte;
n{bytes}:integer;
DT{dry tmp},RDT:integer;
WT{wtr tmp},RWT:integer;
ET{egg tmp},RET:integer;
FT{fan tmp},RFT:integer;
begin
n:=DM.VaBuffer1.BufUsed;
case n of
0:begin
label2.Color:=clRed;
label6.Color:=clRed;
Label9.Caption:=' нету связи';
TimerSeren.Enabled:=true;
end;
18:begin
label2.Color:=clYellow;
label6.Color:=clYellow;
TimerSeren.Enabled:=false;
DM.VaBuffer1.Read(BufRD[0],n);
DT:=256*BufRD[0]+16*BufRD[1]+BufRD[2];
if bufrd[3]=0 then bufrd[3]:=1 else
RDT:=16 mod BufRD[3];
Label2.Caption:=(IntToStr(DT)+(',')+ FloatToStr(RDT));
end
else
showmessage ('Непредвиденное количество байт '+IntToStr(n));
end; //конец case
end;
Коды рабочие и не раз тестировались, но теперь появилась неведомая хрень которая всё обломала
. Прошу помощи
UPD:
Ошибка была найдена, оказывается в первом куске кода blkNum не желала конвертировать и принимать значение из numb, мол ему только циферки руками дописывай. (Циферки в numb передавались из label, а как только переменную numb заменил на 39 так всё сразу заработало). Сразу же возник вопрос, а как исправить этот баг? Получить номер блока можно только из лейбла, а если его присваивать в переменную и переводить через StrToInt то не работает так
Есть идеи как исправить?