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 13:48:00) [161]


> (n div 256)+(n mod 256)

Ты понимаешь как это работает?
Что мешает присвоить символы прям тут:
Strn := Strn + ...


Сергей М.   (2009-07-03 13:46:00) [162]


> 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);


Zheksonz   (2009-07-03 13:43:00) [163]

резюмирую... всё уже, вроде бы правильно, преобразование (n div 256)+(n mod 256) или оно же Hi(n)+Lo(n) подходит, но нужне на выходе не строка, а коды этих значений, т.е. не '#nn#nn', а #nn#nn.


Dennis I. Komarov   (2009-07-03 13:40:00) [164]


> Zheksonz   (03.07.09 13:31) [35]
> прблема ещё и в том, что пишу прогу на одном компе, а гоняю
> привод на другом, поэтому отладчик не всегда могу использовать.
> ..

поэтому сперва отладчик, а потом уже "гонять"


Dennis I. Komarov   (2009-07-03 13:37:00) [165]


> Сергей М. ©   (03.07.09 13:24) [34]
>
> > тогда функцию CRC16 нужно переделыват
>
>
> Это еще зачем ?)

Как зачем, он же String возвращает...


Anatoly Podgoretsky   (2009-07-03 13:33:00) [166]

> Dennis I. Komarov  (03.07.2009 12:44:28)  [28]

Ну это он поторопился, не учел все мещающие факторы.


Zheksonz   (2009-07-03 13:31:00) [167]

прблема ещё и в том, что пишу прогу на одном компе, а гоняю привод на другом, поэтому отладчик не всегда могу использовать...


Сергей М.   (2009-07-03 13:24:00) [168]


> тогда функцию CRC16 нужно переделыват


Это еще зачем ?)


> не уверен, что на выходе будет нужный мне формат команды


А зачем гадать ?
Отлоадчик для пушкина что ли существует ?
он тебе и покажет результат..


Zheksonz   (2009-07-03 13:19:00) [169]

2 Сергей

Ваш вариант мне не очень подходит, т.к тогда функцию CRC16 нужно переделыват, это раз, а во вторых я не уверен, что на выходе будет нужный мне формат команды.


Zheksonz   (2009-07-03 13:11:00) [170]


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;


вот код, а сослался я на строку, т.к. переменная в которую я присваиваю это значение строковая.


Сергей М.   (2009-07-03 13:08:00) [171]


> Юрий Зотов ©   (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);


Dennis I. Komarov   (2009-07-03 13:07:00) [172]


> хух... теперь вот такая кака: #1#6#0#4'#19#136', вместо
> #1#6#0#4#19#136... иначе говоря я формирую зтроку не из
> кодов этих значений, а из строковых значений. Сорри. Как
> исправить эту проблему???

У тебя ошибка в программе...
[8]-?


Zheksonz   (2009-07-03 13:02:00) [173]

хух... теперь вот такая кака: #1#6#0#4'#19#136', вместо #1#6#0#4#19#136... иначе говоря я формирую зтроку не из кодов этих значений, а из строковых значений. Сорри. Как исправить эту проблему???


Dennis I. Komarov   (2009-07-03 12:44:00) [174]


> Юрий Зотов ©   (03.07.09 12:35) [27]

Ну Вы же сами утверждали

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


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

> Сергей М. ©   (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:24:00) [176]


> "но от чего он ее считает" кого ее?? и это вопрос, вообще?
> ??

Вопрос был в [8], остальным понятно кого ее. А до этого Юрий Сергеевич прав в [22]


Zheksonz   (2009-07-03 12:20:00) [177]

а вот это уже пляски с бубнами, кстати, атор этого эпитета сам решил его исполненить...

Прав Юрий, таков протокол, и не тема это для обсуждения...

"но от чего он ее считает" кого ее?? и это вопрос, вообще???


Сергей М.   (2009-07-03 12:05:00) [178]


> 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);


Вот и всё ! И ничего никуда преобразовывать не нужно)


Anatoly Podgoretsky   (2009-07-03 11:23:00) [179]

> Юрий Зотов  (03.07.2009 11:22:22)  [22]

Намекаешь, что еще не вечер :-)


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

> Dennis I. Komarov ©   (03.07.09 11:16) [21]

> но от чего он ее считает

А это уже второй вопрос, к сабжу не относящийся. Вскоре, надо полагать, узнаем...
:o)


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

Наверх

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