Holger Bruns wrote:
Jürgen Hestermann schrieb:
function SerRead(Handle: TSerialHandle; var Buffer; Count: LongInt):
LongInt;
begin
Result := fpRead(Handle, Buffer, Count);
end;
i don't understand the declaration for "buffer" in the function
below, because no type is declared for "buffer".
I believe that the type is irrelevant, you can use whatever you want.
I think that it's just used by fpRead to buffer data. You only
provide the space for the buffer but you don't need to read it
directly. It seems that Count has to be the size of the buffer. But I
am just guessing....
My hope was to read more than guessing. As I pointed out, the "buffer"
seems not to be filled with incoming data from the selected serial
port. Hence I cannot read just this data, and serread seems to be
faulty. For this reason I ask for an advice. I need to look on working
sample code to use this function in a working manner. In my example,
serread replies only, what has been written with serwrite right
before. Not even serflush, executed right after serwrite, can solve
this problem to me.
var foo;
const foo;
are hidden pointer types.
That is foo would contain a pointer, but you never see this. You never
have to get the address of something, and you never have to dereference it.
As for using this:
SerRead(Handle, Buffer, 0)
Buffer must be the first byte of a block of memory
you can do:
var buffer: Array of byte;
SetLength(Buffer, 1000);
SerRead(Handle, Buffer[0], 1000);
NOTE the [0] index you supply the first byte of your buffer.
FPC is internally taking the address of this first bytes, and then 1000
bytes from this address on will be used
----
Example 2
var buffer: ^Byte; // bointer to byte
Buffer = GetMem.....; // buffer contains the address of your memory
SerRead(Handle, Buffer^, 1000); // again ^ dereference it
----
Example 3
There are case where the [0] or ^ is optional, but you need to
understand a lot how fpc allocates memory
var buffer: Array [0..999] of byte;
SerRead(Handle, Buffer, 1000); // you can do buffer[0] too
-------
The most common fault is, that people forget to specify [0] or ^ and
that leads to errors.
The below is WRONG:
var buffer: ^Byte; // bointer to byte
Buffer = GetMem.....; // buffer contains the address of your memory
SerRead(Handle, Buffer, 1000); // missing ^
It is wrong because buffer itself is a variable having 4 or 8 byte (32
or 64 bit platform). Buffer only contains the address of where the data is.
If you pass buffer like in the example above, "SerRead" willbut the
rsult into the 4 bytes of the variable itself (and then writing to
random memory behind this)
Martin
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal