|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
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 то не работает так Есть идеи как исправить? Последний раз редактировалось Darlok, 27.03.2012 в 23:10. |