Simon,

I see what you mean, and I agree it would be nice to have a connection. That would be the natural way in S.

Yet, connections are driven by R. You cannot open a connection and let the connected device trigger some R code when data is available, don't you?

Otherwise, I don't understand your problem with "strings of code". A .R file also contains a series of "strings of code" interpreted by the R parser when you source() it. Just that code happens to be S. Here the code is Tcl. You can source as well a .tcl file with the same code if you prefer...

Best,

Philippe

On 21/04/10 14:07, Simon Urbanek wrote:
Philippe,

unfortunately that approach has one major drawback - it does not give you a 
connection. As I said in the previous e-mail it is fairly easy to talk to a tty 
directly, but the challenge is to turn it into a connection. I don't like the 
Tcl approach for several reasons, one of them being that it's entirely 
unnatural since you have to construct strings of code -- you could as well use 
rJava and Java serial connections which has a little more friendly syntax (but 
I wouldn't recommend that, either) or any other language R interfaces to.

I was thinking about it a bit and I may be tempted to have a dab at a tty 
connection, but I still would not want to mess with ioctl (the other part Matt 
mentioned).

Cheers,
Simon



On Apr 21, 2010, at 6:30 AM, Philippe Grosjean wrote:

There is another option I use since a couple of years to pilot scientific 
devices, to program my chemostats, etc. and that is platform-independent: Tcl.

Tcl i/o design is excellent and very robust, and Tcl/Tk is integrated in R with 
the tcltk package.

It is really just a mather of a few lines of code in R to communicate through a 
serial port from R using Tcl. Something like:

require(tcltk)
.Tcl('set R_com1 [open "com1" r+]') # Works on Windows too!

# There are many config parameters available here... just an example
.Tcl('fconfigure $R_com1 -mode "9600,n,8,1" -buffering none -blocking 0')

# Send a command to your device through the serial port
.Tcl('puts -nonewline $R_com1 {my_cmd}')

# Read a line of text from the serial port
line<- tclvalue(.Tcl('gets $R_com1'))

With a little bit more code, one can program Tcl to call R code automatically 
everytime new data is pushed by the connected device through the serial port. 
This is done using something like:

.Tcl('fileevent $R_com1 readable [list Handler_com1 $R_com1]')

Here, "Handler_com1" is a Tcl function. So, some care must be taken using 
tcltk's .Tcl.callback() to trigger the event on the R side. One way to deal with this 
easily is by using tclFun() from the tcltk2 package.

In tcltk2, there is also ?tclTaskSchedule that can be of interest in the 
context of serial port communication to trigger a R function in the background 
regularly and collect data actively from the serial port.

All these tools give me a lot a flexibility to communicate through the serial 
port from R,... and most importantly, to write my code in a portable way 
(tested on Windows XP and Linux Ubuntu).

If there is some interest in this approach, I could initiate a 'tclcom' R 
package on R-Forge and place there the code I have.

Best,

Philippe
..............................................<°}))><........
) ) ) ) )
( ( ( ( (    Prof. Philippe Grosjean
) ) ) ) )
( ( ( ( (    Numerical Ecology of Aquatic Systems
) ) ) ) )   Mons University, Belgium
( ( ( ( (
..............................................................

On 21/04/10 03:17, shotwelm wrote:
Simon is right of course, there are plenty of sensors that would work
just fine at 9600 baud (like a thermistor rigged to an ADC). There's a
theorem along these lines (Nyquist sampling theorem?). I think piping
the output to R is a clever solution. I added a few lines to the ttys.c
program so that the baud rate is a command line option (i.e. -B9600)
<http://biostatmatt.com/temp/ttys.c>   and confirmed it will compile in
Linux (2.6.30). Maybe it will save a step. Microcontrollers really are
addictive!

For an ioctl package, I was originally thinking of using file
descriptors directly. However, I agree this feels like subverting what
could be an extension of the connections API. Given that "everything is
a file" in POSIX systems, there may be an argument for an ioctl package
that is independent of the connections implementation, say to do things
that connections were not designed to do. For example, interfacing with
V4L2 devices usually involves many ioctl calls, an mmap call, but rarely
read or write calls. But maybe it would just be better to pipe this type
of output to R also...

-Matt

On Tue, 2010-04-20 at 16:42 -0400, Simon Urbanek wrote:
On Apr 20, 2010, at 11:51 AM, shotwelm wrote:

I've done some microcontroller work over serial also. Unfortunately, 
interfacing with a serial port is system dependent, and the mechanisms can be 
quite different, as you probably know. It appears that Simon has a solution 
below that will work if you are willing to accept the default baud rate (9600 
is way too slow for good sensor data

[OT: define "good" ;) - good doesn't mean fast - besides it won't be any good 
if it is too fast to be meaningfully processed -- that's a different story, though :P - 
and it is trivial to change so the solution works in general]


), parity, etc.. or use external tools. On POSIX systems, you would need access 
to the termios.h header and the system ioctl function in order to change these 
settings. Although I'm not 100% sure, I don't think R has this capability ... 
yet.

I'm new to the list, but I'd be surprised if the R developers that have been 
around awhile haven't already considered adding support for ioctls and the 
POSIX terminal interface. This makes me wonder why it's not there. If there is 
no good reason, I'm starting to see a series of R packages (or core extensions) 
developing.

Good luck ;). The issue is that connections are inherently backend-independent 
which implies that packages have no access to connection internals as they can 
change at any time. This means that you can't enhance them without putting the 
enhancements into R itself. This implies that you have to make a strong case 
since you need a volunteer in R-core to maintain that code etc.


With a package for ioctls, we could use all sorts of cool stuff, like 
Video4Linux2 (webcams, HAM radio, tuners)...


Ioctls are highly system-specific which is orthogonal to the design of 
connections. You could probably hack together a FD-based access system but it 
would not be compatible with connections (unless you exploit undocumented 
things if possible at all ...). Also ioctls can change the stream semantics 
entirely thus breaking anything that deals with the FD assuming some defined 
state ...


When I collect sensor data over serial, I do it in python or write a small C 
program to dump a single-column csv. Of course, R is excellent for digital 
signal processing after that. Check out the DSP ( 
http://biostatmatt.com/archives/78 ) I did in R with some ECG data I collected 
with an Atmel uC.


Well, we're back to calling tools to do the interfacing like the ttys (I do 
prefer pipe to intermediate files)... It's not that complicated and has several 
benefits (implicit parallelization, process separation in case things go wrong 
etc.) so it is not obvious that it's a bad thing ...

I suspect that we're simply suck until the connection API is either exposed or re-written so 
packages can provide new connections types or extend existing one. Again, this is not trivial 
especially when you start messing with ioctl since it's easy to depart from defined behavior in 
that case ... That said, I agree that expanding connections is useful so some progress there would 
be desirable - but the "how" and "who" is not clear to me ...

That's just my $0.02, though ...

Cheers,
Simon



On Tue, 2010-04-20 at 11:05 -0400, Simon Urbanek wrote:
On Apr 20, 2010, at 10:33 AM, Blair Christian wrote:

Does anybody know if there is any support to read from serial ports? I just got 
an arduino, and wanted to write some scripts for working with real time 
streaming sensor data...


Yes (I have Arduinos reporting measurements from all sensors in the house to R 
on my iMac which produces plots that are synchronized with my webserver). In 
principle you can simply use /dev/tty.usb... and read from it. In most cases 
the default setting is already fine (9600,n,8,1 on Mac) or you can use tools 
the set it up in advance (setserial on Linux etc.) so you don't have to worry 
about setting up the serial from R.

Depending on your OS you may be able to read from the serial device directly 
with a regular file connection or you can use a pipe connection to a tool which 
pipes out from the tty to stdout (written for a Mac but may work on other 
unices):

https://svn.rforge.net/C/trunk/tools/ttys.c

and then use something like

f=pipe("ttys /dev/tty.usbserial-X1234")

A rather handy option -d prepends current time to each line so you can track 
output over time. I have some more tools for this (even allowing you to share 
form Arduino output with several computers or even send remote commands to your 
Arduino including encryption etc ...).

Cheers,
Simon

PS: From experience I can say that Arduinos are highly addictive so beware ;).


In base::connections documentation, it's not clear if there's an easy
way to do this?  Any ideas on hacking it?  I'm open to win/linux/mac
solutions.  I'm not sure how sockets work, but possibly there is a way
to pipe things to a buffer and read from a buffer in bash (in my linux
mind I have the thought of trying to redirect /dev/something to a
file, or symlinking a file to point to the hardware, but know that
there has to be some secret sauce to go from streaming in to a
readable file, but don't know what the missing components are).

Thoughts?

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel



______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel




______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel





______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel



______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to