Tom_Chen 发表于 2018-6-6 21:54:33

QSerialport编写的串口工具 数据接收和发送怎么同时进行?

本帖最后由 Tom_Chen 于 2018-6-6 21:54 编辑

怎么实现串口上位机实时 发送与接收数据?想实现的功能如下:向单片机发送指令(0x7f) ,单片机接收到0x7f后,会返回个应答信号(0x79)。串口工具在发送完0x7f 指令后,就开始等待应答信号的到来,接收到应答信号后   才开始执行接下来的任务。每一小块任务都还要判断是否接收到了应答信号,如中途无应答   即要报错。

我写的工具是单线程 ,我在发送0x7f指令后 便开始判断接收 buff中是否有0x79(函数中使用 QByteArray .contains('y') 判断 是否接收到0x79 。0x79对应ASIIC码‘y’ )。   开始以为自己的逻辑很正确,但运行程序后发现存在很大的问题   :发送指令后 ,单片机也相应返回了ACK信号 ,但是!!! Qserialport::readyRead信号并没有立即触发槽函数Read_Data( )进行串口数据的读取,   还是说槽函数在单线程中,当信号到来时 不能直接的被调用 ,需要等该部分函数执行完后 再进行调用?       信号与槽函数的连接类型采用Qt::DirectConnection直接连接方式 ,看文档的意思是立马调用啊   实际运行时为什么不是这样的 啊



说的有点乱 ,简单来说:我想向下位机发送指令0x7f,等待返回的应答信号0x79   判断是否接收到应答 ,再进行接下来的操作。我现在写的工具,在等待应答信号的时间周期里,未能对串口进行数据的读取也就是信号到来时 槽函数未被调用是不是单线程原因呢?   求大神帮忙解答

笨笨的小孩 发表于 2018-6-7 14:53:57

你的意思是不是串口读取这部分函数无法读取到下位机接收到的数据?
我当初做的一个串口助手,其中串口读取部分的代码是这样的
QByteArray buf;
      buf=serial->readAll();
      if(buf!=NULL)
      {
            QString str =ui->receivetextEdit->toPlainText();
            str+=tr(buf); //累加接受到数据
            ui->receivetextEdit->clear();
            ui->receivetextEdit->append(str);
            ui->receivetextEdit->insertPlainText(" ");
      }
不知对你有帮助没?:lol

Tom_Chen 发表于 2018-6-7 20:46:31

笨笨的小孩 发表于 2018-6-7 14:53
你的意思是不是串口读取这部分函数无法读取到下位机接收到的数据?
我当初做的一个串口助手,其中串口读取 ...

谢谢啊    我可能表述的不够清楚
不是这样的哈   可以单独收下位机发上来的数据。
我现在的问题是上位机在执行一块函数时,下位机发上来的数据并不能马上读

xujin961129 发表于 2018-7-18 22:21:21

兄弟 我也是 你怎么解决的

woodson 发表于 2018-7-24 10:28:44

我也遇到这个问题   从虚拟串口和串口调试助手之类的来看    seria->write()好像不是即时的 虽然能读出数据 但是进行操作是在完成这个函数的时候

星辰hua 发表于 2019-9-10 13:35:51

QT要函数结束才执行,感觉函数里是描述,函数完了再执行你描述的东西;在函数里write都还没发出去,要函数结束才会发出; 所以操控串口好麻烦,写和读是分开的。

li0826hui 发表于 2021-1-2 15:29:37

你判断ACK的应该放到读的里面去,不要放在写的后面,如果要循环判断最好使用定时器或多线程
页: [1]
查看完整版本: QSerialport编写的串口工具 数据接收和发送怎么同时进行?