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