<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">Hi, Jason.<br>Thank you for your explanations. They were very useful. In the light of what you said, I modified the programs as shown below (commented lines failed to work). Forcing the C function to return a number, wrapping the returned number in IO,&nbsp; and printing the number, I succeeded in bringing falures down to 1 case in 20 trials (average). By the way, I talked to doctors who work with capnograms, and they said that all Windows or Linux machines have problems in closing communication ports. However, it seems that capnographs are not turned off very often. I mean, when the doctor move the capnograph from one patient to another, s/he turns&nbsp; off the instrument.&nbsp; Therefore, this behavior does not create problems. However, what bothers me is that Clean always succeds in closeing the port.<br><br>{-# LANGUAGE ForeignFunctionInterface #-}<br>{-
 file: SER/IAL.hs -}<br>module SER.IAL where<br>&nbsp;<br>&nbsp;import Control.Monad<br>&nbsp;import Foreign<br>&nbsp;import Foreign.C.Types<br>&nbsp;import Foreign.C <br><br>&nbsp;foreign import ccall "rs232.h opencport" opencport :: CInt -&gt; IO ()<br>&nbsp;-- foreign import ccall "rs232.h closecport" closecport :: CInt -&gt; CInt<br>&nbsp;-- foreign import stdcall unsafe "rs232.h closecport" closecport :: IO () <br>&nbsp;--&nbsp; foreign import ccall unsafe "rs232.h closecport" c_closecport ::&nbsp; CInt<br>&nbsp;foreign import ccall unsafe "rs232.h closecport" c_closecport :: CInt -&gt; CInt<br><br>&nbsp;closecport :: Int -&gt; IO Int<br>&nbsp;closecport n= return (fromIntegral (c_closecport (fromIntegral n)))<br><br><br>&nbsp;foreign import ccall "rs232.h rdrs232" c_sendmsg :: CInt -&gt; CString -&gt; CString<br>&nbsp;sendMessage :: Int -&gt; String -&gt; IO String<br>&nbsp;sendMessage&nbsp; n msg = <br>&nbsp;&nbsp; withCString msg
 $<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \str -&gt; peekCString (c_sendmsg (fromIntegral n) str)<br><br><br>{- file: sensors.hs -}<br>import Gui.Binding<br>import Gui.Types<br>import Gui.Constants<br>import SER.IAL<br>import Control.Monad<br>import Data.Char<br><br>main = do rv &lt;- j_start<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame &lt;- j_frame "Sensors"<br>&nbsp;&nbsp;&nbsp; &nbsp; avg &lt;- j_button frame "Sampling"<br>&nbsp;&nbsp;&nbsp; &nbsp; j_setpos avg 20 150<br>&nbsp;&nbsp;&nbsp; &nbsp; j_setsize avg 90 30<br>&nbsp;&nbsp;&nbsp; &nbsp; rb &lt;- j_button frame "Read"<br>&nbsp;&nbsp;&nbsp; &nbsp; j_setpos rb 125 150<br>&nbsp;&nbsp;&nbsp; &nbsp; j_setsize rb 90 30<br>&nbsp;&nbsp;&nbsp; &nbsp; tb &lt;- j_button frame "Acquisition"<br>&nbsp;&nbsp;&nbsp; &nbsp; j_setpos tb 230 150<br>&nbsp;&nbsp;&nbsp; &nbsp; j_setsize tb 90 30<br>&nbsp;&nbsp;&nbsp; &nbsp; fld &lt;- j_textfield frame 40 <br>&nbsp;&nbsp;&nbsp; &nbsp; j_setpos fld 20
 100<br>&nbsp;&nbsp;&nbsp; &nbsp; menubar &lt;- j_menubar frame<br>&nbsp;&nbsp;&nbsp; &nbsp; file &lt;- j_menu menubar "File"<br>&nbsp;&nbsp;&nbsp; &nbsp; quitMI &lt;- j_menuitem file "Quit"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j_show frame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opencport(3)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; waitForFrameAction frame fld rb tb avg quitMI<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r &lt;- closecport 5<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putStrLn (show r)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return j_quit<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>waitForFrameAction frame f rb tb avg q = <br>&nbsp;&nbsp;&nbsp; do obj &lt;-&nbsp; j_nextaction<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; again &lt;- if obj == event q then return False&nbsp;
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if obj == event rb then <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (do msg &lt;- sendMessage 1 "r"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putStrLn msg<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if obj == event tb then <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; (do <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; tx &lt;- sendMessage 1 "t"<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; let tp= filter (&gt; ' ') tx<br>&nbsp;&nbsp;&nbsp;
 &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; j_settext f tp<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; return True)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else if obj == event avg then<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; (do ok &lt;- sendMessage 1 "m"<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val &lt;- j_gettext f 300<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ns &lt;- sendMessage 2 val<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putStrLn ((filter (&gt; ' ') ok) ++ ns)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return True)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; (do <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; tx &lt;- sendMessage 1 "t"<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
 &nbsp;&nbsp;&nbsp;&nbsp; let tp= filter (&gt; ' ') tx<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; rx &lt;- sendMessage 1 "x"<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; let rd= filter (&gt; ' ') rx<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; let x = hex2dec rd<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; let tt= (fromIntegral x)*209.1/1023.0 - 67.23<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; j_settext f ((show tt)++" ==&gt; "++tp)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; return True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not again<br>&nbsp;&nbsp;&nbsp; &nbsp; then return True<br>&nbsp;&nbsp;&nbsp; &nbsp; else waitForFrameAction frame f rb tb avg q<br><br>hex2dec :: String -&gt; Int<br>hex2dec h= sum (zipWith (*)
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (map (16^) [3,2,1,0])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [digitToInt c | c &lt;- h]) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>convert d r s0= (fromIntegral (hex2dec d))*r/1024.0- s0 <br><br>{- 1a43 67.23; 082b - 209.1 -}<br><br><br>// file: serial.c<br>#include "serial.h"<br>#include &lt;string.h&gt;<br>#include &lt;stdio.h&gt;<br><br>/*<br>Possible baudrates on a normal pc:<br><br>50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800,<br>2400, 4800, 9600, 19200, 38400, 57600, 115200<br>*/<br><br>#define BAUD "baud=9600 data=8 parity=N stop=1"<br><br><br>HANDLE Cport;<br><br><br>char comports[16][10]={"\\\\.\\COM1",&nbsp; "\\\\.\\COM2",&nbsp; "\\\\.\\COM3",&nbsp;
 "\\\\.\\COM4",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\\\\.\\COM5",&nbsp; "\\\\.\\COM6",&nbsp; "\\\\.\\COM7",&nbsp; "\\\\.\\COM8",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\\\\.\\COM9",&nbsp; "\\\\.\\COM10", "\\\\.\\COM11", "\\\\.\\COM12",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\\\\.\\COM13", "\\\\.\\COM14", "\\\\.\\COM15", "\\\\.\\COM16"};<br><br><br>int OpenComport(int comport_number)<br>{<br>&nbsp; if(comport_number&gt;15)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; printf("illegal comport number\n");<br>&nbsp;&nbsp;&nbsp; return(1);<br>&nbsp; }<br><br>&nbsp; Cport =
 CreateFileA(comports[comport_number],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GENERIC_READ|GENERIC_WRITE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* no share&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* no security */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 OPEN_EXISTING,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* no threads */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* no templates */<br><br>&nbsp; if(Cport==INVALID_HANDLE_VALUE)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; printf("unable to open comport\n");<br>&nbsp;&nbsp;&nbsp; return(1);<br>&nbsp; }<br><br>&nbsp; DCB port_settings;<br>&nbsp; memset(&amp;port_settings, 0, sizeof(port_settings));&nbsp; /* clear the new struct&nbsp; */<br>&nbsp; port_settings.DCBlength = sizeof(port_settings);<br><br>&nbsp;
 if(!BuildCommDCBA(BAUD, &amp;port_settings))<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; printf("unable to set comport dcb settings\n");<br>&nbsp;&nbsp;&nbsp; CloseHandle(Cport);<br>&nbsp;&nbsp;&nbsp; return(1);<br>&nbsp; }<br><br>&nbsp; if(!SetCommState(Cport, &amp;port_settings))<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; printf("unable to set comport cfg settings\n");<br>&nbsp;&nbsp;&nbsp; CloseHandle(Cport);<br>&nbsp;&nbsp;&nbsp; return(1);<br>&nbsp; }<br><br>&nbsp; COMMTIMEOUTS Cptimeouts;<br><br>&nbsp; Cptimeouts.ReadIntervalTimeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = MAXDWORD;<br>&nbsp; Cptimeouts.ReadTotalTimeoutMultiplier&nbsp; = 10;<br>&nbsp; Cptimeouts.ReadTotalTimeoutConstant&nbsp;&nbsp;&nbsp; = 10;<br>&nbsp; Cptimeouts.WriteTotalTimeoutMultiplier = 10;<br>&nbsp; Cptimeouts.WriteTotalTimeoutConstant&nbsp;&nbsp; = 10;<br><br>&nbsp; if(!SetCommTimeouts(Cport, &amp;Cptimeouts))<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; printf("unable to set comport time-out
 settings\n");<br>&nbsp;&nbsp;&nbsp; CloseHandle(Cport);<br>&nbsp;&nbsp;&nbsp; return(1);<br>&nbsp; }<br><br>&nbsp; return(0);<br>}<br><br><br>int PollComport(unsigned char *buf, int size)<br>{<br>&nbsp; int n;<br><br>&nbsp; if(size&gt;4096)&nbsp; size = 4096;<br><br>/* added the void pointer cast, otherwise gcc will complain about */<br>/* "warning: dereferencing type-punned pointer will break strict aliasing rules" */<br><br>&nbsp; ReadFile(Cport, buf, size, (LPDWORD)((void *)&amp;n), NULL);<br><br>&nbsp; return(n);<br>}<br><br><br>int RdByte(unsigned char* m)<br>{<br>&nbsp; int n;<br><br><br>&nbsp; ReadFile(Cport, m, 1, (LPDWORD)((void *)&amp;n), NULL);<br><br>&nbsp; return(n);<br>}<br><br><br>int SendByte(unsigned char byte)<br>{<br>&nbsp; int n;<br><br>&nbsp; WriteFile(Cport, &amp;byte, 1, (LPDWORD)((void *)&amp;n), NULL);<br><br>&nbsp; if(n&lt;0)&nbsp; return(1);<br><br>&nbsp; return(0);<br>}<br><br><br>int SendBuf(unsigned char *buf, int
 size)<br>{<br>&nbsp; int n;<br><br>&nbsp; if(WriteFile(Cport, buf, size, (LPDWORD)((void *)&amp;n), NULL))<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return(n);<br>&nbsp; }<br><br>&nbsp; return(-1);<br>}<br><br><br>int CloseComport(void)<br>{<br>&nbsp; CloseHandle(Cport);<br>&nbsp; return(0);<br>}<br><br><br>int IsCTSEnabled(void)<br>{<br>&nbsp; int status;<br><br>&nbsp; GetCommModemStatus(Cport, (LPDWORD)((void *)&amp;status));<br><br>&nbsp; if(status&amp;MS_CTS_ON) return(1);<br>&nbsp; else return(0);<br>}<br><br><br><br>int cprintf(const char *text)&nbsp; /* sends a string to serial port */<br>{<br>&nbsp; while(*text != 0)&nbsp;&nbsp; SendByte(*(text++));<br>&nbsp; return(0);<br>}<br><br>int opencport(int p) {<br>&nbsp;&nbsp; OpenComport(p-1);<br>&nbsp;&nbsp; return 3;<br><br>}<br><br>int closecport(int n) {<br>&nbsp;&nbsp; CloseHandle(Cport);<br>&nbsp;&nbsp; printf("Bye\n");<br>&nbsp;&nbsp; return n; }<br><br><br>char* rdrs232(int n, char* msg)
 {<br><br><br>&nbsp;&nbsp;&nbsp; char *str;<br><br>&nbsp;&nbsp;&nbsp; char mm;<br>&nbsp;&nbsp;&nbsp; int i, j;<br><br>&nbsp;&nbsp;&nbsp; for (j=0; j&lt;n; j++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; SendByte(msg[j]); }<br>&nbsp;&nbsp;&nbsp; str = (char *) malloc(16000);<br><br>&nbsp;&nbsp;&nbsp; i=0;<br>&nbsp;&nbsp;&nbsp; mm=0;<br>&nbsp;&nbsp;&nbsp; while (mm != 10) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; RdByte(&amp;mm);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; str[i]= mm;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i= i+1;<br><br>}<br>&nbsp;&nbsp;&nbsp; if (i&gt;0 &amp;&amp; str[0]==0) { str[0]= ' ';}<br><br>&nbsp;&nbsp;&nbsp; return(str);<br>}<br><br><br>//file: serial.h<br>#ifndef rs232_INCLUDED<br>#define rs232_INCLUDED<br><br>#ifdef __cplusplus<br>extern "C" {<br>#endif<br><br>#include &lt;stdio.h&gt;<br>#include &lt;string.h&gt;<br><br><br><br>#ifdef __linux__<br><br>#include &lt;termios.h&gt;<br>#include &lt;sys/ioctl.h&gt;<br>#include
 &lt;unistd.h&gt;<br>#include &lt;fcntl.h&gt;<br>#include &lt;sys/types.h&gt;<br>#include &lt;sys/stat.h&gt;<br>#include &lt;limits.h&gt;<br><br>#else<br><br>#include &lt;windows.h&gt;<br><br>#endif<br><br>int OpenComport(int);<br>int PollComport(unsigned char *, int);<br>int SendByte(unsigned char);<br>int SendBuf(unsigned char *, int);<br>int CloseComport(void);<br>int cprintf(const char *);<br>int IsCTSEnabled(void);<br>char *topa(int n);<br>int opencport(int p);<br>int closecport(int n);<br>char* rdrs232(int n, char* msg);<br><br>#ifdef __cplusplus<br>} /* extern "C" */<br>#endif<br><br>#endif<br><br><br><br>--- On <b>Tue, 11/10/09, Jason Dusek <i>&lt;jason.dusek@gmail.com&gt;</i></b> wrote:<br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: Jason Dusek &lt;jason.dusek@gmail.com&gt;<br>Subject: Re: [Haskell-cafe] Help Haskell driving Medical Instruments<br>To: "Philippos Apolinarius"
 &lt;phi500ac@yahoo.ca&gt;<br>Cc: "Haskell Cafe" &lt;haskell-cafe@haskell.org&gt;<br>Received: Tuesday, November 10, 2009, 1:09 PM<br><br><div class="plainMail">2009/11/10 Philippos Apolinarius &lt;<a ymailto="mailto:phi500ac@yahoo.ca" href="/mc/compose?to=phi500ac@yahoo.ca">phi500ac@yahoo.ca</a>&gt;<br>&gt; I don't know how to mark the call unsafe. [...] I am running<br>&gt; the main program on Windows.<br><br>&nbsp; Marking it unsafe is done by putting "unsafe" in the foreign<br>&nbsp; import declaration. Even if it turns out not to fix the<br>&nbsp; problem, it reduces the overhead of foreign calls (and is safe<br>&nbsp; as long as they aren't going to call back into Haskell).<br><br>&nbsp; Because your on Windows, you want to use "stdcall", as<br>&nbsp; mentioned by Daniel Fischer. Thus the full declaration is:<br><br>&nbsp; &nbsp; foreign import stdcall unsafe "rs232.h closecport" closecport :: IO ()<br><br>&nbsp; Let us know if this
 helps.<br><br>&gt; Here is the compilation script:<br>&gt;<br>&gt; ghc -fglasgow-exts serial.c&nbsp; %1.hs -L./ -ljapi --make<br>&gt; erase *.hi<br>&gt; erase *.o<br>&gt; strip %1.exe<br><br>&nbsp; I encourage you to look into Cabal soon :)<br><br>--<br>Jason Dusek<br></div></blockquote></td></tr></table><br>
      <hr size=1>
Looking for the perfect gift?<a href="http://www.flickr.com/gift/"><b> Give the gift of Flickr!</b></a>