![]() |
| ||
|
|
Новости |
Поиск |
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_овские значения в этот формат???
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-метода ?