* Asynchronous I/O on a serial device
@ 2011-06-11 21:46 Kim Rostgaard Christensen
2011-06-12 5:23 ` Randy Brukardt
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Kim Rostgaard Christensen @ 2011-06-11 21:46 UTC (permalink / raw)
Hi there
I am desperately trying to implement a protocol on top of a serial
transport.
I am running Debian, and for the moment using /dev/ttyACM0 for reading.
This works fine using standard the Text_IO package and In_File.
Only, when I need to write to the device It fails because It is in
In_File mode - Obviously.
Reset on the file handle gives me a USE_ERROR exception, probably due to
it being a special file - please correct me if I am wrong.
Do I need to implement this more system-near/specific, or is there some
way I can do bi-directional communication like, for instance two file
handles. (I tried Form => "shared=yes", and it also failed).
It is a usb device that emulates UART, and it seems to be contempt with
just about any Baud setting.
/Kim
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Asynchronous I/O on a serial device
2011-06-11 21:46 Asynchronous I/O on a serial device Kim Rostgaard Christensen
@ 2011-06-12 5:23 ` Randy Brukardt
2011-06-12 7:33 ` Kim Rostgaard Christensen
2011-06-12 5:42 ` Yannick Duchêne (Hibou57)
2011-06-12 21:01 ` anon
2 siblings, 1 reply; 11+ messages in thread
From: Randy Brukardt @ 2011-06-12 5:23 UTC (permalink / raw)
"Kim Rostgaard Christensen" <krc@retrospekt.dk> wrote in message
news:it0noa$ce3$1@munin.nbi.dk...
> Hi there
>
> I am desperately trying to implement a protocol on top of a serial
> transport.
>
> I am running Debian, and for the moment using /dev/ttyACM0 for reading.
> This works fine using standard the Text_IO package and In_File.
> Only, when I need to write to the device It fails because It is in In_File
> mode - Obviously.
> Reset on the file handle gives me a USE_ERROR exception, probably due to
> it being a special file - please correct me if I am wrong.
Stream_IO allows changing the mode of an open stream (specifically to handle
this sort of problem). But whether that is allowed in your specific compiler
I can't say -- you'll have to experiment.
Randy.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Asynchronous I/O on a serial device
2011-06-11 21:46 Asynchronous I/O on a serial device Kim Rostgaard Christensen
2011-06-12 5:23 ` Randy Brukardt
@ 2011-06-12 5:42 ` Yannick Duchêne (Hibou57)
2011-06-12 7:49 ` Kim Rostgaard Christensen
2011-06-12 21:01 ` anon
2 siblings, 1 reply; 11+ messages in thread
From: Yannick Duchêne (Hibou57) @ 2011-06-12 5:42 UTC (permalink / raw)
Le Sat, 11 Jun 2011 23:46:47 +0200, Kim Rostgaard Christensen
<krc@retrospekt.dk> a écrit:
> Hi there
Hi you :)
> I am desperately trying to implement a protocol on top of a serial
> transport.
>
> I am running Debian, and for the moment using /dev/ttyACM0 for reading.
> This works fine using standard the Text_IO package
Not good in my opinion (see later)
> and In_File.
> Only, when I need to write to the device It fails because It is in
> In_File mode - Obviously.
> Reset on the file handle gives me a USE_ERROR exception, probably due to
> it being a special file - please correct me if I am wrong.
I do not know about your device node, so I could not say if its writable
or not, but note you also have Inout_File in Ada (do not know what it
named Inout_File instead of In_Out_File, but that's another story) beside
of In_File, so could perfectly have input and output on the file.
> Do I need to implement this more system-near/specific, or is there some
> way I can do bi-directional communication like, for instance two file
> handles. (I tried Form => "shared=yes", and it also failed).
I would not say more system specific, but rather more close to some
implicit specifications here: I am not sure you have good reasons [*] to
use Text_IO, and you may better have a file of some basic type, like bytes
or characters (well, a file of the more atomic type your protocol defines).
[*] If something is missing we do not know, tell us.
--
“Syntactic sugar causes cancer of the semi-colons.” [Epigrams on
Programming — Alan J. — P. Yale University]
“Structured Programming supports the law of the excluded muddle.” [Idem]
“c++; /* this makes c bigger but returns the old value */” [Anonymous]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Asynchronous I/O on a serial device
2011-06-12 5:23 ` Randy Brukardt
@ 2011-06-12 7:33 ` Kim Rostgaard Christensen
0 siblings, 0 replies; 11+ messages in thread
From: Kim Rostgaard Christensen @ 2011-06-12 7:33 UTC (permalink / raw)
On 2011-06-12 07:23, Randy Brukardt wrote:
> "Kim Rostgaard Christensen"<krc@retrospekt.dk> wrote in message
> news:it0noa$ce3$1@munin.nbi.dk...
>> Hi there
>>
>> I am desperately trying to implement a protocol on top of a serial
>> transport.
>>
>> I am running Debian, and for the moment using /dev/ttyACM0 for reading.
>> This works fine using standard the Text_IO package and In_File.
>> Only, when I need to write to the device It fails because It is in In_File
>> mode - Obviously.
>> Reset on the file handle gives me a USE_ERROR exception, probably due to
>> it being a special file - please correct me if I am wrong.
>
> Stream_IO allows changing the mode of an open stream (specifically to handle
> this sort of problem). But whether that is allowed in your specific compiler
> I can't say -- you'll have to experiment.
>
> Randy.
>
>
I'm pretty sure I tried Stream_IO and it gave me the same result -
USE_ERROR, or something similar. The problem is that it is a special
file. Reset works like a charm on regular files, both in Text and Stream_IO
/Kim
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Asynchronous I/O on a serial device
2011-06-12 5:42 ` Yannick Duchêne (Hibou57)
@ 2011-06-12 7:49 ` Kim Rostgaard Christensen
2011-06-12 10:35 ` Kim Rostgaard Christensen
2011-06-12 11:04 ` Yannick Duchêne (Hibou57)
0 siblings, 2 replies; 11+ messages in thread
From: Kim Rostgaard Christensen @ 2011-06-12 7:49 UTC (permalink / raw)
On 2011-06-12 07:42, Yannick Duch�ne (Hibou57) wrote:
> Le Sat, 11 Jun 2011 23:46:47 +0200, Kim Rostgaard Christensen
> <krc@retrospekt.dk> a �crit:
>
>> Hi there
> Hi you :)
Ca va ? ;-)
...
> I do not know about your device node, so I could not say if its writable
> or not, but note you also have Inout_File in Ada (do not know what it
> named Inout_File instead of In_Out_File, but that's another story)
> beside of In_File, so could perfectly have input and output on the file.
The node is writeable, everything works via minicom. A googling reveals,
at lest to me, that Inout_File is placed solely in the Direct_IO
package. I will try it out later today.
I will look forward to the Inout_File/In_Out_File tale, someday.
>> Do I need to implement this more system-near/specific, or is there
>> some way I can do bi-directional communication like, for instance two
>> file handles. (I tried Form => "shared=yes", and it also failed).
> I would not say more system specific, but rather more close to some
> implicit specifications here: I am not sure you have good reasons [*] to
> use Text_IO, and you may better have a file of some basic type, like
> bytes or characters (well, a file of the more atomic type your protocol
> defines).
My reasons for using Text_IO is that is a QnD way of getting the input
protocol logic implemented, while I was fiddling around with the
bi-directional part.
The protocol is line based ascii encoded base16 values, but the parser
is not pretty as of this writing (the QnD part)
I agree that it should be changed to something more application specific.
I was suggested to use POSIX.IO, but this is, from my point of view too
system specific for my primitive application.
/Kim
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Asynchronous I/O on a serial device
2011-06-12 7:49 ` Kim Rostgaard Christensen
@ 2011-06-12 10:35 ` Kim Rostgaard Christensen
2011-06-12 11:04 ` Yannick Duchêne (Hibou57)
1 sibling, 0 replies; 11+ messages in thread
From: Kim Rostgaard Christensen @ 2011-06-12 10:35 UTC (permalink / raw)
...
> The node is writeable, everything works via minicom. A googling reveals,
> at lest to me, that Inout_File is placed solely in the Direct_IO
> package. I will try it out later today.
No luck. Direct_IO apparently only works on seekable files and gives a
use error as well.
/Kim
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Asynchronous I/O on a serial device
2011-06-12 7:49 ` Kim Rostgaard Christensen
2011-06-12 10:35 ` Kim Rostgaard Christensen
@ 2011-06-12 11:04 ` Yannick Duchêne (Hibou57)
2011-06-12 18:06 ` Kim Rostgaard Christensen
1 sibling, 1 reply; 11+ messages in thread
From: Yannick Duchêne (Hibou57) @ 2011-06-12 11:04 UTC (permalink / raw)
Le Sun, 12 Jun 2011 09:49:04 +0200, Kim Rostgaard Christensen
<krc@retrospekt.dk> a écrit:
> On 2011-06-12 07:42, Yannick Duchêne (Hibou57) wrote:
>> Le Sat, 11 Jun 2011 23:46:47 +0200, Kim Rostgaard Christensen
>> <krc@retrospekt.dk> a écrit:
>>
>>> Hi there
>> Hi you :)
> Ca va ? ;-)
Ouwaouaw, une grenouille (a froggy ;) ). Tu me connais d'où, dis moi, je
veux tout savoir :) Sur un forum ? Sur l'autre c.l.a (celui des frenchy) ?
Le Sun, 12 Jun 2011 12:35:58 +0200, Kim Rostgaard Christensen
<krc@retrospekt.dk> a écrit:
> ...
>> The node is writeable, everything works via minicom. A googling reveals,
>> at lest to me, that Inout_File is placed solely in the Direct_IO
>> package. I will try it out later today.
> No luck. Direct_IO apparently only works on seekable files and gives a
> use error as well.
>
> /Kim
I had a quick first idea I did not tell about, because I've never tried
such a thing so far with Ada : could you open it twice, so as to get one
stream for input and another stream for output ?
I may have a try on a tty (should be close enough) later today or tomorrow
(but can't promise anything).
--
“Syntactic sugar causes cancer of the semi-colons.” [Epigrams on
Programming — Alan J. — P. Yale University]
“Structured Programming supports the law of the excluded muddle.” [Idem]
“c++; /* this makes c bigger but returns the old value */” [Anonymous]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Asynchronous I/O on a serial device
2011-06-12 11:04 ` Yannick Duchêne (Hibou57)
@ 2011-06-12 18:06 ` Kim Rostgaard Christensen
0 siblings, 0 replies; 11+ messages in thread
From: Kim Rostgaard Christensen @ 2011-06-12 18:06 UTC (permalink / raw)
On 2011-06-12 13:04, Yannick Duchêne (Hibou57) wrote:
>> Ca va ? ;-)
>
> Ouwaouaw, une grenouille (a froggy ;) ). Tu me connais d'où, dis moi, je
> veux tout savoir :) Sur un forum ? Sur l'autre c.l.a (celui des frenchy) ?
Je regrette de dire qui n'ont jamais eu le plaisir (or something like that)
No, I'm just a Dane using every excuse he gets, for using his limited
(and very rusty) French.
> I had a quick first idea I did not tell about, because I've never tried
> such a thing so far with Ada : could you open it twice, so as to get one
> stream for input and another stream for output ?
>
> I may have a try on a tty (should be close enough) later today or
> tomorrow (but can't promise anything).
I'm pretty sure I also went down that road. It raised a USE_ERROR and I
tracked it down to a paragraph in s-fileio.adb where it raises an error
if the shared=yes is not set on the file.
As previously mentioned this did not help :-\
/Kim
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Asynchronous I/O on a serial device
2011-06-11 21:46 Asynchronous I/O on a serial device Kim Rostgaard Christensen
2011-06-12 5:23 ` Randy Brukardt
2011-06-12 5:42 ` Yannick Duchêne (Hibou57)
@ 2011-06-12 21:01 ` anon
2011-06-14 6:37 ` Kim Rostgaard Christensen
2 siblings, 1 reply; 11+ messages in thread
From: anon @ 2011-06-12 21:01 UTC (permalink / raw)
To connect to the UART device directly you should use to use the
Gnat.Sockets.* or AdaSockets packages.
Or you could use PolyORB packages which contains a number of serial
I/O packages. Like: GNAT.Serial_Communications;
Download => Libre.Adacore.com
In <it0noa$ce3$1@munin.nbi.dk>, Kim Rostgaard Christensen <krc@retrospekt.dk> writes:
>Hi there
>
>I am desperately trying to implement a protocol on top of a serial
>transport.
>
>I am running Debian, and for the moment using /dev/ttyACM0 for reading.
>This works fine using standard the Text_IO package and In_File.
>Only, when I need to write to the device It fails because It is in
>In_File mode - Obviously.
>Reset on the file handle gives me a USE_ERROR exception, probably due to
>it being a special file - please correct me if I am wrong.
>
>Do I need to implement this more system-near/specific, or is there some
>way I can do bi-directional communication like, for instance two file
>handles. (I tried Form => "shared=yes", and it also failed).
>
>It is a usb device that emulates UART, and it seems to be contempt with
>just about any Baud setting.
>
>/Kim
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Asynchronous I/O on a serial device
2011-06-12 21:01 ` anon
@ 2011-06-14 6:37 ` Kim Rostgaard Christensen
2011-06-15 17:02 ` Simon Clubley
0 siblings, 1 reply; 11+ messages in thread
From: Kim Rostgaard Christensen @ 2011-06-14 6:37 UTC (permalink / raw)
On 2011-06-12 23:01, anon@att.net wrote:
> To connect to the UART device directly you should use to use the
> Gnat.Sockets.* or AdaSockets packages.
>
> Or you could use PolyORB packages which contains a number of serial
> I/O packages. Like: GNAT.Serial_Communications;
The GNAT.Serial_Communications is just what I needed, although It gives
some extra conversion overhead.
Can anyone give an example on how to use Gnat.Sockets/AdaSockets for
accessing a UART device? I have only used it for IPv4 networking and
Bluetooth.
Best
Kim
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Asynchronous I/O on a serial device
2011-06-14 6:37 ` Kim Rostgaard Christensen
@ 2011-06-15 17:02 ` Simon Clubley
0 siblings, 0 replies; 11+ messages in thread
From: Simon Clubley @ 2011-06-15 17:02 UTC (permalink / raw)
On 2011-06-14, Kim Rostgaard Christensen <krc@retrospekt.dk> wrote:
> On 2011-06-12 23:01, anon@att.net wrote:
>> To connect to the UART device directly you should use to use the
>> Gnat.Sockets.* or AdaSockets packages.
>>
>> Or you could use PolyORB packages which contains a number of serial
>> I/O packages. Like: GNAT.Serial_Communications;
>
> The GNAT.Serial_Communications is just what I needed, although It gives
> some extra conversion overhead.
>
You may wish to read through a thread from about 2 months ago about this
package in which it was discovered that it is forcing RTS/CTS flow control.
This will cause you problems unless your device is using RTS/CTS flow
control.
Simon.
--
Simon Clubley, clubley@remove_me.eisner.decus.org-Earth.UFP
Microsoft: Bringing you 1980s technology to a 21st century world
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2011-06-15 17:02 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-06-11 21:46 Asynchronous I/O on a serial device Kim Rostgaard Christensen
2011-06-12 5:23 ` Randy Brukardt
2011-06-12 7:33 ` Kim Rostgaard Christensen
2011-06-12 5:42 ` Yannick Duchêne (Hibou57)
2011-06-12 7:49 ` Kim Rostgaard Christensen
2011-06-12 10:35 ` Kim Rostgaard Christensen
2011-06-12 11:04 ` Yannick Duchêne (Hibou57)
2011-06-12 18:06 ` Kim Rostgaard Christensen
2011-06-12 21:01 ` anon
2011-06-14 6:37 ` Kim Rostgaard Christensen
2011-06-15 17:02 ` Simon Clubley
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox