![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите разобраться в преобразовании [D7, XP]
Zheksonz © (2009-07-03 09:48:00)
Страницы: < 1 2 3 4 5 6 7 8 9 10 11 >
Доброе утро. Помогите, застрял я(((
для записи в 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(чего-то там) посмотреть под отлачиком потрока этого "чего-то там" ?