Показать сообщение отдельно
  #1  
Старый 27.03.2012, 19:11
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию COM port. Проблема при попытке работы через Timer

Собственно сабж. Проблема возникла в следующем:
Появилась необходимость каждые 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 то не работает так Есть идеи как исправить?
Ответить с цитированием