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_овские значения в этот формат???


Sha   (2009-07-04 23:48:00) [81]

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


Юрий Зотов   (2009-07-04 23:41:00) [82]

> Zheksonz   (04.07.09 23:38) [118]

Скажите, что означает символ #  в записи #19#136 ?


Sha   (2009-07-04 23:40:00) [83]

Вот ты передаешь 01 06 00 04 5000...
Байты 01 06 00 04 - они в каком коде, по-твоему?
--
Пигма ли он? )


Zheksonz   (2009-07-04 23:38:00) [84]


> А в [4] что написано? Но оно ли самое?

в этом примере получается '#19#136' вместо #19#136;


> Согласись, что если послать вместо #19#136 такое #$13#$88,
>  то ничего не изменится.

в том то и дело, что ничего не изменится... всё те же #$13'€'


Sha   (2009-07-04 23:29:00) [85]

В том-то и дело, что это не код, а количество
Согласись, что если послать вместо #19#136 такое #$13#$88, то ничего не изменится.


Юрий Зотов   (2009-07-04 23:28:00) [86]

> Zheksonz   (04.07.09 23:25) [114]

> а что это за код, я думал мастера мне подскажут...

Уже говорилось - это 256-ричная система счисления.


Юрий Зотов   (2009-07-04 23:26:00) [87]

> Zheksonz   (04.07.09 23:16) [112]

> если приёмник воспринимает "изображения количества"...

Вы для начала разберитесь (и скажите здесь), что же именно воспринимает Ваш приемник - сами числа, или их строковые изображения (и если второе, то в какой системе счисления). Скорее всего, Ваш применик воспринимает все-таки сами числа.

> никто так и не сказал, как из 5000 получить #19#136
> или из 4000 #15#160...

А в [4] что написано? Но оно ли самое?


Zheksonz   (2009-07-04 23:25:00) [88]


> Sha ©   (04.07.09 23:20) [113]


(4000 div 256) = 15
(4000 mod 256) = 160

(5000 div 256) = 19
(5000 mod 256) = 136

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


Sha   (2009-07-04 23:20:00) [89]

> ...то и посылать нужно в восьмиричном, а не в шестнадцатиричном, а то будет ошибка.
> Так и здесь, чтобы послать 5000, посылаем команду вида: #19#136, а если хотим послать 4000, то должны послать #15#160.

Ну и в каком это коде, по-твоему?


Zheksonz   (2009-07-04 23:16:00) [90]

все уже сказали о том, чего я не знаю, но никто так и не сказал, как из 5000 получить #19#136 или из 4000 #15#160...


Zheksonz   (2009-07-04 23:12:00) [91]


> Но в каком формате это количество камней ни записывай, их
> число все равно останется одним и тем же. Камней ни убавится,
>  ни прибавится.

всё правильно, но если приёмник воспринимает "изображения количества" в восьмеричном формате, то и посылать нужно в восьмиричном, а не в шестнадцатиричном, а то будет ошибка. Так и здесь, чтобы послать 5000, посылаем команду вида: #19#136, а если хотим послать 4000, то должны послать #15#160.


Юрий Зотов   (2009-07-04 23:09:00) [92]

Короче, Вам сюда:

http://www.delphikingdom.com/lyceum/seminar.asp?ID=1
http://www.delphikingdom.com/lyceum/seminar.asp?ID=4


Юрий Зотов   (2009-07-04 23:05:00) [93]

> Zheksonz   (04.07.09 22:31) [107]

> Если есть ф-ция преобразовывающая числа в шестнадцатиричный формат
> и возвращала бы её в таком виде, то я бы её использовал.

Такой функции нет и быть не может. Потому что чисел в шестнадцатиричном формате просто не существует.

И чисел в десятичном формате тоже не существует. Чисел ни в каком формате вообще не существует. Существуют просто числа, без всяких форматов.

А вот изображениечисла действительно имеет формат. Но это не само число, а его изображение - строка.

Есть 20 камней. В десятичном виде - 20. В шестнадцатиричном - 14. В двоичном - 10100. В восьмиричном - 24. Все это - строковые изображения количества камней в разных форматах. Эти изображения различаются.

Но в каком формате это количество камней ни записывай, их число все равно останется одним и тем же. Камней ни убавится, ни прибавится.


Zheksonz   (2009-07-04 22:34:00) [94]

Юрий Зотов ©   (04.07.09 22:28) [106]
да, одно и то же, только этот формат не воспринимается инвертором, в отличие от #19#136


Zheksonz   (2009-07-04 22:31:00) [95]

Юрий Зотов ©   (04.07.09 22:17) [103]
да всё там понятно, и этот пример я использовал, и он, как мне показалось сначала, заработал, за тем лишь исключением, что я получил #1#6#0#4'#19#136', вместо #1#6#0#4#19#136...

w := StrToInt(IntToHex(5000, 2));//так я получал шестнадцатиричный формат числа 5000, но т.к. мне посоветовали использовать тип word, я производил преобразование в этот тип, т.к. IntToHex возвращает строковое значение. Если есть ф-ция преобразовывающая числа в шестнадцатиричный формат и возвращала бы её в таком виде, то я бы её использовал.


Юрий Зотов   (2009-07-04 22:28:00) [96]

> Zheksonz   (04.07.09 22:11) [101]

> Опять на выходе пресловутые: #$13'€' но это не #19#136

Ошибаетесь. Это одно и то же, только в разной записи (что для Вашей задачи не играет никакой роли).


palva   (2009-07-04 22:22:00) [97]


> но это не #19#136

А почему вы так думаете? Кодировка первого символа совпадает, а что за символ у вас второй указан? Если "евро", то тоже совпадает.


Sha   (2009-07-04 22:21:00) [98]

Интрига не хуже детектива, с интересом жду развязки.

Простите за оффтоп.


Юрий Зотов   (2009-07-04 22:17:00) [99]

> Zheksonz   (04.07.09 21:31) [89]

> сейчас делаю так
Без малейшего понимания, что и зачем Вы делаете. Доказываю.

1. w := StrToInt(IntToHex(5000, 2));

IntToHex преобразует десятичное число 5000 в 16-ричную запись. Это действительно 1388 - но это не число 1388, а строка '1388'. Далее StrToInt преобразует эту строку обратно в число. Но в строке '1388' нет знака $, указывающего, что это 16-ричная запись числа, поэтому StrToInt считает строку '1388' десятичной записью числа и в итоге получается w=1388 (десятичное).

Во-первых, это ошибка - Вы исказили исходное число (было 5000, стало 1388). Во-вторых, а почему было сразу не записать: w := 5000, без всяких преобразований туда-обратно?

Спрашивается - и чего Вы добились этими преобразованиями? Ничего, кроме ошибки (исказили исходное число).

И главный вопрос - а чего же Вы хотели этими преобразованиями добиться? Зачем Вы их делали? Вы понимаете, что Вы пишете? Вы знаете, зачем Вы это пишете?

Нет, Вы не понимаете того, что пишете. И сами не знаете, зачем Вы это пишете. Пишете наугад - авось, заработает

Идем дальше. Итак, w=1388. Это два байта, старший равен 5, а младший - 108. В символьном виде старший байт есть непечатный символ ENQ, а младший - буква l. Что Вы в итоге и получаете.

==========================

К сожалению, Dennis I. Komarov оказался прав - то что приведено в [4], Вами разобрано не было. А зря.


Sha   (2009-07-04 22:16:00) [100]

> Zheksonz

Мы тебя тоже кое о чем спросили в [86], не забыл?


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

Наверх

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