2

我是 C++ 和 Qt 的新手。我想在收到字符串后将串行端口中收到的值保存在一个数组中:“数据”。我正在使用终端示例,因此串行端口可以正常工作。

The read function in the Example is the same:
void MainWindow::readData()
{
    QByteArray data = serial->readAll();
    console->putData(data);

}

我该如何修改它?谢谢!!!

4

1 回答 1

1

如果您手动发送数据,我建议您最好添加帧开始分隔符和帧结束分隔符和校验和。

 QByteArray packet_storage;

只需在您声明序列的地方声明它。 StartOfMessage and EndOfMessage将取决于您的设备。不知道你传的是什么。希望您可以从设备的文档中找出您发送的内容。

至于我,我正在使用

 enum Constants
   {
       StartOfMessage  = '\x02',   /* Value of byte that marks the start of a message */
       EndOfMessage    = '\x03',   /* Value of byte that marks the end of a message */
       CarridgeReturn  = '\x0D',   /* Carridge return is first byte of end of line */
       LineFeed        = '\x0A',   /* Line feed is second byte of end of line */
       NullChar        = '\0'      /* Null Character */
   };

void MainWindow::readData()
{
     // read all 
     QByteArray data = serial->readAll();

     // store all read data packet_storage is a QByteArray
     packet_storage.append(data);

     int start_index = 0;
     int end_index = 0;

     // process packet if not empty
     if(!packet_storage.isEmpty())
     {
         if( packet_storage.contains(StartOfMessage) &&  packet_storage.contains(EndOfMessage))
         {
                    start_index = packet_storage.indexOf(StartOfMessage,0);
                    end_index   = packet_storage.indexOf(EndOfMessage,0);

                    int length = 0;

                    for (int i=start_index; i <= end_index; i++)
                    {
                        length++;
                    }

                    // get data
                    QByteArray dt = packet_storage.mid(start_index,length);

                    // do your processing here. 
                    // store in vector write to file etc.
                    processpacket(dt);                         

                    packet_storage.remove(start_index,dt.size());

           }

       }
}
于 2016-12-15T09:13:25.610 回答