Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите разобраться в преобразовании [D7, XP]


Страницы:   1 2 3 4 5 6 7 8 9 10 11

Zheksonz ©   (2009-07-03 09:48:00) 

Доброе утро. Помогите, застрял я(((
для записи в COM порт используется функция ComPort.WriteStr(String_);
01 06 00 04 5000 - это первые шесть байт, 5000 имеет 2х байтовое значение, завершающими двумя байтами станут байты контрольной суммы.  

формат этой записи, правильно воспринимаемый COM портом, следующий: String_ := #01#06#00#04#19#136 + crc16(String_);// ф-ция crc16 возвращает ещё два байта, в которых контрольная сумма всего этого набора данных, которые представлены в таком же виде... Как мне преобразовывать String_овывые или Integer_овские значения в этот формат???


Zheksonz   (2009-07-03 16:33:00) [141]

Анатолий, вот вы вроде бы как тут "аксакалите" по идее должны знать ответ на мой вопрос, но максимум на что можно расчитывать, от вас, это издёвка... может нарушите традицию и подскажете балбесу, что я делаю не так???


Dennis I. Komarov   (2009-07-03 16:30:00) [142]


> ну это же безобразие...

почему? Мой квакулятор говорит что 5000 = $1388


Anatoly Podgoretsky   (2009-07-03 16:29:00) [143]

> Dennis I. Komarov  (03.07.2009 16:25:57)  [57]

А если 12 бит


Zheksonz   (2009-07-03 16:27:00) [144]

да я пробовал уже так, объявлял промежуточную переменную s1w, типа word, потом в неё присваивал :

char(s1w div 256) + chr(s1w mod 256);а на выходе не #19#136, а $13'€'... ну это же безобразие...


Сергей М.   (2009-07-03 16:25:00) [145]


> Zheksonz   (03.07.09 16:11) [54]


Мож тебе в "Школу Юрия Зотова" заглянуть ?
Прямо на "Первый урок" ?
ЮЗ тебе и ссылочку подгонит ..


Dennis I. Komarov   (2009-07-03 16:25:00) [146]

А завтра три байта понадобятся, будешь 3-байтовую переменную искать?


Dennis I. Komarov   (2009-07-03 16:20:00) [147]


> хорошо, спрошу иначе... как обьявить двухбайтовую переменную?
> ?? уж не так же как однобайтовую, только два раза???

Нафига тебе двубайтовая переменная. Научись работать с числами и потом вопросы задавать не будешь. Оно же тебе все равно надо...
А для тех кто в бронепоезде в [4] переменные объявлены как Word - 16 bit


Zheksonz   (2009-07-03 16:11:00) [148]

хорошо, спрошу иначе... как обьявить двухбайтовую переменную??? уж не так же как однобайтовую, только два раза???

Юрий, только на Вас надежда... ну не сталкивался я никогда с этим, хотя чувствую, что это не сложно... просто нужно знать.


Сергей М.   (2009-07-03 16:07:00) [149]


> что является двухбайтовой переменной?


Тем же чем и одновайтовая, но размером в два раза больше)


Zheksonz   (2009-07-03 15:53:00) [150]

так понял, что значение UpDown1.Position нужно присвоить в некую двухбайтовую переменную, после чего str := char(двухбайтовая переменная div 256) + char(двухбайтовая переменная mod 256);
только не ругайтесь))) а что является двухбайтовой переменной???


Dennis I. Komarov   (2009-07-03 15:49:00) [151]


> но на выходе неправильный результат.. видимо я что-то не
> так понимаю...

Потому что не разобрался как оно работает, а тупо скопипастил готовое, о вреде чего я и предупреждал. И вообще я не представляю, как можно работать с портами, при таком представлении о числах...
Берем бумажку и на ней подробно разбираем по битам что есть 5000, потом что есто Word(5000), потом что нам оттуда надо вынуть а потом...

И вообще я против string-ов... :)


> т.е. я должен присвоить значение UpDown1.Position в двух
> байтовую переменную и только тогда производить div и mod
> 256???

Нет, ты должен из "четырех байтовой" вынуть нужные байты


Юрий Зотов   (2009-07-03 15:48:00) [152]

> Zheksonz   (03.07.09 15:35) [49]

Конечно. Можно и сразу выдернуть нужные байты, но через промежуточную двухбайтовую переменную - проще.


Zheksonz   (2009-07-03 15:35:00) [153]

2 Юрий
т.е. я должен присвоить значение UpDown1.Position в двух байтовую переменную и только тогда производить div и mod 256???


Юрий Зотов   (2009-07-03 14:51:00) [154]

> Zheksonz   (03.07.09 14:14) [43]

UpDown1.Position имеет тип Integer. Это 4 байта. Из них Вы берете младший и старший. А надо что? Надо младший и старший байты младшего слова .

Думайте.


Сергей М.   (2009-07-03 14:39:00) [155]


> не понимаю какое это имеео отношение к решению вопроса?


Самое непосредственное - ты не видишь и не понимаешь результаты своих бубноплясок с "преобразованиями", которые, как я тебе показал выше, вобщем-то и не нужны ..
Т.е. работаешь вслепую)


> я пользуюсь отладчиком


Вот и показывай, что ты там видишь в том или ином случае ..


Zheksonz   (2009-07-03 14:30:00) [156]

Сергей М. ©   (03.07.09 14:23) [45]
я не понимаю какое это имеео отношение к решению вопроса??? тем более что я пользуюсь отладчиком, если вопрос не касается прсмотра при помощи отладчика возвращаемых данных, от инвертора...


Сергей М.   (2009-07-03 14:23:00) [157]


> не все функции доступны в отладчике из-за отсутствия на
> компе COM порта.


Нафих отладчику твой COM-порт сдался ?)
Отладчик тебе нужен лишь для того, чтобы подсмотреть содержимое того, что в действительности было бы отправлено в порт, если бы порт был)


Zheksonz   (2009-07-03 14:18:00) [158]

Сергей М. ©   (03.07.09 13:49) [42]

я неправильно выразился, не все функции доступны в отладчике из-за отсутствия на компе COM порта.

кстати, вот процедура CRC16:

function TForm1.crc16(seq:string):string;
var
 i,j:integer;
 CRC:word;
const
 CRC_st:word=$FFFF;
 CRC_1:word=$A001;
begin
 CRC:=CRC_st;
 for i:=1 to (length(seq)) do
   begin
     CRC:=CRC xor ord(seq[i]);
       for j:=1 to 8 do
       begin
         if (CRC and 1)>0 then
         begin
           CRC:=CRC shr 1;
           CRC:=CRC xor CRC_1;
         end
         else CRC:=CRC shr 1;
       end;
   end;
   result:=chr(lo(CRC))+chr(hi(CRC));
end;


Zheksonz   (2009-07-03 14:14:00) [159]

Dennis I. Komarov ©   (03.07.09 13:48) [41]
делаю так:
Strn := Strn + chr(lo(UpDown1.Position)) + chr(Hi(UpDown1.Position));

но на выходе неправильный результат.. видимо я что-то не так понимаю...


Сергей М.   (2009-07-03 13:49:00) [160]


> отладчик не всегда могу использовать


Это почему же ?
Что мешает непосредственно перед ComPort.Write(чего-то там) посмотреть под отлачиком потрока этого "чего-то там" ?


Страницы:   1 2 3 4 5 6 7 8 9 10 11

Наверх

Титульная страница Поиск, карта сайта Написать письмо