天嵌 ARM开发社区

 找回密码
 注册
查看: 5387|回复: 11

qt下串口读数据问题,求助版主和各位

[复制链接]
workhard123 发表于 2012-1-8 10:47:38 | 显示全部楼层 |阅读模式
66
本帖最后由 workhard123 于 2012-1-8 11:14 编辑

最近使用qt中串口编程,使用网上的第三方类,接收数据界面是僵死不动的,我想使用线程编程来解决,就是开一个读线程,一直读,
但是想想会有个问题,对于设备操作而言,我们从应用程序中的对串口的读操作只能用read(fd,buf,maxlen);但是这里就会出现问题,
如果用线程一直读的话,就会读到重复的数据,这样的问题是如何解决呢?linux串口编程我看过几个,好像就是直接设置波特率,等待时间和接收最小字节数,还有什么参数提供给线程,指明是新的数据就是开始读,不是新的数据就不能读,有这种机制吗?
简洁表达就是有新数据到达时唤醒线程工作
表达的不知道清楚不清楚?
希望各位帮忙分析下?
最佳答案追加100金币
感谢回复


TQ-lkp 发表于 2012-1-9 20:58:42 | 显示全部楼层
本帖最后由 TQ-lkp 于 2012-1-9 20:59 编辑

到论坛中下载一个天嵌科技提供的QT操作串口的源码吧http://www.armbbs.net/forum.php?mod=viewthread&tid=10449&extra=page%3D1
回复

使用道具 举报

 楼主| workhard123 发表于 2012-1-9 23:17:37 | 显示全部楼层
TQ-lkp 发表于 2012-1-9 20:58
到论坛中下载一个天嵌科技提供的QT操作串口的源码吧http://www.armbbs.net/forum.php?mod=viewthread&tid=1 ...

这个程序我去年就下 我用的是2440,环境是QT4.5,打开有问题

以前我使用网上的串口第三方类,用什么polling机制,开个定时器在那读,
界面上的其他按键没有办法使用,僵死
回复

使用道具 举报

TQ-lkp 发表于 2012-1-10 16:07:13 | 显示全部楼层
我们用的没出现你说的界面卡死的情况,除非你的串口驱动有问题
读到重复的数据,要么是你的驱动有问题,要么是你的应用程序没处理好,不要怀疑串口的机制,一般就是自己的驱动的问题
回复

使用道具 举报

亚瑟王 发表于 2012-1-10 18:32:50 | 显示全部楼层
亲,你先用天嵌科技的测试程序测试一下吧。
回复

使用道具 举报

 楼主| workhard123 发表于 2012-1-10 22:23:43 | 显示全部楼层
谢谢两位版主的回答,我用的驱动就是天嵌公司提供的,我用的环境是qt4.5,打开 TQ-lkp给的测试程序中,按键上的字符都是看不见的,很想测试下,可是不行啊
回复

使用道具 举报

 楼主| workhard123 发表于 2012-1-11 21:14:27 | 显示全部楼层
TQ-lkp 发表于 2012-1-10 16:07
我们用的没出现你说的界面卡死的情况,除非你的串口驱动有问题
读到重复的数据,要么是你的驱动有问题,要 ...

请问版主
您提供这个ComDebugger的测试程序的编程环境是qt多少?
我用qt4.5打开不正常
谢谢回复
回复

使用道具 举报

TQ-lkp 发表于 2012-1-11 22:55:05 | 显示全部楼层
就是4.5的,你要设置下串口,看下源码
回复

使用道具 举报

 楼主| workhard123 发表于 2012-1-12 19:30:56 | 显示全部楼层
TQ-lkp 发表于 2012-1-11 22:55
就是4.5的,你要设置下串口,看下源码

请教版主,如果我开个线程一直读串口的数据,而此时串口的数据一直往上发的,不停的发,我如何才能接收到完整的数据啊
回复

使用道具 举报

TQ-lkp 发表于 2012-1-12 20:14:42 | 显示全部楼层
你自己定个规则,接收到哪个字符或几个字符就认为结束了就行了
回复

使用道具 举报

 楼主| workhard123 发表于 2012-1-13 14:10:00 | 显示全部楼层
TQ-lkp 发表于 2012-1-12 20:14
你自己定个规则,接收到哪个字符或几个字符就认为结束了就行了

我没有用第三方类,直接linux下对串口操作设置
设置VMIN为8,VTIME为0,应为不知道什么时候串口会发送数据上来,所以用了一个线程一直读这个串口,每次读8个字节的数据,在线程中就是将read读出数据的数据地址传递到槽函数中进行接收处理,
这个问题卡了我好久了,版主麻烦您帮忙分析下
  1. void Thread::run()
  2.     {
  3.         
  4.          
  5.            myCom->readPort(buf1,8);
  6.       
  7.            emit this->serialFinish(buf1);


  8.     }
复制代码
现在遇到的现象是一次性发送24个节的数据,接收到的是24个字节,但是会丢掉其中的一些数据,还有一些数据是重复的

丢掉的数据和重复的数据是有规律的
输入串口的数据是: 10 01 02 03 04 05 06 07 10 11 12 13 14 15 16 17 10 21 22 23 24 25 26 27

用tq接收到的数据是10 21 22 23 24 25 26 27 10 21 22 23 24 25 26 27 10 21 22 23 24 25 26 27

分析了许久不知道是什么原因


回复

使用道具 举报

TQ-lkp 发表于 2012-1-13 20:51:42 | 显示全部楼层
本帖最后由 TQ-lkp 于 2012-1-13 20:54 编辑

你这个程序有一堆的问题
读出的数据没有没有判断读出了多少,还会重复发送上次读到的数据,因为你没有清空上次的数据
问题多多,你还是参考我们提供的程序吧

你直接在线程中打印数据看是否正确吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-29 02:46 , Processed in 1.046875 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表