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 !
-
-
-
-
@Gokhan said in How to send data in QserialPort thread:
all data can't be sent
Can you elaborate this point?
@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 ?
-
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.
-
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?
-
@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 ?
-
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 ?
-
-
These are two different buffers so you should get data even if you are writing something to it.