[Gambas-user] Help binding to /dev/usbtmc0?

Benoît Minisini gambas at ...1...
Mon Jul 1 16:52:58 CEST 2013


Le 01/07/2013 16:38, dr.diesel a écrit :
> Thanks again, I believe this is what is causing my problems with
> "/dev/usbtmc0"
>
> read(2) and fread(2)
> Here's another aspect you need to be aware of. The kernel offers two sets of
> system calls for file I/O, and their behavior is slightly different,
> especially when it comes to reading data. The read(2) system call requests a
> given maximum number of bytes from the file (instrument), but it is happy if
> the call returns less than the maximum number. The fread(2) system call, on
> the other hand, has the habit of retrying until the total number requested
> bytes is reached (or until the call returns 0 bytes, which indicates the end
> of the file). This works well for real files, but it doesn't work well for
> instruments because the second read transaction will usually cause a
> timeout.
> If you use C or another language that gives you the choice, it is
> recommended to use read(2) etc. instead of fread(2) etc. However, if you use
> echo/cat and shell output redirection, the shell will use fread(2). In order
> to avoid the issues associated with automatic retries, the driver simply
> ignores every second call to its read entry point (assuming that call is a
> retry) unless the first call returned the maximum number of bytes requested
> (in which case there is no retry).
> It is important to note that if you are using read(2) – which is recommended
> – you need to deactivate the driver's default behavior of ignoring every
> second call to its read entry point! This can be done by setting a driver
> attribute through a call to the driver's ioctl entry point:
> int my_inst;
> struct usbtmc_attribute attr;
> my_inst=open(“/dev/usbtmc1”,O_RDWR);
> attr.attribute=USBTMC_ATTRIB_READ_MODE;
> attr.value=USBTMC_ATTRIB_VAL_READ; // using read, not fread
> ioctl(my_inst,USBTMC_IOCTL_SET_ATTRIBUTE,&attr);
>
> Source of the above:
>
> http://www.home.agilent.com/upload/cmc_upload/All/usbtmc.html?&cc=US&lc=eng
>
> I suspect CAT and Gambas are using fread(2), causing the timeouts.  Is there
> any method to use read(2) from Gabmas?
>
> Many thanks
>

Open ... For Read  -> read() is used
Open ... For Input -> fread() is used (which is NOT a system call, but a 
library function)

aString = Read #File, 256 -> Read 256 bytes and block

aString = Read #File, -256 -> Read *up to* 256 bytes, and less if there 
is not enough bytes to read immediately.

Lof(#File) -> Return the file size (for a file) *OR* the number of bytes 
that can be read immediately (for a socket or a device).

The second behaviour depends on the underlying device.

Regards,

-- 
Benoît Minisini




More information about the User mailing list