UART driver: read function

Daniel Krüger daniel.krueger at systec-electronic.com
Fri Mar 20 10:39:44 UTC 2015


Am 20.03.2015 um 11:11 schrieb Sebastian Huber:
> On 20/03/15 11:03, Daniel Krüger wrote:
>> Am 20.03.2015 um 10:02 schrieb Sebastian Huber:
>>> On 20/03/15 09:42, Daniel Krüger wrote:
>>>> Am 06.03.2015 um 11:20 schrieb Sebastian Huber:
>>>>>
>>>>> I would not use the C stdio for this and instead directly use the
>>>>> POSIX
>>>>> read/write. You have to set up the right Termios settings. In case you
>>>>> use RTEMS 4.11 I would use the new Termios device interface (see
>>>>> rtems_termios_device_install()).
>>>>
>>>> The code is intended to be platform independent, so I don't want to
>>>> change it if not really necessary.
>>>
>>> will this work on non-POSIX targets at all?
>>
>> Currently, we use this code under Linux.
>>
>> This code switches stdin into non-blocking mode via the following
>> sequence:
>>
>>     tcgetattr(STDIN_FILENO, &oldt);
>>     oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
>>
>>     newt = oldt;
>>     newt.c_lflag &= ~(ICANON | ECHO);
>>     newf = oldf | O_NONBLOCK;
>>
>>     tcsetattr(STDIN_FILENO, TCSANOW, &newt);
>>     fcntl(STDIN_FILENO, F_SETFL, newf);
>>
>> Then it tries to read from the input via getchar().
>> I must admit this code is a little bit tricky, because it uses
>> ungetc() for the implementation of a Windows kbhit() equivalent.
>
> You already use the Termios functions, so I don't know why you cannot
> use the POSIX read() directly.

Of course, this is possible. It is just a rewrite of some code, which I 
want to avoid if possible.


>>>> The interesting thing is, that newlib/libc/stdio/refill.c contains
>>>> some "#ifndef __CYGWIN__" which seem to fix the problem under Cygwin.
>>>
>>> This Cygwin approach seems to be quite a hack. The current FreeBSD
>>> variant of refill.c uses the default. How does this work on Linux?
>>
>> I didn't checked the glibc code, but non-blocking getchar() works as
>> expected.
>
> To me this looks like a glibc vs. BSD libc compatibility issue. I don't
> know if you are in the implementation defined area of the C/POSIX
> standards here.

This might be the case. I don't know if stdio of libc is specified to 
work with underlying devices in non-blocking mode.

Best regards,
   Daniel Krüger

-- 
SYS TEC electronic GmbH
Am Windrad 2
08468 Heinsdorfergrund

Telefon : +49 (0) 3765 38600-0
Fax     : +49 (0) 3765 38600-4100
Email   : daniel.krueger at systec-electronic.com
Website : http://www.systec-electronic.com

Managing Director   : Dipl.-Phys. Siegmar Schmidt
Commercial registry : Amtsgericht Chemnitz, HRB 28082



More information about the devel mailing list