![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WriteBuffer - error - Access violation at addr... почему??? [D7, XP]
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