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); // 原始输入模式