![]() |
| ||
|
|
Новости |
Поиск |
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 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)