LINUX C、QT上位机间串口传输数据库文件
在串口传输文件时,我们通常希望以二进制形式将文件发送出去,因为这样可以避免文件内容被解释为ASCII码,并且可以减少数据传输的时间和数据量。在QT上位机中可以使用以下方式将文件读取并发送出去:
// 读取本地SQLite3数据库文件
QString filename = "wifi_UAV.db";
QFile file(filename);
if (!file.open(QIODevice::ReadOnly))
{
qDebug() << "Failed to open file";
}
QByteArray data = file.readAll();
file.close();
// 将数据通过串口发送出去
int ret = serialport->write(data);
if (ret == -1)
{
qDebug() << "Failed to send data";
}
而在LINUX端用如下C程序demo进行接收:
char buf[BUF_SIZE];
int len = 0;
FILE *fp = fopen("test.db", "wb"); // 以二进制写方式打开文件
if (!fp) e
perror("open file failed");
return -1;
}
while (1) {
len = read(fd, buf, BUF_SIZE); // 从串口读取数据
if (len > 0) {
fwrite(buf, sizeof(char), len, fp); // 写入文件
fflush(fp);
} else if (len < 0) {
perror("read serial port failed");
break;
}
}
值得注意的是,在配置串口时,我们禁用掉了包括行规程在内的一些接收配置,目的在于使用原始的接收方法接收文件的二进制流:
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 原始输入模式

浙公网安备 33010602011771号