Qt有关串口数据发送和接收的问题

qiubinglin1992 2017-04-24 11:03:11
这是我写的连接串口的命令

void MotorController::connect_serial() // 槽函数,对应的signal是connect_device按钮的click()
{
foreach (const QSerialPortInfo &sinfo, QSerialPortInfo::availablePorts()) {
mcsp->setPort(sinfo); // mcsp是指向QSerialPort类的指针
mcsp->open(QIODevice::ReadWrite);
QByteArray checkDevice;
QString2Hex("02504D50312F313030300D0A", checkDevice); //将字符串转换成十六进制字符组
mcsp->write(checkDevice);
if(check_serial())
break;
}
}

bool MotorController::check_serial() // 检查是否连接到目标设备
{
bool check_link = 0;
QByteArray wished_reply;
QString2Hex("43 09 50 4D 50 31 0D 0A ", wished_reply);
QByteArray readAnswer;
readAnswer = *buf; // buf的定义是:QByteArray *buf = new QByteArray;用来保存从串口接收到的数据
showLinkStatus->setText(readAnswer); // showLinkStatus是一个QLabel,最初状态什么文字都没有
if(readAnswer != wished_reply)
mcsp->close();
else{
check_link = 1;
connect_device->hide();
}
return check_link;
}

void MotorController::read_data() // 这是readyRead()信号连接的slot
{
*buf = mcsp->readAll();
}

运行后发现设备根本接收不到checkDevice命令,showLinkStatus没有任何文本,connect_device没有被隐藏。
接着将check_serial函数的if语句做如下更改

if(readAnswer != wished_reply)
/*mcsp->close()*/;
else{
check_link = 1;
connect_device->hide();
}

再次运行发现设备成功接收到命令(转台转动了),但showLinkStatus没有任何文本,connect_device没有被隐藏。
接着改写代码

QByteArray MotorController::read_data()
{
QByteArray buf1;
buf1 = mcsp->readAll();
return buf1;
}

void MotorController::connect_serial()
{
foreach (const QSerialPortInfo &sinfo, QSerialPortInfo::availablePorts()) {
mcsp->setPort(sinfo);
mcsp->open(QIODevice::ReadWrite);
QByteArray checkDevice;
QString2Hex("02504D50312F313030300D0A", checkDevice);
mcsp->write(checkDevice);
if(check_serial())
break;
}
}

bool MotorController::check_serial()
{
bool check_link = 0;
QByteArray wished_reply;
QString2Hex("43 09 50 4D 50 31 0D 0A ", wished_reply);
QByteArray readAnswer;
readAnswer = read_data();
showLinkStatus->setText(readAnswer);
if(readAnswer != wished_reply)
/*mcsp->close()*/;
else{
check_link = 1;
connect_device->hide();
}
return check_link;
}

运行后发现:按下一次connect_device,转台转动但showLinkStatus没有任何文本,connect_device没有被隐藏;按下第二次发现转台转动,showLinkStatus出现正常文本,connect_device被隐藏。
如果mcsp->close()没被注释掉那么3种代码都无法使转台转动,并且showLinkStatus没有任何文本,connect_device没有被隐藏
请问一下各位出现上述情况的原因是什么,我想要在第一次按下connect_device后就达到转台转动,showLinkStatus出现正常文本,connect_device被隐藏这样的效果改怎么做?
希望各位大神不吝赐教。
...全文
1463 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
King_zkk 2020-01-13
  • 打赏
  • 举报
回复
帖子太久啦,楼主或许已经解决,不过我还是发表下:你这个应该是check时机不对,check的时候readready还未反馈数据。check代码应该移到read_data()槽函数里面执行,加个条件判断就行,下次就不需要继续check,接受正常数据就行。
feiyangqingyun 2017-04-25
  • 打赏
  • 举报
回复
你可以指定一个串口试试,别枚举所有串口发送
qiubinglin1992 2017-04-25
  • 打赏
  • 举报
回复
引用 1 楼 feiyangqingyun 的回复:
你可以指定一个串口试试,别枚举所有串口发送
我使用的和设备连接的线是USB转RS232的连接线,电脑本身识别的串口是这根连接线。我不枚举并检测连接是否正确的话那我一旦换连接线后这个程序就不能用了。 有什么其他的解决方法吗?或者说指点我一下发生问题的原因是什么。

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧