This is the mail archive of the mailing list for the newlib project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Nonblocking UART driver using _write_r - error if no data was written?


I'm new to the group, so I would like to say hi to everybody and start
with the questions (sorry... :) ).

I'm trying to use the _write_r stub to push data through the UART
driver to the console. The CPU is STM32 F103 and I wrote the driver to
use the interrupts with driver own cyclic buffer. The driver works ok
(I tested it without using _write_r stubs and stdio and it was ok).

When I try to write more data than fits in my cyclic buffer it cuts
the string in half.

I try to printf/fflush:

I get on console with 32 byte cyclic buffer (not deterministic):

The issue I have is that when my cyclic buffer fills up, I return zero
bytes written from the _write_r stub. This doesn't fit well with
newlib's fflush, specifically fflush.c:193

  while (n > 0)
      t = fp->_write (ptr, fp->_cookie, (char *) p, n);
      if (t <= 0)
          fp->_flags |= __SERR;
          return EOF;
      p += t;
      n -= t;

when _write returns 0 it is treated as an error. says that returning zero is valid case:

"On success, the number of bytes written is returned (zero indicates
nothing was written). On error, -1 is returned, and errno is set

If count is zero and fd refers to a regular file, then write() may
return a failure status if one of the errors below is detected. If no
errors are detected, 0 will be returned without causing any other
effect. If count is zero and fd refers to a file other than a regular
file, the results are not specified."

,where count refers to input parameter not return value, so I think my
point is still valid.

Am I doing something wrong? When creating buffers internally in
iprintf, newlib calls my istty stub and gets correct value. Any other
things I should check?

My send method (interrupt will push data from cyclic buf to peripheral):

ssize_t DevUsart::com_write_r(struct _reent *r, int file, const void
*buf, size_t nbyte)
uint32_t dataSent = 0;

if(mIsOpened == false)
r->_errno = EBADF;
return -1;//EBADF;

//Add data to the buffer
dataSent = mTxBuffer.addToCyclicBuffer(static_cast<unsigned
char*>(const_cast<void *>(buf)), static_cast<uint32_t>(nbyte));


return dataSent;

Any help would be great!


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]