Форум: "Начинающим";
Текущий архив: 2009.09.06;
Скачать: [xml.tar.bz2];
ВнизПомогите разобраться в преобразовании Найти похожие ветки
← →
Zheksonz (2009-07-03 09:48) [0]Доброе утро. Помогите, застрял я(((
для записи в COM порт используется функцияComPort.WriteStr(String_);
01 06 00 04 5000 - это первые шесть байт, 5000 имеет 2х байтовое значение, завершающими двумя байтами станут байты контрольной суммы.
формат этой записи, правильно воспринимаемый COM портом, следующий:String_ := #01#06#00#04#19#136 + crc16(String_);
// ф-ция crc16 возвращает ещё два байта, в которых контрольная сумма всего этого набора данных, которые представлены в таком же виде... Как мне преобразовывать String_овывые или Integer_овские значения в этот формат???
← →
Palladin © (2009-07-03 09:57) [1]Var
s:String;
n:Integer;
SetLength(s,4);
n:=5000;
Move(n,s[1],4);
← →
Сергей М. © (2009-07-03 10:02) [2]ComPort - это что такое ?
И почему именно WriteStr, если речь идет о передаче бинарных данных ?
У класса ComPort разве нет более подходящего для этого Write-метода ?
← →
brother © (2009-07-03 10:03) [3]однако это TComport...
← →
Юрий Зотов © (2009-07-03 10:12) [4]То есть, вопрос в том, как преобразовать десятичное число 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) [5]2 Сергей
есть ф-ция:function Write(const Buffer; Count: Integer): Integer;
она подойдёт?
← →
Zheksonz (2009-07-03 10:14) [6]Юрий, респектищщщщщщщще!!!
Эх, не перевелись таки мастера, на Руси, матушке!!!
← →
Dennis I. Komarov © (2009-07-03 10:15) [7]
> Сергей М. © (03.07.09 10:02) [2]
Как почему? Потому что гдето было нарисовано именно WriteStr, а отсюда и рождение чуда:> String_ := #01#06#00#04#19#136 + crc16(String_);. И в HEX его загоняли, и обратно тоже пытлись, ну не работает этот TComport с бинарными данными, ну не COM-port, а телеграммоприемник какой-то...
← →
Dennis I. Komarov © (2009-07-03 10:20) [8]Кстати вопрос для автора
> String_ := #01#06#00#04#19#136 + crc16(String_);
чему равна строка, от которой вычисляем crc?
и в дагонку - нафига оно тогда надо?
← →
Сергей М. © (2009-07-03 10:26) [9]
> она подойдёт?
Оч даже подойдет. Для того она и предназначена)
← →
Юрий Зотов © (2009-07-03 10:29) [10]Люди, автор просто использовал какой-то готовый компонент с методом WriteStr - т.е., передаваемый в порт буфер должен быть представлен в виде строки. И он не знал, как сформировать часть этой строки (2 байта), в которой передаются собственно данные (десятичное число 5000). IntToStr и IntToHex здесь, естественно, не катят поскольку в эти 2 байта фактически должно быть записано символьное представление данных в 256-ричной системе счисления. Вот и вся проблема.
← →
Dennis I. Komarov © (2009-07-03 10:33) [11]
> Юрий Зотов © (03.07.09 10:29) [10]
Автор просто бездумно скомировал чей-то код, и даже не посмотрел перед этим свойства и методы этого компонента, о чем в [5] и признался :)
← →
orinoko (2009-07-03 10:36) [12]Можно чуть чуть более наглядно
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) [13]> Dennis I. Komarov © (03.07.09 10:33) [11]
В [5] просто сказано, что у этого компонента есть еще и другой метод записи в порт (с параметрами: адрес, длина).
← →
Dennis I. Komarov © (2009-07-03 10:40) [14]
> Юрий Зотов © (03.07.09 10:36) [13]
И почему тогда он был игнорирован и предпочтен другой метод?
← →
Юрий Зотов © (2009-07-03 10:45) [15]> Dennis I. Komarov © (03.07.09 10:40) [14]
Потому что имеет на это полное право. Да и нет никакой разницы - все равно содержимое буфера надо как-то формировать и при формировании у него возникла бы та же самая проблема (прямая запись в буфер числа 5000 не прокатывает из-за того, что старший и младший байты тогда поменялись бы местами).
← →
Dennis I. Komarov © (2009-07-03 10:56) [16]
> Юрий Зотов © (03.07.09 10:45) [15]
Зато избавило бы от вчерашней проблемы а-ля HEX и пляски с бубнами (хотя они конечно полезные, но имхо результата вчера не дали), это раз.
То что приведено в [4], будет тупо скопировано боз всякого разбора, это два
На [8] ответа я уже и не жду, неговоря уже о типе возвращаемой crc (ну пусть Str будет, ладно), три
← →
Юрий Зотов © (2009-07-03 11:03) [17]А что касается префикса (#01#06#00#04) и постфикса (CRC) - да просто к порту подключен девайс с таким протоколом, вот и все.
← →
Dennis I. Komarov © (2009-07-03 11:10) [18]
> А что касается префикса (#01#06#00#04) и постфикса (CRC)
> - да просто к порту подключен девайс с таким протоколом,
> вот и все.
Да ради бога, не важно кто их читать будет. А вот что уйдет в порт - это извиняйте, на совести автора. А уйдет туда чушь...
← →
Юрий Зотов © (2009-07-03 11:12) [19]> Dennis I. Komarov © (03.07.09 10:56) [16]
> Зато избавило бы от вчерашней проблемы а-ля HEX и пляски с бубнами
Не избавило бы. Любой буфер, хоть в виде строки, хоть двоичный (которые, кстати, ничем по сути не отличаются) надо как-то формировать и возникает та же самая проблема. Она не в самом формировании, она в том, что автор очень слабо знаком с внутренним представлением данных в машине.
> То что приведено в [4], будет тупо скопировано боз всякого разбора
Там и разбирать нечего - все просто, как веник и код говорит сам за себя. Думаю, что только взглянув на этот код, автор уже все понял.
> неговоря уже о типе возвращаемой crc (ну пусть Str будет, ладно)
Если автор использовал метод WriteStr (на что, как уже говорилось, имеет полное право), то вполне логично использовать и CRC в виде String. Тем более, что CRC у него, как он сказал, должна быть представлена в том же 256-ричном виде (ну такой протокол у девайса, никуда не денешься).
← →
Юрий Зотов © (2009-07-03 11:13) [20]> Dennis I. Komarov © (03.07.09 11:10) [18]
> А уйдет туда чушь...
Почему?
← →
Dennis I. Komarov © (2009-07-03 11:16) [21]
> Думаю, что только взглянув на этот код, автор уже все понял
Это иллюзии
> то вполне логично использовать и CRC в виде String
Ну путь String, я это допустил, но от чего он ее считает %)
← →
Юрий Зотов © (2009-07-03 11:22) [22]> Dennis I. Komarov © (03.07.09 11:16) [21]
> но от чего он ее считает
А это уже второй вопрос, к сабжу не относящийся. Вскоре, надо полагать, узнаем...
:o)
← →
Anatoly Podgoretsky © (2009-07-03 11:23) [23]> Юрий Зотов (03.07.2009 11:22:22) [22]
Намекаешь, что еще не вечер :-)
← →
Сергей М. © (2009-07-03 12:05) [24]
> Zheksonzvar
CmdPrefix: array[0..3] of byte = (01, 06, 00, 04);
CmdData: Word = 5000;
CmdCRC16: Word;
ms: TMemoryStream;
..
ms.WriteBuffer(CmdPrefix, SizeOf(CmdPrefix));
ms.WriteBuffer(CmdData, SizeOf(CmdData));
CmdCRC16 := CRC16(PChar(ms.Memory));
ms.WriteBuffer(CmdCRC16, SizeOf(CmdCRC16));
ComPort.Write(ms.Memory^, ms.Size);
Вот и всё ! И ничего никуда преобразовывать не нужно)
← →
Zheksonz (2009-07-03 12:20) [25]а вот это уже пляски с бубнами, кстати, атор этого эпитета сам решил его исполненить...
Прав Юрий, таков протокол, и не тема это для обсуждения...
"но от чего он ее считает" кого ее?? и это вопрос, вообще???
← →
Dennis I. Komarov © (2009-07-03 12:24) [26]
> "но от чего он ее считает" кого ее?? и это вопрос, вообще?
> ??
Вопрос был в [8], остальным понятно кого ее. А до этого Юрий Сергеевич прав в [22]
← →
Юрий Зотов © (2009-07-03 12:35) [27]> Сергей М. © (03.07.09 12:05) [24]
var
CmdData: Word = 5000;
CmdCRC16: Word;
..
ms.WriteBuffer(CmdData, SizeOf(CmdData));
ms.WriteBuffer(CmdCRC16, SizeOf(CmdCRC16));
В обоих случаях байты Word"а меняются местами (это же x86). Нарушение протокола.
← →
Dennis I. Komarov © (2009-07-03 12:44) [28]
> Юрий Зотов © (03.07.09 12:35) [27]
Ну Вы же сами утверждали
> Там и разбирать нечего - все просто, как веник и код говорит
> сам за себя. Думаю, что только взглянув на этот код, автор
> уже все понял.
← →
Zheksonz (2009-07-03 13:02) [29]хух... теперь вот такая кака: #1#6#0#4"#19#136", вместо #1#6#0#4#19#136... иначе говоря я формирую зтроку не из кодов этих значений, а из строковых значений. Сорри. Как исправить эту проблему???
← →
Dennis I. Komarov © (2009-07-03 13:07) [30]
> хух... теперь вот такая кака: #1#6#0#4"#19#136", вместо
> #1#6#0#4#19#136... иначе говоря я формирую зтроку не из
> кодов этих значений, а из строковых значений. Сорри. Как
> исправить эту проблему???
У тебя ошибка в программе...
[8]-?
← →
Сергей М. © (2009-07-03 13:08) [31]
> Юрий Зотов © (03.07.09 12:35) [27]
ну этот момент я упусти л..
Да в чем собссно проблема ? Долго поменять что ли порядок ? Делов то на три секунды)var
CmdPrefix: array[0..3] of byte = (01, 06, 00, 04);
CmdData: Word = 5000;
CmdCRC16: Word;
ms: TMemoryStream;
..
ms.WriteBuffer(CmdPrefix, SizeOf(CmdPrefix));
CmdData := Swap(CmdData);
ms.WriteBuffer(CmdData, SizeOf(CmdData));
CmdCRC16 := Swap(CRC16(PChar(ms.Memory)));
ms.WriteBuffer(CmdCRC16, SizeOf(CmdCRC16));
ComPort.Write(ms.Memory^, ms.Size);
← →
Zheksonz (2009-07-03 13:11) [32]
var
strn, Str1: string;
..................................
ComPort.Open;
Strn := #01#06#00#04;
S := WordToString2(UpDown1.Position);
Strn := Strn + Format("#%d#%d", [Ord(S[1]), Ord(S[2])]); // Format возвращает "#nn#nn", а надо бы #nn#nn
Str1 := Strn+crc16(Strn);
ComPort.WriteStr(Str1);
ComPort.Close;
вот код, а сослался я на строку, т.к. переменная в которую я присваиваю это значение строковая.
← →
Zheksonz (2009-07-03 13:19) [33]2 Сергей
Ваш вариант мне не очень подходит, т.к тогда функцию CRC16 нужно переделыват, это раз, а во вторых я не уверен, что на выходе будет нужный мне формат команды.
← →
Сергей М. © (2009-07-03 13:24) [34]
> тогда функцию CRC16 нужно переделыват
Это еще зачем ?)
> не уверен, что на выходе будет нужный мне формат команды
А зачем гадать ?
Отлоадчик для пушкина что ли существует ?
он тебе и покажет результат..
← →
Zheksonz (2009-07-03 13:31) [35]прблема ещё и в том, что пишу прогу на одном компе, а гоняю привод на другом, поэтому отладчик не всегда могу использовать...
← →
Anatoly Podgoretsky © (2009-07-03 13:33) [36]> Dennis I. Komarov (03.07.2009 12:44:28) [28]
Ну это он поторопился, не учел все мещающие факторы.
← →
Dennis I. Komarov © (2009-07-03 13:37) [37]
> Сергей М. © (03.07.09 13:24) [34]
>
> > тогда функцию CRC16 нужно переделыват
>
>
> Это еще зачем ?)
Как зачем, он же String возвращает...
← →
Dennis I. Komarov © (2009-07-03 13:40) [38]
> Zheksonz (03.07.09 13:31) [35]
> прблема ещё и в том, что пишу прогу на одном компе, а гоняю
> привод на другом, поэтому отладчик не всегда могу использовать.
> ..
поэтому сперва отладчик, а потом уже "гонять"
← →
Zheksonz (2009-07-03 13:43) [39]резюмирую... всё уже, вроде бы правильно, преобразование (n div 256)+(n mod 256) или оно же Hi(n)+Lo(n) подходит, но нужне на выходе не строка, а коды этих значений, т.е. не "#nn#nn", а #nn#nn.
← →
Сергей М. © (2009-07-03 13:46) [40]
> Dennis I. Komarov © (03.07.09 13:37) [37]
А , ну да ..
Ну тоже ведь не проблема, если даже со стрингом понахреноверчено ! Пережделывать-то ее зачем ? Нехай живет себе)var
CmdPrefix: array[0..3] of byte = (01, 06, 00, 04);
CmdData: Word = 5000;
CmdCRC16: Word;
ms: TMemoryStream;
..
ms.WriteBuffer(CmdPrefix, SizeOf(CmdPrefix));
CmdData := Swap(CmdData);
ms.WriteBuffer(CmdData, SizeOf(CmdData));
CmdCRC16 := Swap(PWord(CRC16(PChar(ms.Memory)))^);
ms.WriteBuffer(CmdCRC16, SizeOf(CmdCRC16));
ComPort.Write(ms.Memory^, ms.Size);
Страницы: 1 2 3 4 5 6 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.09.06;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.008 c