Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

WriteBuffer - error - Access violation at addr... почему??? [D7, XP]


Страницы:   1 2 3

Zheksonz ©   (2009-07-14 17:38:00) 

Всем привет)) Сергей М., персональный.
решил всё-таки общаться с портом без помощи строк. В сабже ошибка выдаваемая на записи в буфер. Что это может быть???

Код:
procedure TForm1.Button1Click(Sender: TObject);
const
CmdHZ: array[0..3] of byte = (01, 06, 00, 04);
var
CmdData: Word;
CmdCRC16: Word;
ms: TMemoryStream;
begin
// ComPort.Open;
CmdData := UpDown1.Position;
ms.WriteBuffer(CmdHZ, SizeOf(CmdHZ));
CmdData := Swap(CmdData);
ms.WriteBuffer(CmdData, SizeOf(CmdData));
CmdCRC16 := Swap(GetCRC16(ms.Memory, ms.Size));
ms.WriteBuffer(CmdCRC16, SizeOf(CmdCRC16));
ComPort.Write(ms.Memory^, ms.Size);
ComPort.Close;
end;


function TForm1.GetCRC16(P: PChar; Len: Word): Word;
var
iByte, i: Word;
B: Byte;
begin
{$R-}
Result := $FFFF;
for iByte := 0 to Len-1 do
  begin
   B := Byte(Pointer(LongInt(P)+iByte)^);
   Result := (Result and $FF00) + (B xor Lo(Result));
   for i := 1 to 8 do
     begin
      if ((Result and $0001) <> 0) then
        Result := (Result shr 1) xor $A001
      else Result := (Result shr 1);
     end;
  end;
{$R+}
end;


на всякий случай привожу и ф-цию вычисления контрольной суммы.


Sha   (2009-07-15 00:22:00) [41]

> Zheksonz   (15.07.09 00:17) [16]
> как проще привести их к одному типу???

тогда надо так:
cp.CRC16:=GetCRC16(@cp, SizeOf(cp.Pref) + SizeOf(cp.Data));

ЗЫ. Вообще-то, GetCRC16 очень причудливо написана )


Zheksonz   (2009-07-15 00:21:00) [42]

да, протокол ModBus


Sha   (2009-07-15 00:18:00) [43]

> а CRC16 Swap_нуть не нужно???

Нет. В твоем процессоре целочисленные данные (например, типа word) хранятся в low-endian представлении (дословно: младшим концом вперед),
т.е. младший байт - в младшем адресе. А это как раз то, что тебе надо, если, конечно, у тебя используется протокол Modbus.


Zheksonz   (2009-07-15 00:17:00) [44]

всмысле Swap(GetCRC16(cp, SizeOf(cp.Pref) + SizeOf(cp.Data)));

и ещё, ф-ция GetCrc16 у меня принимает GetCRC16(P: PChar; Len: Word)а cpу нас имеет тип CmdPack

как проще привести их к одному типу???


Zheksonz   (2009-07-15 00:10:00) [45]


> Sha ©   (15.07.09 00:06) [14]

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

а CRC16 Swap_нуть не нужно???


Sha   (2009-07-15 00:06:00) [46]


const
  CmdPref = $04000601;
type
  CmdPack = packed record
    Pref: integer;
    Data: word;
    crc16: word;
  end;
var
  cp: CmdPack;
begin
  cp.Pref:=CmdPref;
  cp.Data:=Swap(UpDown1.Position);
  cp.CRC16:=GetCRC16(cp, SizeOf(cp.Pref) + SizeOf(cp.Data));
 
  ComPort.Open;
  ComPort.Write(cp, SizeOf(cp));
  ComPort.Close;
end;


Zheksonz   (2009-07-14 23:52:00) [47]


> Sha ©   (14.07.09 23:23) [10]


const
CmdPref: array[0..3] of byte = (01, 06, 00, 04);
type
 CmdPack = packed record
   c_Pref: array[0..3] of byte;
   c_Data: array[0..1] of byte;
   c_crc16: array[0..1] of byte;
 end;


оно???


Sha   (2009-07-14 23:31:00) [48]

> т.е. Swap не нужно делать???

Да, для CRC не надо


Zheksonz   (2009-07-14 23:28:00) [49]


> В нем при передаче CRC первым передается младший байт, а
> ты передаешь старший.

т.е. Swap не нужно делать???


> Вот нафига тебя теперь в потоки занесло? Давай заюзай еще
> Мемо или файл.Тебе ж в прошлой ветке было сказано, что достаточно
> packed record.


Сергей М. предложил этот вариант, я решил его попробовать...


Sha   (2009-07-14 23:23:00) [50]

> Zheksonz   (14.07.09 17:38)
> решил всё-таки общаться с портом без помощи строк

Вот нафига тебя теперь в потоки занесло? Давай заюзай еще Мемо или файл.
Тебе ж в прошлой ветке было сказано, что достаточно packed record.

> на всякий случай привожу и ф-цию вычисления контрольной суммы

Судя по приведенной CRC у тебя используется Modbus протокол.
В нем при передаче CRC первым передается младший байт, а ты передаешь старший.


Loginov Dmitry   (2009-07-14 22:23:00) [51]


> кому, ему???


значению ms.Memory


Rouse_   (2009-07-14 22:15:00) [52]


> просматриваю в отладчике значение ms.Memory, оно не меняется
> вне зависимости от присвоений... всегда равно $14A058

А зачем менять указатель на буффер?


Zheksonz   (2009-07-14 22:01:00) [53]


> Оно само изменится когда ему будет надо!

кому, ему???


Loginov Dmitry   (2009-07-14 21:44:00) [54]


> странно... просматриваю в отладчике значение ms.Memory,
> оно не меняется вне зависимости от присвоений... всегда
> равно $14A058 может я неправильно пишу в буфер???


Оно само изменится когда ему будет надо!


Zheksonz   (2009-07-14 21:40:00) [55]

странно... просматриваю в отладчике значение ms.Memory, оно не меняется вне зависимости от присвоений... всегда равно $14A058может я неправильно пишу в буфер???


Zheksonz   (2009-07-14 18:28:00) [56]


> Invalid user. Replace and strike any key when ready

бан отменили???

procedure TForm1.Button1Click(Sender: TObject);
const
CmdHZ: array[0..3] of byte = (01, 06, 00, 04);
var
CmdData: Word;
CmdCRC16: Word;
ms: TMemoryStream;
begin
ComPort.Open;
ms := TMemoryStream.Create;
CmdData := UpDown1.Position;
ms.WriteBuffer(CmdHZ, SizeOf(CmdHZ));
CmdData := Swap(CmdData);
ms.WriteBuffer(CmdData, SizeOf(CmdData));
CmdCRC16 := Swap(GetCRC16(ms.Memory, ms.Size));
ms.WriteBuffer(CmdCRC16, SizeOf(CmdCRC16));
ComPort.Write(ms.Memory^, ms.Size);
ms.Free;
ComPort.Close;
end;


сейчас код проходит, но устройство не воспринимает создаваемую команду... буду разбираться...


Palladin   (2009-07-14 17:50:00) [57]

Пушкин вестимо


Rouse_   (2009-07-14 17:48:00) [58]

А ms создавать кто будет?


Игорь Шевченко   (2009-07-14 17:45:00) [59]


> Что это может быть???


Invalid user. Replace and strike any key when ready


Страницы:   1 2 3

Наверх

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