【问题标题】:QSerialPort and sending bytes (with value > 127?)QSerialPort 和发送字节(值 > 127?)
【发布时间】:2015-10-25 19:06:45
【问题描述】:

我有:

QString hex = "0234301c4c49541d4741546f77617220a5a91e42411e43311e44332c30301e45332c30301e47737a74756b613742413303";
QByteArray test = QByteArray::fromHex(hex.toLatin1());

现在,我想通过 SerialPort 发送它:

serial = new QSerialPort(this);
serial->setPortName("ttyACM0");
serial->setBaudRate(QSerialPort::Baud9600);
serial->setDataBits(QSerialPort::Data8);
serial->setParity(QSerialPort::NoParity);
serial->setStopBits(QSerialPort::OneStop);
serial->setFlowControl(QSerialPort::NoFlowControl);

if(serial->open(QIODevice::ReadWrite))

{

    qDebug()<<"Port is open!";
    if(serial->isWritable())
    {
        qDebug()<<"Yes, i can write to port!";
    }
    serial->waitForBytesWritten(-1);
    serial->write(test.data());
    serial->flush(); // Port Error 12 (timed out???)
    serial->close()
 }

我没有结果(似乎发送小于 127 的字符/字节值,但不是超过此值的那些)

我的问题 -> 如何转换此 QByteArray 以正确发送所有字节? (我试图在谷歌中找到答案,但没有成功/我是新手)

【问题讨论】:

  • 您使用的是signed charunsigned char 还是uint8_t
  • 我应该在哪里使用无符号字符? (在我的程序中,我应该发送从 0 到 255 的数据值)
  • 你为什么要serial-&gt;write(test.data());QSerialPort::write() 有一个重载,直接采用 QByteArray 所以它应该足够了 serial-&gt;write(test);... 它是这样工作的吗?此外(与您的问题无关):为什么在将数据写入串行端口之前执行serial-&gt;waitForBytesWritten(-1);?我认为如果您在将数据写入串行端口(如果您真的需要的话)之后这样做会更有意义,不是吗?
  • 我同意,先做serial-&gt;write(test); 然后serial-&gt;waitForBytesWritten(-1) 并删除flush()
  • signed char 类型只允许 7 位数据(假设您的平台有 8 位用于 char),1 位保留用于符号。 unsigned char 允许您将所有 8 位(0 到 255)用于数据。 uint8_t 数据类型表示您需要一个无符号的 8 位数据类型。请记住,char 类型可以是charsigned charunsigned char取决于平台

标签: c++ qt serial-port


【解决方案1】:

您几乎肯定不想调用采用 const char* 的 QSerialPort 写入重载。查看 docs 的重载:

将数据从以零结尾的 8 位字符串写入设备。

但是您不是在编写以零结尾的 C 字符串,而是在编写任意二进制数据。所以你需要直接调用接受 QByteArray 的写重载,像这样:

serial->write(test);

正如在其他一些 cmets 中所述,在调用 write 之前关于 waitForBytesWritten 的内容也没有多大意义,但您最大的问题是试图将您的任意数据的 QByteArray 视为以 null 结尾的 C-String .

【讨论】:

  • 它根本没有麦汁。如果我发送 char(int) 大于 127 的 qbytearray,我会变成收银机没有回显答案,并且错误 12...超时?,在其他情况下,我会成为收件人并回显确认(在端口读取时)...有问题使用这个 ::write 函数
【解决方案2】:

它们是 crc 代码中的错误(从某些门户网站下载) 它被转换为 uint16_t 而不是 uint8_t 现在它真的有效。 谢谢你的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多