Sending Packet through QSerialport ?
-
Here the task is ,sending packet through QSerialport and receiver has to receive with some calculations.
The packet Format is :
STX(1 byte,0xF0) +datalength(1 byte) +request code(2 bytes) +payload(0 - 100 or may vary dynamically) + ETX(1 byte,0xF1)
the Function for transmitter is :
void MainWindow::Txdata(quint16 request_code, quint8 data_leng)
{const QByteArray payload = ui->textEdit->toPlainText().toUtf8();
QByteArray send;
send.append('0xF0');
send.append(data_leng);
send.append(request_code);
send.append(payload);
send.append('0xF1');m_pcSerialport->write(send);
qDebug() <<"sending data:"<<send;
}
my code for transmitter side ,help me to complete this task.
And receiver section :
-
use the Circular Queue
-
check for STX?
-
check for minimum length?
-
Calculate actual length?
-
check for Full length(means checking for ETX)?
-
start extraction?
this is whole task? if any one help me if they worked previously or any kind of knowledge?
I am trying to write receiver section code but i am stuck at transmitter section code only?
-
-
Hi,
By receiver section, do you mean the slot that you will connect to your
m_pcSerialport
readyRead
signal ? -
yes , i will connect to m_pcserialport to Rxdata() function.
i want the logic of how to create circular queue in receiver section and how to check with conditions above i have mention?
I have knowledge on FIFO first in first out .So,First is STX ,take that byte and check thh STX wheather it is received or not?
-
I would do as follow: you need a member
QByteArray m_buf
. inside the receive slot, append to it:m_buf+=port->readAll();
- if m_buf contains STX, you can remove everything before, it is lost garbage
- if m_buf contains STX and ETX, you can extract that part and parse it. keep everything after ETX, it may already be the next transmission
- maybe do the checks above in a loop, in case m_buf contains more than one text.
Regards
-
my lead said use circular queue in receiver section ?
without circular queue i know how to receive and check the conditions.
by using circular queue how to extract byte by byte received data. i don't know?
so ,if any one knowledge on this help me to code ?
-
Ask him why imposing a circular buffer. I personnaly don’t see why you would need one in this case.
-
E.g. the same way you already used:
QByteArray send;
send.append('0xF0');Or use the constructor:
QByteArray ba(1, char(startbyte));
Regards
-
transmit data: "\xF0\x12\x96\x96krishnalkjkl;d\xF1"
data size: "\xF0\x12\x96\x96kris"why my receiver is not receiving all data?
receiver code:
QByteArray data ;
data = m_pcSerialport->readAll();qDebug() <<"data size:"<< data;
tx code:
QByteArray sending;
QString str = ui->textEdit->toPlainText(); QByteArray send = str.toUtf8(); int size_packet_length = str.size(); qDebug() << "size of payload:"<< size_packet_length; quint16 req_code = 0xFD96; char reqbytes[2]; reqbytes[0] = (req_code >> 8) & 0xff; reqbytes[1] = req_code & 0xff; QByteArray qDebug() <<"bytes of reqcode:"<<req; int size_reqcode = sizeof(req_code); qDebug() << "size of reqcode:"<< size_reqcode; quint8 startbyte = 0xF0; int size_startbyte = sizeof(startbyte); qDebug() << "size of startbyte:"<< size_startbyte; quint8 endbyte = 0xF1; int size_endbyte = sizeof(endbyte); qDebug() << "size of endbyte:"<< size_endbyte; int total_datalength = size_reqcode + size_startbyte + size_endbyte + size_packet_length;
// QByteArray totallength = QByteArray::number(total_datalength);
qDebug() << "size of total datalength:"<< total_datalength; sending.append(startbyte); sending.append(total_datalength); sending.append(req); sending.append(send); sending.append(endbyte); m_pcSerialport->write(sending,total_datalength); qDebug() << "transmit data:"<< sending;
tell me why my receiver not receiving all data ?
any mistakes if found in code suggest me to better?
-
Serial ports are slow, therefore your receive the answer in chunks.
If you look at my answer above again, I said you need a member variable and you append to it.
In your code you have a local variable, and you assign to it. That's why its not working for you :)
Regards
-
my receiver code:
QByteArray data ;
data += m_pcSerialport->readAll();qDebug() <<"data size:"<< data; QByteArray received = data.toHex(); qDebug()<<"testing :"<<received; for (int i = 0; i < received.size(); i++) { queue.enqueue(received[i]); } qDebug() <<"queue:"<<queue;
how to compare queue with 0xF0(STX), 0xF1(ETX)? how to extract data or payload?
-
ok sir ,
QByteArray data;
data +=m_pcserialport->readall();qDebug() <<"data received "<<data;
/// after that i got output like this
\xF0\x0E\xFD\x96haihelloeveryone\xF1
from that i have to check the conditions above mention
if(data == 0xF0)
{
qDebug()<<"STX is received ";
}if(data == 0xF1)
{
qDebug()<<"ETX is received";
}and how to extract data "haihelloeveryone"? from the received .
help me code without Queue?
-
- As said above, you need a member variable.
data
is local, appending to it does not make sense. - I found out that you only need to check if both STX and ETX are in the frame, otherwise you exit the slot and just wait for more data come in (the slot will be
called again). - Note that parts of your protocol are not used yet (and maybe not needed?): data lenght and request code.
void MainWindow::slotDataReceived(void) { m_buf += m_port->readAll(); for (;;) { int posStx = m_buf.indexOf(char(0xF0)); int posEtx = m_buf.indexOf(char(0xF1)); if (posStx >= 0 && posEtx >= 0) { // extract payload QByteArray data = m_buf.mid(posStx + 4, posEtx - posStx - 4); // remove frame from receive buffer m_buf.remove(0, posEtx + 1); qDebug() << "Data =" << data; } else { break; } } }
Regards
- As said above, you need a member variable.
-
thank you so much for your support.
output of code:
transmit data: "\xF0\x0F\xFD\x96hai krishna\xF1"
data received : "\xF0\x0F\xFD\x96hai "
data received : "krishnain receiver last byte is not receiving .so,it is not going to if condition for further operations.
tnsmitter code:
// sending through serialport
sending.append(startbyte);
sending.append(total_datalength);
sending.append(req);
sending.append(send);
sending.append(endbyte);m_pcSerialport->write(sending,total_datalength); qDebug() << "transmit data:"<< sending;
how to receive last byte?