[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: socket.select - non-blocking IO on a serial port
- From: "jonsmirl@..." <jonsmirl@...>
- Date: Wed, 24 Nov 2010 18:30:57 -0500
On Wed, Nov 24, 2010 at 5:34 PM, jonsmirl@gmail.com <jonsmirl@gmail.com> wrote:
> I'm trying to use the trick of wrapping a file descriptor for a serial
> port in a dummy socket and then using socket.select to do non-blocking
> IO on it.
>
> I can verify that the object for ttyin is on the list of read/write
> sockets being passed into select, but I am never getting any events.
> Is this the right way to implement getfd()? getfd = function ()
> return ttyin; end; I can't figure out to convert the FILE* from
> io.open into a bare fd for getfd().
I've verified that this is the problem. I know the fd is 5 and getfd =
function () return 5; end; works. So how do I convert the object from
io.open to an OS fd? There is no getfd() function.
>
> I'm on Linux where this should work.
>
> ttyin = assert(io.open("/dev/ttyUSB0", "rb"));
> ttyin:setvbuf("no");
> ttyout = assert(io.open("/dev/ttyUSB0", "wb"));
> ttyout:setvbuf("no");
>
>
> local serial = {
> getfd = function () return ttyin; end;
> dirty = function (self) return false; end;
> settimeout = function () end;
> send = function (_, data, i, j)
> print("serial write\n")
> ttyout:write(byte(i,j))
> -- Send data:sub(i,j) to serial, return bytes written
> return #data, 0; end;
> close = function () end;
> receive = function (_, patt)
> print("in serial receive function\n");
> local data = ttyin:read(1000);
> return data;
> end
> };
>
> local function on_incoming(serial, data)
> -- Do something with received serial data
> print("incoming serial ", data)
> end
>
> local function on_disconnect(serial, reason)
> -- Serial disconnect
> print("serial disconnect")
> end
>
> local function on_connect(serial, reason)
> -- Serial connect
> print("serial connect")
> end
>
> -- Registers the fake socket with net.server, and returns the
> server.lua conn wrapper object
> local serial_conn = require "net.server".wrapclient(serial, "serial", 0, {
> onincoming = on_incoming, onconnect = on_connect, ondisconnect =
> on_disconnect }, "*a");
>
> command = "\002\096"
> serial_conn:write(command);
> ttyout:write(command);ttyout:flush()
>
>
> --
> Jon Smirl
> jonsmirl@gmail.com
>
--
Jon Smirl
jonsmirl@gmail.com