【问题标题】:Qt send full byte on serial portQt在串口上发送完整字节
【发布时间】:2014-01-23 16:25:53
【问题描述】:

我有这个使用 QtSerialPort 的简单代码:

char foo[] = {130,50,'\0'};
serial->write(foo);

我的连载结果是 {2, 50}。我认为我可以发送的最大数字是 128(字符从 -128 变为 128)。发送号码从0到255的方式在哪里?我尝试使用 unsigned char 但方法“write”不适用于它。 QByteArray 也会出现同样的问题。

谢谢大家。

【问题讨论】:

    标签: c++ qt qbytearray qtserialport


    【解决方案1】:

    QIODevice 接口具有用于发送的默认字符,这可能取决于编译器。有关详细信息,请参阅文档。

    qint64 QIODevice::write(const char * data, qint64 maxSize)

    从数据到设备最多写入 maxSize 个字节的数据。返回实际写入的字节数,如果发生错误则返回 -1。

    但是,另一方面,如果您正确获取数据,则不必太担心。您仍然可以将大于 128 的值作为有符号发送,但它们会以负值的形式出现,例如 0xFF 将为 -1。

    如果你在接收端按相反的顺序做同样的逻辑,应该没有问题。

    但是,这似乎与您的问题无关,因为您没有获得 130 的相应负值,但您将其切成 7 位。确保您的连接是 8 个数据位。

    您可以在使用以下代码打开端口后明确设置:

    QSerialPort serialPort;
    QString serialPortName = "foo";
    serialPort.setPortName(serialPortName);
    
    if (!serialPort.open(QIODevice::WriteOnly)) {
        standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    }   
    
    if (!serialPort.setDataBits(QSerialPort::Data8)) {
        standardOutput << QObject::tr("Failed to set 8 data bits for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    } 
    
    // Other setup code here
    
    char foo[] = {130,50,'\0'};
    serialPort.write(foo);
    

    【讨论】:

    • 引用的 sn-p 并没有说明数据是否必须签名,它依赖于编译器处理 char 的方式,它可能是有符号的或无符号的。
    • 我的错误是我假设串行是8位默认的。现在它工作正常。
    【解决方案2】:

    确保您已将串行端口设置为发送 8 位,使用 QSerialPort::DataBits

    “130”作为“2”出现的事实意味着最高有效位被截断。

    【讨论】:

      猜你喜欢
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      相关资源
      最近更新 更多