Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QSerialPort读写不工作_Qt_Arduino - Fatal编程技术网

Qt QSerialPort读写不工作

Qt QSerialPort读写不工作,qt,arduino,Qt,Arduino,当我运行下面的Qt代码以使用Arduino代码连接到ESP32时,我没有得到预期的结果,即QDebug()打印QByteArray com------>\xFF\xFC\xFE\xFC 而是获取com字节数组中的最后一个或第一个值(\xFC或\xFF) 当我调用connect()函数“QIODevice::readyRead不是信号”时,我也收到了一条警告 我做错了什么 Dialog::Dialog(QWidget *parent) :QDialog(parent), ui(

当我运行下面的Qt代码以使用Arduino代码连接到ESP32时,我没有得到预期的结果,即QDebug()打印QByteArray com------>\xFF\xFC\xFE\xFC

而是获取com字节数组中的最后一个或第一个值(\xFC或\xFF)

当我调用connect()函数“QIODevice::readyRead不是信号”时,我也收到了一条警告

我做错了什么

Dialog::Dialog(QWidget *parent)
    :QDialog(parent),
      ui(new Ui::Dialog),
      esp(new QSerialPort(this))

{

ui->setupUi(this);
esp_available = false;

void Dialog::on_connect_clicked()
{
    if(esp_available){
        esp->setPortName(espPortName);
        esp->open(QSerialPort::ReadWrite);
        esp->setBaudRate(500000);
        esp->setDataBits(QSerialPort::Data8);
        esp->setParity(QSerialPort::NoParity);
        esp->setStopBits(QSerialPort::OneStop);
        esp->setFlowControl(QSerialPort::NoFlowControl);

        connect(esp, &QSerialPort::readyRead, this, &Dialog::onDataReady);
        // line above gives warning: QIODevice::readyRead is not a signal

}

void Dialog::on_startStream_clicked()
{
    QByteArray com = QByteArray::fromHex({"ff fc fe fc"});
    if(esp->isOpen()){
        esp->write(com);
    }
}

void Dialog::onDataReady()
{
    QByteArray ba;
    do{
        ba += esp->readAll();
        int i = ba.indexOf('\r');
        if(i != -1){
            QByteArray ba1 = ba.mid(0, i);
            qDebug() << ba1;
            ba.remove(0, i);
        }
    } while(esp->bytesAvailable());
}
Dialog::Dialog(QWidget*parent)
:QDialog(父级),
ui(新ui::对话框),
esp(新QSerialPort(本))
{
用户界面->设置用户界面(此);
esp_可用=错误;
无效对话框::在连接时单击()
{
如果(esp_可用){
esp->setPortName(espPortName);
esp->打开(QSerialPort::读写);
esp->收视率(500000);
esp->setDataBits(QSerialPort::Data8);
esp->setParity(QSerialPort::NoParity);
esp->setStopBits(QSerialPort::OneStop);
esp->setFlowControl(QSerialPort::NoFlowControl);
连接(esp和QSerialPort::readyRead、this和Dialog::onDataReady);
//上面的行给出警告:QIODevice::readyRead不是信号
}
void Dialog::在\u startStream\u clicked()上
{
QByteArray com=QByteArray::fromHex({“ff fc fe fc”});
如果(esp->isOpen()){
esp->write(com);
}
}
void Dialog::onDataReady()
{
QByteArray ba;
做{
ba+=esp->readAll();
int i=ba.indexOf('\r');
如果(i!=-1){
QByteArray ba1=ba.mid(0,i);
qDebug()字节可用();
}
在ESP32上运行的Arduino代码:

bool packet_recevived = false;
const int max_packet_size = 10;
char incoming_packet[max_packet_size];  // the incoming packet size mat vary.
void parse_packet();

void setup() { Serial.begin(500000); }

void loop() {
    if (Serial.available() > 0 && packet_recevived == false) {
        parse_packet();
    } else if (packet_recevived == true) {
        packet_recevived = false;
    }
}

void parse_packet() {
    int in_size = Serial.available();
    for (int i = 0; i <= in_size; i++) {
        incoming_packet[i] = Serial.read();
    }
    Serial.println(incoming_packet);
    packet_recevived = true;
}
bool-packet\u-received=false;
const int max_packet_size=10;
char incoming_packet[max_packet_size];//传入的数据包大小会有所不同。
void parse_packet();
void setup(){Serial.begin(500000);}
void循环(){
if(Serial.available()>0&&packet\u received==false){
解析_包();
}else if(数据包_received==true){
数据包_received=false;
}
}
void parse_数据包(){
int in_size=Serial.available();
对于(int i=0;i canReadLine()){
ba=esp->readLine();

qDebug()问题是我修复的Arduino代码

char incoming_buffer[11];
void process();
void execute(uint8_t com[], int size);
bool received = false;
String command;
bool executed = false;
uint8_t start_stream[] = "\x02\x00\x01\xFE\x01\x00\x01";

void setup() {
    Serial.begin(500000);
    Serial.println();
}

void loop() {
    if (Serial.available() > 0 && received == false) {
        process();
    } else if (executed == true) {
        executed = false;
        received = false;
    }
}
void process() {
    while (Serial.available() > 0) {
        Serial.readBytesUntil('\n', incoming_buffer, 11);
    }
    command = String(incoming_buffer);
    if (command == "start") {
        execute(start_stream, sizeof(start_stream));
        received = true;
    } else {
        Serial.println("no command");
        received = false;
    }
    memset(incoming_buffer, 0, sizeof(incoming_buffer));  // reset the buffer
}

void execute(uint8_t com[], int size) {
    for (int i = 0; i < size - 1; i++) {
        Serial.print(com[i]);
        Serial.print(" ");
    }
    Serial.println();
    executed = true;
}
char传入_缓冲区[11];
无效过程();
无效执行(uint8_t com[],整数大小);
bool接收=假;
字符串命令;
bool executed=false;
uint8\u t开始\u流[]=“\x02\x00\x01\xFE\x01\x00\x01”;
无效设置(){
序列号:开始(500000);
Serial.println();
}
void循环(){
if(Serial.available()>0&&received==false){
过程();
}else if(已执行==true){
已执行=错误;
接收=假;
}
}
无效过程(){
while(Serial.available()>0){
Serial.readBytesUntil('\n',传入的\u缓冲区,11);
}
命令=字符串(传入的\u缓冲区);
如果(命令==“开始”){
执行(启动_流,sizeof(启动_流));
接收=真;
}否则{
Serial.println(“无命令”);
接收=假;
}
memset(传入缓冲区,0,sizeof(传入缓冲区));//重置缓冲区
}
无效执行(uint8_t com[],整数大小){
对于(int i=0;i
move
esp>open(QSerialPort::ReadWrite);
connect(esp,&QSerialPort::readyRead,this,&Dialog::onDataReady);
。在任何通信协议中,首先建立规则,然后开始通信。相反,您打开端口,然后告诉它如何“说话”。完成,但没有解决问题。为什么使用500000作为波特率?例如,典型的是使用115200。将
esp->setBaudRate(500000);
更改为
esp->setBaudRate(QSerialPort::Baud115200);
Serial.begin(500000);
更改为
Serial.begin(115200);
。我正在以每秒250个采样数x 24个通道从一个24位ADC传感器获取大量数据。@Eylanesc请修改我的帖子。降低波特率似乎有效。Qt不支持自定义的500K波特率吗?可能是connect()或readyRead()信号不够快吗?还有其他建议吗?
char incoming_buffer[11];
void process();
void execute(uint8_t com[], int size);
bool received = false;
String command;
bool executed = false;
uint8_t start_stream[] = "\x02\x00\x01\xFE\x01\x00\x01";

void setup() {
    Serial.begin(500000);
    Serial.println();
}

void loop() {
    if (Serial.available() > 0 && received == false) {
        process();
    } else if (executed == true) {
        executed = false;
        received = false;
    }
}
void process() {
    while (Serial.available() > 0) {
        Serial.readBytesUntil('\n', incoming_buffer, 11);
    }
    command = String(incoming_buffer);
    if (command == "start") {
        execute(start_stream, sizeof(start_stream));
        received = true;
    } else {
        Serial.println("no command");
        received = false;
    }
    memset(incoming_buffer, 0, sizeof(incoming_buffer));  // reset the buffer
}

void execute(uint8_t com[], int size) {
    for (int i = 0; i < size - 1; i++) {
        Serial.print(com[i]);
        Serial.print(" ");
    }
    Serial.println();
    executed = true;
}