How to send data in QserialPort thread
-
Hi everyone,
I'm using the QSerialPort with thread to read serialport, also have a mainwindow for GUI. I want to send the data from another class such as mainwindow through serial port. I should use the signal/slot method, qtconcurrent or to invoke the function directly to do it, which is better?for(;counterImageSend<4096*counterPartMemory;counterImageSend+=8){ canbus.data[0]=static_cast<uint8_t>(flashMemory[counterImageSend]); canbus.data[1]=static_cast<uint8_t>(flashMemory[counterImageSend+1]); canbus.data[2]=static_cast<uint8_t>(flashMemory[counterImageSend+2]); canbus.data[3]=static_cast<uint8_t>(flashMemory[counterImageSend+3]); canbus.data[4]=static_cast<uint8_t>(flashMemory[counterImageSend+4]); canbus.data[5]=static_cast<uint8_t>(flashMemory[counterImageSend+5]); canbus.data[6]=static_cast<uint8_t>(flashMemory[counterImageSend+6]); canbus.data[7]=static_cast<uint8_t>(flashMemory[counterImageSend+7]); //send data... }
-
Hi @Gokhan
You can be interested with this link of qt doc
Which Qt Thread Technology Should You Use?
and
Choosing an appropriate approach
I hope this can help you !
-
-
-
@VRonin Serial port must not miss any data while reading, therefore I can use thread method. Sometimes, while reading big data which is sent immediately so byte-to-byte, unfortunately, have to send the big data. When the data is being sent, there must be a few delay between bytes, so I give a 1ms delay (QThread::msleep(1);). However, because reading and writing are at same thread, it can not read the buffer during writing and it gets an error that is bus-off. What should I do to read/write the serial port in a thread at the same time?
-
Hi,
You seem to be blocking the communication, why not use Qt's asynchronous nature and buffer the data you receive until you have everything you need to go further ?
-
@SGaist Then it misses data while clicking the window bar, I have to use a thread for reading.
@Amogh I have already used the byte array for sending. While sending, it's spending lots of time because it's size is around 512byte and it sends byte-to-byte.
I'm using it like this link for reading and have tried to add the sending method. (qsp-no-freeze)
https://bugreports.qt.io/browse/QTBUG-61233 -
Then move the complete serial port handling to that thread and communicate information back to the main thread when appropriate but there shouldn't be any need to sleeping or blocking.
-
@SGaist Well, how should I communicate with the serial port thread? Signals/Slots or Concurrency? Which better? You say to shouldn't block, but while writing the send buffer, have to wait in order to be writtenBytes. Then how can I check whether it was written a byte?
-
Please be a bit more patient before bumping your own thread. This is a community forum and people answering here may not live in the same timezone as you.
Signals/Slots, concurrency has nothing to do with inter thread communication.
Why do you have to wait when writing to your serial port ?
-
-
Are you mixing RS232 and CAN ?
-
@SGaist It's USB-CAN module, so it converts the received data from USB to send can bus. At the same time, it might be data in can bus line and it has to read. It should never miss data even if the line is full(%100) while reading/writing.
-
These are two different buffers so you should get data even if you are writing something to it.