Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.06;
Скачать: CL | DM;

Вниз

Помогите разобраться в преобразовании   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.013 c
4-1216586310
batya-x
2008-07-21 00:38
2009.09.06
поск файлов на winAPI


2-1246866808
smirnoff
2009-07-06 11:53
2009.09.06
Вопрос по AnsiChar


15-1246621316
XcCCC
2009-07-03 15:41
2009.09.06
DEC to HEX


1-1213889970
ggg
2008-06-19 19:39
2009.09.06
Отложенное освобождение объектов


15-1246890568
Unknown user
2009-07-06 18:29
2009.09.06
Онлайн хелп