On 4/5/2019 5:00 AM, Denis Shienkov

Sorry for the quoting. Thunderbird wasn't cooperating this morning and I didn't have much time before starting work.

Never ever ever do I/O in the main GUI thread of a Qt application.

Why not? It is an asynchronous. You can do I/O in a main thread, but handle
data in a separate thread (e.g. to parse it). Of course, it depends on the
used communication protocol and etc.
A main limitation is that on Windows all I/O stops when a user hold-on the
application window (ot to drag it, or do resizing). It is a Windows
'feature'.

So, yes, in a common case it is makes sense to move the QSerialPort object
to the different thread (a concept of workers).

Thank you for agreeing with me.

Real world serial comm is fraught with peril. I've been doing it since

the days of DOS 3.1.

It's not true.

It's completely true. There are any number of things, many of which beyond a 
programmer's control which can cause lost data. If you are just writing a chat 
program so you and a buddy can sit and type to each other in a dorm or 
something, no biggie. When you are pulling or pushing data feeds it's a real 
issue. An even bigger issue if you are controlling manufacturing or medical 
devices.

Ordinarily Wikipedia is untrustworthy in the best of times, but whoever wrote 
this about the 16550 UART actually knew something.

https://en.wikipedia.org/wiki/16550_UART

Ahhh the days when people bought that shiny new 14.4 modem then claimed it was 
junk because zip file transfers using Procomm kept getting corrupted or failed 
if they tried to use it above 9600. They blamed the modem when it was their 
UART. In case readers haven't heard of Procomm
http://procomm-guide.com/  wouldn't click on any download found there. The 
VT100 emulation was Linux/Windows quality VT100 not even close to real VT100 
but dramatically closer than what Linux and Windows currently have (assuming 
one didn't purchase a commercial VT-100 terminal emulation package like 
Reflections or what Ericom has.)

That was back when everybody tried to run their own Bulletin Board System 
(BBS). Yes, even with the Internet, BBS hosts still exist today.

http://bbscorner.com/

Today we have UARTs with blinding speed and the ability to perform DMA 
transfers. Digiboard made a name for themselves with 4, 8, 16 and 32 port 
add-in cards. Today I see they are down to 4/8 port cards. These now support 
921.6Kbps

https://www.digi.com/products/networking/serial-connectivity/serial-cards/digineo

Other vendors are making 32-port USB appliances.
https://www.coolgear.com/product/32-port-rs-232-usb-to-serial-adapter

We will skip speaking of the USB appliances because that adds several more 
potential failure layers. All of the hardware involved in USB communications 
has to be able to handle the maximum throughput of all ports at any given 
moment. Somewhere, in a commodity desktop or laptop you will have USB hardware 
unable to live up to the task.
Unless something has dramatically changed in QSerialPort, readyRead is

only emitted for the first character in the buffer because there is no
concept of block or packet. A UART handles one byte at a time.

It's not true too. The readyRead() will be triggered when the device's
handle/descriptor becomes 'signalled/activated' (when something comes into
FIFO of driver), in this case the QSerialPort reads all data which are in
this time in the FIFO (there are may be some bytes). So, no any
byte-per-byte handling as you say.

Thank you for agreeing with me again. It is true.

Yes, unless significant improvements have happened with QSerialPort (not even 
sure the class itself could fix the problems) the intricate little dance from 
UART to FIFO to driver to your application can get interrupted at such a point 
with some bytes left behind and the readyRead not firing again. Usually happens 
at higher data rates, 115K or higher. Might not even be Qt's fault. See note 
about 921.6Kbps communications above.

I don't know about what you say... It is trash for my opinion.. For you has
been provided a good code example how to read the lines:

     QSerialPort * port;
     QObject::connect(port, &QIODevice::readyRead, port, [port] () ->

void  {

         while (port->canReadLine())  {
             QByteArray data = port->readLine();
             // emit with data as argument and do the parsing
         }
     });

No. I have been provided a student type example suitable for two friends and 
their chat window program. Even in a chat program, if one of the users types 
quickly, this will stutter and sputter. Every read will be a varying number of 
characters. Even if the other end is only sending bytes after the return key 
has been hit this reading will sputter characters onto the screen.

Most terminal software, by default, disables local echo. What that means is 
when you press a key the representation does not show up in your window until 
it has gone to the target and been echoed back. When connecting a terminal to a 
host computer such as a midrange or mainframe this was done for visual 
verification of the communications channel. BBS software continued that 
protocol (for lack of a better term) as did Procomm and the other 
communications packages of the day.

In today's Internet world most chat utilities send only when the send is 
pressed. They will generally use a low level transport (UDP or something like 
that) which allows for full packet transmission leaving the application 
completely oblivious to the mechanics of that.

Serial comm requires you to do all of that work and mistakes get made. Noise on 
the line isn't handled properly and a host of other perils.

The original "user story" from interest Digest, Vol 91, Issue 1
======
I'm trying to implement a serial connection with QIODevice (SerialPort). I
would like to parse line by line (each line consists of multiple columns of
data) and for this I found canReadLine().
But as I understand I have to use startTransaction, because otherwise the
buffer will not be used. I'm I correct?
======

This topic thread is a shining example of why AGILE is a completely fraudulent methodology. Nobody 
read the "user story." Everybody provided a slam-bam-thank-you-mam answer because that 
was easiest and they believed it "solved the story."

Context is everything someone else sputtered on here. In this case, everybody but me 
chose their own "context" completely ignoring the context of the user story.

(each line consists of multiple columns of data)

Everybody chose to ignore that portion of the "user story."

This __isn't__ a chat program. There is a device of some kind feeding this 
data. Most likely a production system unless someone is just collecting 
smarthome data locally for their own interest.

This device has an unknown baud rate. Is it 300 BAUD or 921.6Kbps or something 
in between?

We have an unknown transmission rate. Is it one line per hour, day, second? How many 
"columns" in a line? How many, on average, bytes in each column? Does each line really end 
with a newLine character or does this have the traditional <STX>text data<ETX>  No, those 
aren't XML or any other kind of tag, they are ASCII protocol bytes.  STX is used to indicate Start of 
Text and ETX used for End of Text.

This communication, if for a production system, needs to be in its own thread. 
It has to algorithmicly assemble each line THEN signal out a complete line for 
the main (or another) thread to process.
Keep in mind that Windows and Linux have been more tightly integrating network communication with the kernel. It is now possible for a completely unrelated application to hang the kernel while it waits for some kind of network timeout. Like many OpenSource bugs they are being fixed by rotting until expiration.

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/375986

While your kernel is hung your particular UART, if it is hardware only and only needs 
power, will continue putting characters into its internal buffer. If your kernel hasn't 
de-hung itself by the time an interrupt or other configured "full FIFO" needs 
to fire, you are now losing transmission data.

Yes, there are software UARTs.
http://www.ti.com/lit/an/spra555/spra555.pdf

--

Roland Hughes, President
Logikal Solutions
(630)-205-1593  (cell)
http://www.theminimumyouneedtoknow.com
http://www.infiniteexposure.net
http://www.johnsmith-book.com

_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest

Reply via email to