当数据输入缓慢(串行端口)时,Qt程序(在Raspberry Pi上)运行缓慢

当数据输入缓慢(串行端口)时,Qt程序(在Raspberry Pi上)运行缓慢,qt,raspberry-pi,qextserialport,Qt,Raspberry Pi,Qextserialport,我正在开发一个运行在Raspberry Pi上的程序,并使用Pi的串行端口与Arduino进行交互 我的架构是: Pi连接到一个PanStamp(Arduino+无线收发器),还有一个卫星(带有几个传感器的PanStamp)以无线方式发送数据。Pi可以激活和停用卫星。卫星每秒发送数据约5次,连接到Pi的PanStamp接收该数据并使用串行端口发送。Pi的PanStamp每秒还发送一些传感器的读数 为此,我使用Qt框架、qextserialport(实现Qt信号/插槽的串行端口库)wiriginp

我正在开发一个运行在Raspberry Pi上的程序,并使用Pi的串行端口与Arduino进行交互

我的架构是: Pi连接到一个PanStamp(Arduino+无线收发器),还有一个卫星(带有几个传感器的PanStamp)以无线方式发送数据。Pi可以激活和停用卫星。卫星每秒发送数据约5次,连接到Pi的PanStamp接收该数据并使用串行端口发送。Pi的PanStamp每秒还发送一些传感器的读数

为此,我使用Qt框架、qextserialport(实现Qt信号/插槽的串行端口库)wiriginpi来控制GPIO和一些TCP和UDP套接字,以便通过internet发送一些数据

当卫星发送数据时,一切看起来都运转良好

然而,当我关掉卫星时,整个程序变得相当慢。它每两秒钟只显示一次数据。。。正常的操作应该是每秒接收一次读数(数据由具有正确计时的PanStamp发送,我用示波器检查)

我有一个和数据一起发送的数据包计数,并且没有数据包丢失。因此,它看起来像是一种缓冲区或类似的东西,用来抑制数据流

最奇怪的是,当我再次打开卫星(“高速”数据流)时,Pi显示了一个“数据突发”,就像所有东西都被缓冲了,处理得很慢。布鲁斯特卫星的大小看起来也与卫星关闭的时间成正比

有人知道发生了什么/我如何测试它吗

一些代码:

串行端口初始化:

/* Initialize Serial Port to talk with PanStamp */
this->port = new QextSerialPort(portName, QextSerialPort::EventDriven);
port->setBaudRate(BAUD9600);
port->setFlowControl(FLOW_OFF);
port->setParity(PAR_NONE);
port->setDataBits(DATA_8);
port->setStopBits(STOP_1);

if (port->open(QIODevice::ReadWrite) == true)
{
    /* Connect the arriving data signal with the incoming data function */
    connect(port, SIGNAL(readyRead()), this, SLOT(incoming_data()));

    /* Connect state change signal with its function */
    connect(port, SIGNAL(dsrChanged(bool)), this, SLOT(onDsrChanged(bool)));

    /* Debug */
    qDebug() << "listening for data on" << port->portName();
}
else
{
    qDebug() << "device failed to open:" << port->errorString();
    exit(1);
}
/*初始化串行端口以与PanStamp通信*/
此->端口=新的QextSerialPort(端口名,QextSerialPort::EventDriven);
端口->设置波特率(波特率9600);
端口->设置流量控制(流量关闭);
端口->设置奇偶校验(无参数);
端口->设置数据位(数据_8);
端口->设置位(停止1);
如果(端口->打开(QIODevice::ReadWrite)==true)
{
/*将到达数据信号与输入数据功能连接*/
连接(端口,信号(readyRead()),此,插槽(传入的_数据());
/*连接状态变化信号及其功能*/
连接(端口、信号(dsrChanged(bool))、此、插槽(onDsrChanged(bool));
/*调试*/
qDebug()读取(1);
b=(无符号字符)字节。位于(0);
如果(b==0xBA)
{
get_data=true;
返回;
}
其他的
最后一个字节=b;
}
其他的
{
字节=端口->读取(1);
b=字节。在(0)处;
fflush(stdout);
最后一个字节=b;
}
}
其他的
{
调试消息(“,”);
/*读取数据大小*/
如果(端口->字节可用()&&(数据大小<0))
{
字节=端口->读取(1);
数据大小=(int)字节,位于(0);
调试消息(“大小:%i->%02X\n”,数据大小,(无符号字符)数据大小);
}
fflush(stderr);
/*读取数据并调用存储\传入\数据*/
如果(端口->字节可用()>=数据大小)
{
字节=端口->读取(数据大小);
如果(数据大小==0x34)
存储传入的stellite数据(字节);
其他的
{
if(字节数,在(0)=集线器数据)
存储\传入\集线器\数据(字节);
其他的
{
printf(“数据大小:%i\t电子表格平移数据:”,数据大小);
对于(i=0;i
以下是其他函数和数据结构:

/* ========================================== Data Types ======================================= */
typedef unsigned char byte;
typedef union _float_byte
{
unsigned char asByte[4];
float asFloat;
} float_byte;

typedef union _int_byte
{
unsigned char asByte[2];
short int asInt;
} int_byte;

typedef union _uint_byte
{
unsigned char asByte[4];
unsigned int asUInt;
} uint_byte;

typedef struct _stellite_data
{
QTime piTime;
float_byte x0, y0, z0;
float_byte x1, y1, z1;
float_byte temp0, temp1;
float_byte pressure0;
float_byte pressure1;
float_byte pressure2;
uint_byte time_stamp;
int_byte packet_count;
QByteArray bytes;
byte sender;
byte status_byte;
} satellite_data;

typedef struct _hub_data
{
QTime piTime;
float_byte altitude;
byte status_byte;
QByteArray bytes;
uint_byte packet_count;

byte power_sat0;
byte power_sat1;
byte hack_hd0;
byte hack_hd1;
byte solenoid0;
byte solenoid1;
byte webcam;
} hub_data;

/* ========================================== END Data Types ======================================= */

/**
 * @brief SerialHandler::store_incoming_hub_data
 *
 * Store Hub's data.
 *
 * Packet description:
 * +---------------------+-----------------+
 * |  Altitude_Command   | Altitude (float)|
 * |      (1 byte)       |    (4 byts)     |
 * +---------------------+-----------------+
 *
 * @param data Data to be stored
 */
void SerialHandler::store_incoming_hub_data(QByteArray data)
{
hub_data *tmp = new hub_data;
char *datagram;
int datagram_size;

tmp->piTime = QTime::currentTime();

tmp->altitude.asByte[0] = data.at(1);
tmp->altitude.asByte[1] = data.at(2);
tmp->altitude.asByte[2] = data.at(3);
tmp->altitude.asByte[3] = data.at(4);

tmp->packet_count.asByte[0] = data.at(5);
tmp->packet_count.asByte[1] = data.at(6);
tmp->packet_count.asByte[2] = data.at(7);
tmp->packet_count.asByte[3] = data.at(8);

tmp->power_sat0 = GS_link->power_sat0;
tmp->power_sat1 = GS_link->power_sat1;
tmp->hack_hd0 = GS_link->hack_hd0;
tmp->hack_hd1 = GS_link->hack_hd1;
tmp->solenoid0 = GS_link->solenoid0;
tmp->solenoid1 = GS_link->solenoid1;
tmp->webcam = GS_link->webcam;

printf("HUB: %s:%i\t%u\t%.4f\t%i\t%i\t%i\t%i\t%i\t%i\t%i\n",
       tmp->piTime.toString().toStdString().c_str(),
       tmp->piTime.msec(),
       tmp->packet_count.asUInt,
       tmp->altitude.asFloat,
       tmp->power_sat0,
       tmp->power_sat1,
       tmp->hack_hd0,
       tmp->hack_hd1,
       tmp->solenoid0,
       tmp->solenoid1,
       tmp->webcam);
fflush(stdout);

/* Send to GS */
datagram_size = asprintf(&datagram, "H,ALT,%.4f,S0,%i,S1,%i,HD0,%i,HD1,%i,SOL0,%i,SOL1,%i,W,%i",
                         tmp->altitude.asFloat,
                         tmp->power_sat0,
                         tmp->power_sat1,
                         tmp->hack_hd0,
                         tmp->hack_hd1,
                         tmp->solenoid0,
                         tmp->solenoid1,
                         tmp->webcam);
GS_link->send_datagram(datagram_size, datagram);

hub_data_list.append(tmp);

if((hub_data_list.size()%60) == 0)
    log_hub_data("iSEDE_Hub.log");
free(datagram);

}

void SerialHandler::log_hub_data(QString file_name)
{
int i;
QFile file(file_name);
file.open(QIODevice::Append);
QTextStream file_out(&file);

printf("Logging Hub's data...\n");
for(i = last_hub_logged; i < hub_data_list.size(); i++)
{
    file_out << hub_data_list.at(i)->piTime.toString(Qt::ISODate).toStdString().c_str() << ":";
    file_out << hub_data_list.at(i)->piTime.msec() << ';';

    file_out << hub_data_list.at(i)->altitude.asFloat << ';';
    file_out << hub_data_list.at(i)->power_sat0 << ';';
    file_out << hub_data_list.at(i)->power_sat1 << ';';
    file_out << hub_data_list.at(i)->hack_hd0 << ';';
    file_out << hub_data_list.at(i)->hack_hd1 << ';';
    file_out << hub_data_list.at(i)->solenoid0 << ';';
    file_out << hub_data_list.at(i)->solenoid1 << ';';
    file_out << hub_data_list.at(i)->webcam << '\n';
}
last_hub_logged = i;
file.close();
printf("Done!\n");
}

/**
 * @brief SerialHandler::store_incoming_data
 * @param data
 *
 * Parse the data.
 *
 * Payload description:
 * +---------------+------------------+---------------------+---------------+--------------+-------------+------------------+
 * | Packet Count  | Temperature (x2) | Accelerometers (x2) | Pressure (x3) |  Time Stamp  | Status byte | Sender's Address |
 * |  (2 bytes)    |     (8 bytes)    |     (24 bytes)      |   (12 bytes)  |   (4 bytes)  |  (1 byte)   |    (1 byte)      |
 * +---------------+------------------+---------------------+---------------+--------------+-------------+------------------+
 */
void SerialHandler::store_incoming_stellite_data(QByteArray data)
{
satellite_data *tmp = new satellite_data;

tmp->bytes.append(data);

/* Pi's time */
tmp->piTime = QTime::currentTime();

/* Packet count */
tmp->packet_count.asByte[0] = data.at(0);
tmp->packet_count.asByte[1] = data.at(1);

/* Temperature 0 */
tmp->temp0.asByte[0] = data.at(2);
tmp->temp0.asByte[1] = data.at(3);
tmp->temp0.asByte[2] = data.at(4);
tmp->temp0.asByte[3] = data.at(5);

/* Temperature 1 */
tmp->temp1.asByte[0] = data.at(6);
tmp->temp1.asByte[1] = data.at(7);
tmp->temp1.asByte[2] = data.at(8);
tmp->temp1.asByte[3] = data.at(9);

/* Accelerometer 0 */
tmp->x0.asByte[0] = data.at(10);
tmp->x0.asByte[1] = data.at(11);
tmp->x0.asByte[2] = data.at(12);
tmp->x0.asByte[3] = data.at(13);

tmp->y0.asByte[0] = data.at(14);
tmp->y0.asByte[1] = data.at(15);
tmp->y0.asByte[2] = data.at(16);
tmp->y0.asByte[3] = data.at(17);

tmp->z0.asByte[0] = data.at(18);
tmp->z0.asByte[1] = data.at(19);
tmp->z0.asByte[2] = data.at(20);
tmp->z0.asByte[3] = data.at(21);

/* Accelerometer 1 */
tmp->x1.asByte[0] = data.at(22);
tmp->x1.asByte[1] = data.at(23);
tmp->x1.asByte[2] = data.at(24);
tmp->x1.asByte[3] = data.at(25);

tmp->y1.asByte[0] = data.at(26);
tmp->y1.asByte[1] = data.at(27);
tmp->y1.asByte[2] = data.at(28);
tmp->y1.asByte[3] = data.at(29);

tmp->z1.asByte[0] = data.at(30);
tmp->z1.asByte[1] = data.at(31);
tmp->z1.asByte[2] = data.at(32);
tmp->z1.asByte[3] = data.at(33);

/* Pressure 0 */
tmp->pressure0.asByte[0] = data.at(34);
tmp->pressure0.asByte[1] = data.at(35);
tmp->pressure0.asByte[2] = data.at(36);
tmp->pressure0.asByte[3] = data.at(37);

/* Pressure 1 */
tmp->pressure1.asByte[0] = data.at(38);
tmp->pressure1.asByte[1] = data.at(39);
tmp->pressure1.asByte[2] = data.at(40);
tmp->pressure1.asByte[3] = data.at(41);

/* Pressure 2 */
tmp->pressure2.asByte[0] = data.at(42);
tmp->pressure2.asByte[1] = data.at(43);
tmp->pressure2.asByte[2] = data.at(44);
tmp->pressure2.asByte[3] = data.at(45);

/* Satellite time stamp */
tmp->time_stamp.asByte[0] = data.at(46);
tmp->time_stamp.asByte[1] = data.at(47);
tmp->time_stamp.asByte[2] = data.at(48);
tmp->time_stamp.asByte[3] = data.at(49);

/* Satellite status byte */
tmp->status_byte = data.at(50);

/* Sender's address */
tmp->sender = data.at(51);

    printf("%u\t%u\t%u\t%hi\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%s\t%s:%03i\n",
       tmp->sender,
       tmp->time_stamp.asUInt,
       tmp->time_stamp.asUInt/1000,
       tmp->packet_count.asInt,
       tmp->temp0.asFloat,
       tmp->temp1.asFloat,
       tmp->x0.asFloat,
       tmp->y0.asFloat,
       tmp->z0.asFloat,
       tmp->x1.asFloat,
       tmp->y1.asFloat,
       tmp->z1.asFloat,
       tmp->pressure0.asFloat,
       tmp->pressure1.asFloat,
       tmp->pressure2.asFloat,
       byte_to_binary(tmp->status_byte),
       tmp->piTime.toString(Qt::ISODate).toStdString().c_str(),
       tmp->piTime.msec());
fflush(stdout);

/* Create a datagram and send it */
char *datagram = NULL;
int datagram_size;
datagram_size = asprintf(&datagram, "S%u,C,%u,PC,%u,A0,%.4f,%.4f,%.4f,A1,%.4f,%.4f,%.4f,T0,%.4f,T1,%.4f,P0,%.4f,P1,%.4f,P2,%.4f,SB,%u\n",
                         tmp->sender - 7,
                         tmp->time_stamp.asUInt,
                         tmp->packet_count.asInt,
                         tmp->x0.asFloat,
                         tmp->y0.asFloat,
                         tmp->z0.asFloat,
                         tmp->x1.asFloat,
                         tmp->y1.asFloat,
                         tmp->z1.asFloat,
                         tmp->temp0.asFloat,
                         tmp->temp1.asFloat,
                         tmp->pressure0.asFloat,
                         tmp->pressure1.asFloat,
                         tmp->pressure2.asFloat,
                         tmp->status_byte);

GS_link->send_datagram(datagram_size, datagram);
free(datagram);

    data_list.append(tmp);
    debug_msg("**%i**\n", data_list.size());

    if(data_list.size()%100 == 0)
    {
        log_data("iSEDE.log");
    }


/**
 * @brief SerialHandler::log_data
 * @param file_name
 */
void SerialHandler::log_data(QString file_name)
{
int i;
QFile file(file_name);
file.open(QIODevice::Append);
QTextStream file_out(&file);

printf("Logging data....\n");

for(i = last_logged; i < data_list.size(); i++)
{
    file_out << data_list.at(i)->piTime.toString(Qt::ISODate).toStdString().c_str() << ":";
    file_out << data_list.at(i)->piTime.msec() << ";";

    file_out << data_list.at(i)->sender << ",";
    file_out << data_list.at(i)->time_stamp.asUInt << ",";
    file_out << data_list.at(i)->packet_count.asInt << ",";

    file_out << data_list.at(i)->temp0.asFloat << ",";
    file_out << data_list.at(i)->temp1.asFloat << ",";

    file_out << data_list.at(i)->x0.asFloat << ",";
    file_out << data_list.at(i)->y0.asFloat << ",";
    file_out << data_list.at(i)->z0.asFloat << ",";

    file_out << data_list.at(i)->x1.asFloat << ",";
    file_out << data_list.at(i)->y1.asFloat << ",";
    file_out << data_list.at(i)->z1.asFloat << ",";

    file_out << data_list.at(i)->pressure0.asFloat << ",";

    file_out << byte_to_binary(data_list.at(i)->status_byte);

    file_out << "\n";
}
last_logged = i;
file.close();

printf("Done!\n");
}
/*===============================================================================================================================================================================================================================================================================================================================================================================================================*/
typedef无符号字符字节;
类型定义联合\u浮点\u字节
{
无符号字符asByte[4];
浮动为浮动;
}浮点字节;
typedef并集_int_字节
{
无符号字符为字节[2];
短期投资;
}整数字节;
类型定义联合单位字节
{
无符号字符asByte[4];
无符号整数;
}单位字节;
typedef struct_stellite_数据
{
QTime-piTime;
浮点字节x0,y0,z0;
浮点字节x1、y1、z1;
浮点字节temp0,temp1;
浮子压力0;
浮子压力1;
浮动压力2;
单位字节时间戳;
整数字节包计数;
QByteArray字节;
字节发送器;
字节状态\字节;
}卫星数据;
typedef结构_hub_数据
{
QTime-piTime;
浮动高度;
字节状态\字节;
QByteArray字节;
单位字节数据包计数;
字节功率_sat0;
字节功率_sat1;
字节hack_hd0;
字节hack_hd1;
字节螺线管0;
字节螺线管1;
字节网络摄像机;
}hub_数据;
/*======================================================================================================================*/
/**
*@brief SerialHandler::存储\u传入的\u中心\u数据
*
*存储中心的数据。
*
*数据包描述:
* +---------------------+-----------------+
*|高度|命令|高度(浮动)|
*|(1字节)|(4字节)|
* +---------------------+-----------------+
*
*@param要存储的数据
*/
void SerialHandler::存储\传入\集线器\数据(QByteArray数据)
{
hub_数据*tmp=新的hub_数据;
字符*数据报;
int数据报的大小;
tmp->piTime=QTime::currentTime();
tmp->高度.asByte[0]=数据.at(1);
tmp->高度.asByte[1]=数据.at(2);
tmp->高度.asByte[2]=数据.at(3);
tmp->高度.asByte[3]=数据.at(4);
tmp->packet_count.asByte[0]=data.at(5);
tmp->packet_count.asByte[1]=数据.at(6);
tmp->packet_count.asByte[2]=data.at(7);
tmp->packet_count.asByte[3]=数据.at(8);
tmp->power\U sat0=GS\U link->power\U sat0;
tmp->power_sat1=GS_link->power_sat1;
tmp->hack_hd0=GS_link->hack_hd0;
tmp->hack_hd1=GS_link->hack_hd1;
tmp->电磁阀0=GS\U链路->电磁阀0;
tmp->电磁阀1=GS\U链路->电磁阀1;
tmp->webcam=GS_link->webcam;
printf(“集线器:%s:%i\t%u\t%.4f\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\n”,
tmp->piTime.toString().toStd
/* ========================================== Data Types ======================================= */
typedef unsigned char byte;
typedef union _float_byte
{
unsigned char asByte[4];
float asFloat;
} float_byte;

typedef union _int_byte
{
unsigned char asByte[2];
short int asInt;
} int_byte;

typedef union _uint_byte
{
unsigned char asByte[4];
unsigned int asUInt;
} uint_byte;

typedef struct _stellite_data
{
QTime piTime;
float_byte x0, y0, z0;
float_byte x1, y1, z1;
float_byte temp0, temp1;
float_byte pressure0;
float_byte pressure1;
float_byte pressure2;
uint_byte time_stamp;
int_byte packet_count;
QByteArray bytes;
byte sender;
byte status_byte;
} satellite_data;

typedef struct _hub_data
{
QTime piTime;
float_byte altitude;
byte status_byte;
QByteArray bytes;
uint_byte packet_count;

byte power_sat0;
byte power_sat1;
byte hack_hd0;
byte hack_hd1;
byte solenoid0;
byte solenoid1;
byte webcam;
} hub_data;

/* ========================================== END Data Types ======================================= */

/**
 * @brief SerialHandler::store_incoming_hub_data
 *
 * Store Hub's data.
 *
 * Packet description:
 * +---------------------+-----------------+
 * |  Altitude_Command   | Altitude (float)|
 * |      (1 byte)       |    (4 byts)     |
 * +---------------------+-----------------+
 *
 * @param data Data to be stored
 */
void SerialHandler::store_incoming_hub_data(QByteArray data)
{
hub_data *tmp = new hub_data;
char *datagram;
int datagram_size;

tmp->piTime = QTime::currentTime();

tmp->altitude.asByte[0] = data.at(1);
tmp->altitude.asByte[1] = data.at(2);
tmp->altitude.asByte[2] = data.at(3);
tmp->altitude.asByte[3] = data.at(4);

tmp->packet_count.asByte[0] = data.at(5);
tmp->packet_count.asByte[1] = data.at(6);
tmp->packet_count.asByte[2] = data.at(7);
tmp->packet_count.asByte[3] = data.at(8);

tmp->power_sat0 = GS_link->power_sat0;
tmp->power_sat1 = GS_link->power_sat1;
tmp->hack_hd0 = GS_link->hack_hd0;
tmp->hack_hd1 = GS_link->hack_hd1;
tmp->solenoid0 = GS_link->solenoid0;
tmp->solenoid1 = GS_link->solenoid1;
tmp->webcam = GS_link->webcam;

printf("HUB: %s:%i\t%u\t%.4f\t%i\t%i\t%i\t%i\t%i\t%i\t%i\n",
       tmp->piTime.toString().toStdString().c_str(),
       tmp->piTime.msec(),
       tmp->packet_count.asUInt,
       tmp->altitude.asFloat,
       tmp->power_sat0,
       tmp->power_sat1,
       tmp->hack_hd0,
       tmp->hack_hd1,
       tmp->solenoid0,
       tmp->solenoid1,
       tmp->webcam);
fflush(stdout);

/* Send to GS */
datagram_size = asprintf(&datagram, "H,ALT,%.4f,S0,%i,S1,%i,HD0,%i,HD1,%i,SOL0,%i,SOL1,%i,W,%i",
                         tmp->altitude.asFloat,
                         tmp->power_sat0,
                         tmp->power_sat1,
                         tmp->hack_hd0,
                         tmp->hack_hd1,
                         tmp->solenoid0,
                         tmp->solenoid1,
                         tmp->webcam);
GS_link->send_datagram(datagram_size, datagram);

hub_data_list.append(tmp);

if((hub_data_list.size()%60) == 0)
    log_hub_data("iSEDE_Hub.log");
free(datagram);

}

void SerialHandler::log_hub_data(QString file_name)
{
int i;
QFile file(file_name);
file.open(QIODevice::Append);
QTextStream file_out(&file);

printf("Logging Hub's data...\n");
for(i = last_hub_logged; i < hub_data_list.size(); i++)
{
    file_out << hub_data_list.at(i)->piTime.toString(Qt::ISODate).toStdString().c_str() << ":";
    file_out << hub_data_list.at(i)->piTime.msec() << ';';

    file_out << hub_data_list.at(i)->altitude.asFloat << ';';
    file_out << hub_data_list.at(i)->power_sat0 << ';';
    file_out << hub_data_list.at(i)->power_sat1 << ';';
    file_out << hub_data_list.at(i)->hack_hd0 << ';';
    file_out << hub_data_list.at(i)->hack_hd1 << ';';
    file_out << hub_data_list.at(i)->solenoid0 << ';';
    file_out << hub_data_list.at(i)->solenoid1 << ';';
    file_out << hub_data_list.at(i)->webcam << '\n';
}
last_hub_logged = i;
file.close();
printf("Done!\n");
}

/**
 * @brief SerialHandler::store_incoming_data
 * @param data
 *
 * Parse the data.
 *
 * Payload description:
 * +---------------+------------------+---------------------+---------------+--------------+-------------+------------------+
 * | Packet Count  | Temperature (x2) | Accelerometers (x2) | Pressure (x3) |  Time Stamp  | Status byte | Sender's Address |
 * |  (2 bytes)    |     (8 bytes)    |     (24 bytes)      |   (12 bytes)  |   (4 bytes)  |  (1 byte)   |    (1 byte)      |
 * +---------------+------------------+---------------------+---------------+--------------+-------------+------------------+
 */
void SerialHandler::store_incoming_stellite_data(QByteArray data)
{
satellite_data *tmp = new satellite_data;

tmp->bytes.append(data);

/* Pi's time */
tmp->piTime = QTime::currentTime();

/* Packet count */
tmp->packet_count.asByte[0] = data.at(0);
tmp->packet_count.asByte[1] = data.at(1);

/* Temperature 0 */
tmp->temp0.asByte[0] = data.at(2);
tmp->temp0.asByte[1] = data.at(3);
tmp->temp0.asByte[2] = data.at(4);
tmp->temp0.asByte[3] = data.at(5);

/* Temperature 1 */
tmp->temp1.asByte[0] = data.at(6);
tmp->temp1.asByte[1] = data.at(7);
tmp->temp1.asByte[2] = data.at(8);
tmp->temp1.asByte[3] = data.at(9);

/* Accelerometer 0 */
tmp->x0.asByte[0] = data.at(10);
tmp->x0.asByte[1] = data.at(11);
tmp->x0.asByte[2] = data.at(12);
tmp->x0.asByte[3] = data.at(13);

tmp->y0.asByte[0] = data.at(14);
tmp->y0.asByte[1] = data.at(15);
tmp->y0.asByte[2] = data.at(16);
tmp->y0.asByte[3] = data.at(17);

tmp->z0.asByte[0] = data.at(18);
tmp->z0.asByte[1] = data.at(19);
tmp->z0.asByte[2] = data.at(20);
tmp->z0.asByte[3] = data.at(21);

/* Accelerometer 1 */
tmp->x1.asByte[0] = data.at(22);
tmp->x1.asByte[1] = data.at(23);
tmp->x1.asByte[2] = data.at(24);
tmp->x1.asByte[3] = data.at(25);

tmp->y1.asByte[0] = data.at(26);
tmp->y1.asByte[1] = data.at(27);
tmp->y1.asByte[2] = data.at(28);
tmp->y1.asByte[3] = data.at(29);

tmp->z1.asByte[0] = data.at(30);
tmp->z1.asByte[1] = data.at(31);
tmp->z1.asByte[2] = data.at(32);
tmp->z1.asByte[3] = data.at(33);

/* Pressure 0 */
tmp->pressure0.asByte[0] = data.at(34);
tmp->pressure0.asByte[1] = data.at(35);
tmp->pressure0.asByte[2] = data.at(36);
tmp->pressure0.asByte[3] = data.at(37);

/* Pressure 1 */
tmp->pressure1.asByte[0] = data.at(38);
tmp->pressure1.asByte[1] = data.at(39);
tmp->pressure1.asByte[2] = data.at(40);
tmp->pressure1.asByte[3] = data.at(41);

/* Pressure 2 */
tmp->pressure2.asByte[0] = data.at(42);
tmp->pressure2.asByte[1] = data.at(43);
tmp->pressure2.asByte[2] = data.at(44);
tmp->pressure2.asByte[3] = data.at(45);

/* Satellite time stamp */
tmp->time_stamp.asByte[0] = data.at(46);
tmp->time_stamp.asByte[1] = data.at(47);
tmp->time_stamp.asByte[2] = data.at(48);
tmp->time_stamp.asByte[3] = data.at(49);

/* Satellite status byte */
tmp->status_byte = data.at(50);

/* Sender's address */
tmp->sender = data.at(51);

    printf("%u\t%u\t%u\t%hi\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%s\t%s:%03i\n",
       tmp->sender,
       tmp->time_stamp.asUInt,
       tmp->time_stamp.asUInt/1000,
       tmp->packet_count.asInt,
       tmp->temp0.asFloat,
       tmp->temp1.asFloat,
       tmp->x0.asFloat,
       tmp->y0.asFloat,
       tmp->z0.asFloat,
       tmp->x1.asFloat,
       tmp->y1.asFloat,
       tmp->z1.asFloat,
       tmp->pressure0.asFloat,
       tmp->pressure1.asFloat,
       tmp->pressure2.asFloat,
       byte_to_binary(tmp->status_byte),
       tmp->piTime.toString(Qt::ISODate).toStdString().c_str(),
       tmp->piTime.msec());
fflush(stdout);

/* Create a datagram and send it */
char *datagram = NULL;
int datagram_size;
datagram_size = asprintf(&datagram, "S%u,C,%u,PC,%u,A0,%.4f,%.4f,%.4f,A1,%.4f,%.4f,%.4f,T0,%.4f,T1,%.4f,P0,%.4f,P1,%.4f,P2,%.4f,SB,%u\n",
                         tmp->sender - 7,
                         tmp->time_stamp.asUInt,
                         tmp->packet_count.asInt,
                         tmp->x0.asFloat,
                         tmp->y0.asFloat,
                         tmp->z0.asFloat,
                         tmp->x1.asFloat,
                         tmp->y1.asFloat,
                         tmp->z1.asFloat,
                         tmp->temp0.asFloat,
                         tmp->temp1.asFloat,
                         tmp->pressure0.asFloat,
                         tmp->pressure1.asFloat,
                         tmp->pressure2.asFloat,
                         tmp->status_byte);

GS_link->send_datagram(datagram_size, datagram);
free(datagram);

    data_list.append(tmp);
    debug_msg("**%i**\n", data_list.size());

    if(data_list.size()%100 == 0)
    {
        log_data("iSEDE.log");
    }


/**
 * @brief SerialHandler::log_data
 * @param file_name
 */
void SerialHandler::log_data(QString file_name)
{
int i;
QFile file(file_name);
file.open(QIODevice::Append);
QTextStream file_out(&file);

printf("Logging data....\n");

for(i = last_logged; i < data_list.size(); i++)
{
    file_out << data_list.at(i)->piTime.toString(Qt::ISODate).toStdString().c_str() << ":";
    file_out << data_list.at(i)->piTime.msec() << ";";

    file_out << data_list.at(i)->sender << ",";
    file_out << data_list.at(i)->time_stamp.asUInt << ",";
    file_out << data_list.at(i)->packet_count.asInt << ",";

    file_out << data_list.at(i)->temp0.asFloat << ",";
    file_out << data_list.at(i)->temp1.asFloat << ",";

    file_out << data_list.at(i)->x0.asFloat << ",";
    file_out << data_list.at(i)->y0.asFloat << ",";
    file_out << data_list.at(i)->z0.asFloat << ",";

    file_out << data_list.at(i)->x1.asFloat << ",";
    file_out << data_list.at(i)->y1.asFloat << ",";
    file_out << data_list.at(i)->z1.asFloat << ",";

    file_out << data_list.at(i)->pressure0.asFloat << ",";

    file_out << byte_to_binary(data_list.at(i)->status_byte);

    file_out << "\n";
}
last_logged = i;
file.close();

printf("Done!\n");
}