LINUX C、QT上位机间串口传输数据库文件

发布时间 2023-05-01 19:59:56作者: 成信吴彦祖(略胜亿筹)
在串口传输文件时,我们通常希望以二进制形式将文件发送出去,因为这样可以避免文件内容被解释为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);  // 原始输入模式