Re: hd44780-serial.c

"Markus Dolze" <[email protected]> Fri, 22 Jun 2012 19:13:28 +0200
Newsgroups gmane.comp.sysutils.lcdproc
Message-ID <[email protected]>
-------- Original-Nachricht --------
> Datum: Fri, 22 Jun 2012 15:52:52 +0100
> Von: Stephen Crane <[email protected]>
> An: [email protected]
> Betreff: [Lcdproc] hd44780-serial.c

> Hello all,
> I have a rather unusual setup with an XBee on /dev/ttyUSB0 connected to a
> remote display which uses hd44780-serial.c as the driver.
> 
> I have noticed that the display gets messed up from time to time, as if
> characters are being dropped or lost in transmission. Browsing the driver,
> I notice that the return value from write is ignored, so I replaced all
> calls to write with a do_write function like this:
> 
> static void do_write(int fd, const unsigned char *c, int n)
>  {
>   while (n > 0) {
>   int wrote = write(fd, c, n);
>   if (wrote > 0)
>   n -= wrote;
>   else {
>   perror("write");
>   break;
>   }
>   }
> }
> 
> With this in place, I see a ton of EAGAIN errors which would certainly
> account for the dropped characters, right?
> 
> Would the list accept a patch for this file? (I note that most drivers
> have
> the same problem...)
> 
> Steve

'most drivers have the same problem' is true. Most drivers just sent-and-forget which is IMHO not the baddest thing. As for the hd44780 driver, there are some options to mitigate corrupted screens (RefreshDisplay, KeepAliveDisplay).

I have never experienced any problems using hd44780-serial, even with 20x4 displays on slow (9600 baud) devices. If your device is larger - like 40x4 - this may be a problem. But I have seen displays (e.g. pyramid driver) which controller could not cope with fast screen updates.

As screens are updated every 125 ms, too many retries can make screen changes choppy as LCDd may skip screen updates.

If adding a small retry loop (say 10 retries) fixes your problem, then I will give it a try.

Note that using char* and n (which seems to be the number of bytes to write) is useless within the hd44780-serial as it always sends one character at a time.

Regards,
Markus