Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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]


> Zheksonz


var
 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
15-1246890568
Unknown user
2009-07-06 18:29
2009.09.06
Онлайн хелп


15-1246542517
RWolf
2009-07-02 17:48
2009.09.06
TreeView для показа/редактирования разнородных данных


15-1246739521
Юрий
2009-07-05 00:32
2009.09.06
С днем рождения ! 5 июля 2009 воскресенье


15-1246725022
KilkennyCat
2009-07-04 20:30
2009.09.06
Линукс. Скрипт удаления файла.


2-1246940192
f-a-l-l-e-n
2009-07-07 08:16
2009.09.06
Проблема с richedit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский