• 7192阅读
  • 9回复

[提问]关于windows下串口问题 [复制链接]

上一主题 下一主题
离线alading514
 

只看楼主 倒序阅读 楼主  发表于: 2011-06-28
关键词: 求助
是这样的,我需要做一个串口发送接收软件,并对接收到的16进制数据进行处理。
我使用的第三方qextserialport类,实现了发送和接收数据功能。
问题出现了,参考资料上的接收函数是:
QByteArray temp = myCom->readAll();
//读取串口缓冲区的所有数据给临时变量temp
ui->textBrowser->insertPlainText(temp);
//将串口的数据显示窗口文本浏览器中

我使用的接收函数是
read_mycom()
{
    char tmp[5];
    int len;

    len = myCom->read(tmp,5);

    qDebug("len = %d",len);  //调试使用
    qDebug("%d",tmp[0]);
    qDebug("%d",tmp[1]);
    qDebug("%d",tmp[2]);
    qDebug("%d",tmp[3]);
    qDebug("%d",tmp[4]);

    。。。。数据处理
}

然后我用串口软件对其发送5个字节ABCDE
问题出现了,QT应用程序输出框输出
len = 5
65
66
67
68
69
len = 0
65
66
67
68
69
只发送了一遍数据,但是却出现两次接收,而且第二次长度数据不对,字节数据是对的,我不明白为什么会接收两遍


离线hesternal

只看该作者 1楼 发表于: 2011-06-28
你的read_mycom为什么调用两次,第二次显然没有从串口中读到数。至于输出的tmp,你的tmp没有赋初值,可能正巧分配到了前一次的地址,所以有看似正确的结果。
离线alading514

只看该作者 2楼 发表于: 2011-06-28
补充,接收是一个槽函数,通过
connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));
//我们关联信号readyRead(),和自己写的槽函数readMyCom(),当串口有数据传来时进行读串口操作。
离线shiroki

只看该作者 3楼 发表于: 2011-06-28
len =0 就说明没有数据读出来拉。 这个readyread信号是否收到和底层的实现是有关系的,  从你的情况看是没数据也收到这个信号。 我觉得没关系, 因为得到的len是0, 这种情况直接忽略就好了。
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线morriszy

只看该作者 4楼 发表于: 2011-06-28
应该用:
myCom->readData( );
VS2010+Qt4.7.0
离线alading514

只看该作者 5楼 发表于: 2011-06-29
引用第3楼shiroki于2011-06-28 20:30发表的  :
len =0 就说明没有数据读出来拉。 这个readyread信号是否收到和底层的实现是有关系的,  从你的情况看是没数据也收到这个信号。 我觉得没关系, 因为得到的len是0, 这种情况直接忽略就好了。

这个没有办法忽略,第二次的数据会替换掉第一次的正确数据,而且我觉得第二次读取数据肯定是有问题的,不知道程序长了会不会有影响。
离线alading514

只看该作者 6楼 发表于: 2011-06-29
回 4楼(morriszy) 的帖子
使用myCom->readData( );
提示错误:‘virtual qint64 QIODevice::readData(char *,qint64)' is protected            qiodevice.h   155
within this context                                                                                                                mycom.cpp   43
离线dbzhang800

只看该作者 7楼 发表于: 2011-06-29
引用第5楼alading514于2011-06-29 08:41发表的  :
这个没有办法忽略,第二次的数据会替换掉第一次的正确数据,而且我觉得第二次读取数据肯定是有问题的,不知道程序长了会不会有影响。

不能读之前先判断有没有数据么?

qint64 QIODevice::bytesAvailable ()

离线morriszy

只看该作者 8楼 发表于: 2011-07-01
回 6楼(alading514) 的帖子
回 4楼(morriszy) 的帖子
使用myCom->readData( );
提示错误:‘virtual qint64 QIODevice::readData(char *,qint64)' is protected            qiodevice.h   155
within this context      

改成Public
我就是这样用的,一点问题也没有哦
VS2010+Qt4.7.0
离线fcymk2

只看该作者 9楼 发表于: 2011-07-12
len <= 0的时候,直接return就好了,反正都没数据要收
快速回复
限100 字节
 
上一个 下一个