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