On 8/29/07, Esa Ilari Vuokko <[EMAIL PROTECTED]> wrote: > On 8/29/07, Ronald Guida <[EMAIL PROTECTED]> wrote: > > I'm on a Windows box and I'm looking for a way to talk to a serial > > port (for example, RS-232) from Haskell. I couldn't find a library to > > do this, so I am wondering how to create one. > > > > I have a fairly thorough understanding of how to open and use a serial > > port with the Windows API. In particular, to open a serial port, I > > At the moment, I think it is easier to just use the same Windows API directly, > rather than try to bend GHC's IO system to do it "right". > > > have to use CreateFile, which is the same API call that opens files. > > In fact, if I call openFile from GHC, and pass "COM1:" as the > > filename, then I can get a writable serial port. > > > > > module Serial > > > where > > > import System.IO > > > > > > main = do > > > h <- openFile "COM1:" ReadWriteMode > > > hPutStrLn h "Hello World" > > > > I can't read from the port (I always get an immediate EOF), and I have > > no way of configuring things like the baud rate or the parity > > settings. Nevertheless, this demonstrates that openFile can at least > > open the serial port. > > > > What I would like to do is create some functions that would allow me > > to open and configure a serial port, and get a Handle back so that I > > can use the existing IO functions like hGetChar and hPutChar. I am > > assuming that hGetChar eventually calls win32::ReadFile and hPutChar > > eventually calls win32::WriteFile. These same two API calls would > > work for serial ports. > > Unfortunately, it goes via extra hoops and uses c runtime instead of > Windows API directly. This extra layer makes sure it's hard to predict > exactly what gets done (and with what options) sometimes. > > And even if it did, it'd probably use overlapping io, does that work with > COM ports? > > > In Windows, there are 23 API functions that apply specifically to > > serial ports. Out of these 23 functions, only a few of them are > > actually necessary if I just want to send and receive data. > > > > Of course, I don't know how to call Windows API functions from Haskell, > > and I have no idea how to hook things to the IO library so that I can > > use a Handle for a serial port. I'm looking for some advice on how to > > proceed. > > I haven't done much work on COM ports, but the little I did, I used bindings > in Win32 and probably some of my own, and didn't use System.IO/Handle > at all. Maybe problems with GHC's IO system are easy to solve, but I have > no idea and wasn't inclined to find out. > > Best regards, > Esa > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe >
Ideally, we would have something like pyserial ( http://pyserial.sourceforge.net ) for Haskell. It provides a nice portable abstraction over serial communication. See for example the windows binding: http://pyserial.cvs.sourceforge.net/pyserial/pyserial/serial/serialwin32.py?view=markup regards, Bas van Dijk _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe