|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Пробуй передавать не число, а ссылку на структуру.
Или, как вариант: Перед передачай, подставляй вначале какой-нибудь спец-символ, при приёме - удаляй. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось 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. |