qserialport 不向 arduino 发送字符

Posted

技术标签:

【中文标题】qserialport 不向 arduino 发送字符【英文标题】:qserialport does not send a char to arduino 【发布时间】:2014-01-25 01:37:04 【问题描述】:

我在尝试从 WIN7 上的 qt5 应用程序发送一个字符(即“R”)到连接到 Arduino 的 comport 时遇到问题。 我打算让 Arduino 上的 LED 闪烁,我的 arduino 部分工作正常。

这是我的qt代码:

#include <QTextStream>
#include <QCoreApplication>
#include <QtSerialPort/QSerialPortInfo>
#include <QSerialPort>
#include <iostream>
#include <QtCore>

QT_USE_NAMESPACE

using namespace std;
QSerialPort serial;

int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);
    QTextStream out(stdout);
    QList<QSerialPortInfo> serialPortInfoList = QSerialPortInfo::availablePorts();

    out << QObject::tr("Total number of ports available: ") << serialPortInfoList.count() << endl;


    foreach (const QSerialPortInfo &serialPortInfo, serialPortInfoList) 
        out << endl
            << QObject::tr("Port: ") << serialPortInfo.portName() << endl
            << QObject::tr("Location: ") << serialPortInfo.systemLocation() << endl
            << QObject::tr("Description: ") << serialPortInfo.description() << endl
            << QObject::tr("Manufacturer: ") << serialPortInfo.manufacturer() << endl
            << QObject::tr("Vendor Identifier: ") << (serialPortInfo.hasVendorIdentifier() ? QByteArray::number(serialPortInfo.vendorIdentifier(), 16) : QByteArray()) << endl
            << QObject::tr("Product Identifier: ") << (serialPortInfo.hasProductIdentifier() ? QByteArray::number(serialPortInfo.productIdentifier(), 16) : QByteArray()) << endl
            << QObject::tr("Busy: ") << (serialPortInfo.isBusy() ? QObject::tr("Yes") : QObject::tr("No")) << endl;
    

    serial.setPortName("COM5");
    serial.open(QIODevice::ReadWrite);
    serial.setBaudRate(QSerialPort::Baud9600);
    serial.setDataBits(QSerialPort::Data8);
    serial.setParity(QSerialPort::NoParity);
    serial.setStopBits(QSerialPort::OneStop);
    serial.setFlowControl(QSerialPort::NoFlowControl);




        if(!serial.isOpen())
        
          std::cout<<"port is not open"<<endl;
          //serial.open(QIODevice::ReadWrite);
        

    if(serial.isWritable()==true)
    
        std::cout<<"port writable..."<<endl;
    



    QByteArray data("R");

    serial.write(data);
    serial.flush();
    std::cout<<"value sent!!! "<<std::endl;
    serial.close();

    return 0;

我的源代码由两部分组成,

1- serialportinfolist .... 工作得很好 2- 打开并写入数据...运行代码时我没有遇到任何问题,并且显示的结果好像没有出错一样!

但是,当我运行此代码时,板上的 LED 不亮。

我用 Arduino 串行监视器对此进行了测试,它可以打开,但无法从 Qt 中打开。

【问题讨论】:

【参考方案1】:

您是否在您的 arduino 代码中等待 cr lf (0x0D 0x0A)?

QByteArray ba;
ba.resize(3);
ba[0] = 0x5c; //'R'
ba[1] = 0x0d;
ba[2] = 0x0a;

或使用

将其附加到您的字符串中
QByteArray data("R\r\n");

或者

QByteArray data("R\n");

【讨论】:

我想是的,这是我的 arduino 代码:int input;国际领导= 13;无效设置()序列.开始(9600); pinMode(LED,输出); Serial.println("开始..."); 无效循环() 输入 = Serial.read(); if (input == 'R') digitalWrite(led, HIGH); //打开LED(HIGH是电压电平)延迟(1000); Serial.println("LED 亮了!"); if (input == 's') digitalWrite(led, LOW); //打开LED(HIGH是电压电平)延迟(1000); Serial.println("LED 熄灭!"); 是不是表示它发送'R',然后连续回车?如果是这样,它没有解决,问题仍然存在 首先,即使它到目前为止有效,您也应该将您的 serial.read 函数放在 if(Serial.available() > 0) 测试中。 尝试发送“R\r\n”或“R\n”到arduino进行测试。 我想你的意思是serial.write,但我没有得到任何available()或isavailable函数??【参考方案2】:

我想我找到了部分解决方案,但仍然不完整。

当我第一次按 debug 时,qt 不会向 Arduino 发送任何信号,但是当我第二次按 debug 时,它的行为符合预期。

那么,必须运行两次才能使其正常工作,这不是很奇怪吗???

如果问题存在其他地方,请告诉我,

任何帮助...

【讨论】:

以上是关于qserialport 不向 arduino 发送字符的主要内容,如果未能解决你的问题,请参考以下文章

将字符串从 QT 发送到 Arduino

从另一个线程向 QSerialPort 发送数据

QSerialPort 正确发送多行

使用 QSerialPort 通过串口发送数据

读写串口 类QSerialPort

QSerialPort::write() - 只有签名值? (最多 127 个十进制数)?我需要发送 0xFF (255 dec)