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


Dennis I. Komarov   (2009-07-03 11:16:00) [181]


> Думаю, что только взглянув на этот код, автор уже все понял

Это иллюзии

> то вполне логично использовать и CRC в виде String

Ну путь String, я это допустил, но от чего он ее считает %)


Юрий Зотов   (2009-07-03 11:13:00) [182]

> Dennis I. Komarov ©   (03.07.09 11:10) [18]

> А уйдет туда чушь...

Почему?


Юрий Зотов   (2009-07-03 11:12:00) [183]

> Dennis I. Komarov ©   (03.07.09 10:56) [16]

> Зато избавило бы от вчерашней проблемы а-ля HEX и пляски с бубнами

Не избавило бы. Любой буфер, хоть в виде строки, хоть двоичный (которые, кстати, ничем по сути не отличаются) надо как-то формировать и возникает та же самая проблема. Она не в самом формировании, она в том, что автор очень слабо знаком с внутренним представлением данных в машине.

> То что приведено в [4], будет тупо скопировано боз всякого разбора

Там и разбирать нечего - все просто, как веник и код говорит сам за себя. Думаю, что только взглянув на этот код, автор уже все понял.

> неговоря уже о типе возвращаемой crc (ну пусть Str будет, ладно)

Если автор использовал метод WriteStr (на что, как уже говорилось, имеет полное право), то вполне логично использовать и CRC в виде String. Тем более, что CRC у него, как он сказал, должна быть представлена в том же 256-ричном виде (ну такой протокол у девайса, никуда не денешься).


Dennis I. Komarov   (2009-07-03 11:10:00) [184]


> А что касается префикса (#01#06#00#04) и постфикса (CRC)
> - да просто к порту подключен девайс с таким протоколом,
>  вот и все.

Да ради бога, не важно кто их читать будет. А вот что уйдет в порт - это извиняйте, на совести автора. А уйдет туда чушь...


Юрий Зотов   (2009-07-03 11:03:00) [185]

А что касается префикса (#01#06#00#04) и постфикса (CRC) - да просто к порту подключен девайс с таким протоколом, вот и все.


Dennis I. Komarov   (2009-07-03 10:56:00) [186]


> Юрий Зотов ©   (03.07.09 10:45) [15]

Зато избавило бы от вчерашней проблемы а-ля HEX и пляски с бубнами (хотя они конечно полезные, но имхо результата вчера не дали), это раз.

То что приведено в [4], будет тупо скопировано боз всякого разбора, это два

На [8] ответа я уже и не жду, неговоря уже о типе возвращаемой crc (ну пусть Str будет, ладно), три


Юрий Зотов   (2009-07-03 10:45:00) [187]

> Dennis I. Komarov ©   (03.07.09 10:40) [14]

Потому что имеет на это полное право. Да и нет никакой разницы - все равно содержимое буфера надо как-то формировать и при формировании у него возникла бы та же самая проблема (прямая запись в буфер числа 5000 не прокатывает из-за того, что старший и младший байты тогда поменялись бы местами).


Dennis I. Komarov   (2009-07-03 10:40:00) [188]


> Юрий Зотов ©   (03.07.09 10:36) [13]

И почему тогда он был игнорирован и предпочтен другой метод?


orinoko   (2009-07-03 10:36:00) [189]

Можно чуть чуть более наглядно

type
String2 = string[2];

function WordToString2(Value: word): String2;
begin
Result[1] := Char(Hi(Value));
Result[2] := Char(Lo(Value));
end;


Юрий Зотов   (2009-07-03 10:36:00) [190]

> Dennis I. Komarov ©   (03.07.09 10:33) [11]

В [5] просто сказано, что у этого компонента есть еще и другой метод записи в порт (с параметрами: адрес, длина).


Dennis I. Komarov   (2009-07-03 10:33:00) [191]


> Юрий Зотов ©   (03.07.09 10:29) [10]

Автор просто бездумно скомировал чей-то код, и даже не посмотрел перед этим свойства и методы этого компонента, о чем в [5] и признался :)


Юрий Зотов   (2009-07-03 10:29:00) [192]

Люди, автор просто использовал какой-то готовый компонент с методом WriteStr - т.е., передаваемый в порт буфер должен быть представлен в виде строки. И он не знал, как сформировать часть этой строки (2 байта), в которой передаются собственно данные (десятичное число 5000). IntToStr и IntToHex здесь, естественно, не катят поскольку в эти 2 байта фактически должно быть записано символьное представление данных в 256-ричной системе счисления. Вот и вся проблема.


Сергей М.   (2009-07-03 10:26:00) [193]


> она подойдёт?


Оч даже подойдет. Для того она и предназначена)


Dennis I. Komarov   (2009-07-03 10:20:00) [194]

Кстати вопрос для автора

> String_ := #01#06#00#04#19#136 + crc16( String_);

чему равна строка, от которой вычисляем crc?
и в дагонку - нафига оно тогда надо?


Dennis I. Komarov   (2009-07-03 10:15:00) [195]


> Сергей М. ©   (03.07.09 10:02) [2]

Как почему? Потому что гдето было нарисовано именно WriteStr, а отсюда и рождение чуда: > String_ := #01#06#00#04#19#136 + crc16(String_);. И в HEX его загоняли, и обратно тоже пытлись, ну не работает этот TComport с бинарными данными, ну не COM-port, а телеграммоприемник какой-то...


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

Юрий, респектищщщщщщщще!!!

Эх, не перевелись таки мастера, на Руси, матушке!!!


Юрий Зотов   (2009-07-03 10:12:00) [197]

То есть, вопрос в том, как преобразовать десятичное число 5000 в 2 байта с содержимым #19#136 ?

Если да, то так:
Первый байт (#19) = 5000 div 256
Второй байт (#136) = 5000 mod 256

type
 String2 = string[2];

function WordToString2(Value: word): String2;
begin
 Result[1] := Char(Value div 256);
 Result[2] := Char(Value mod 256)
end;

Тест:

procedure TForm1.FormCreate(Sender: TObject);
var
 S: String2;
begin
 S := WordToString2(5000);
 Caption := Format('#%d #%d', [Ord(S[1]), Ord(S[2])])
end;


Zheksonz   (2009-07-03 10:12:00) [198]

2 Сергей

есть ф-ция:
function Write(const Buffer; Count: Integer): Integer;
она подойдёт?


brother   (2009-07-03 10:03:00) [199]

однако это TComport...


Сергей М.   (2009-07-03 10:02:00) [200]

ComPort - это что такое ?
И почему именно Write Str, если речь идет о передаче бинарныхданных ?
У класса ComPort разве нет более подходящего для этого Write-метода ?


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

Наверх

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