• 5822阅读
  • 11回复

将单的问题,谁帮忙解决一下,有点急 [复制链接]

上一主题 下一主题
离线hyh0lh
 

只看楼主 倒序阅读 楼主  发表于: 2014-04-04
我用串口传过来一部分数据,应该是一个字节一个字节的接收过来,结果发现有时候会一次过来2个字节。我用QByteArray来放置这些数据,然后压入QSting的容器,起到保存和计数的目的。但现在2个字节一起来的话就导致压入容器的过程错误,计数失败,使用数据就出现了问题。我测试了一下,发现QByteArray的size()能分辨出接收到的数据为2个,但我无法将这两个数据分开,分别压入到QString容器里。谁能帮我解决一下。
注意:传过来的数据是16进制数,比方说55aa(这是两个数),所以转换压入QSting容器内的时候也要16进制格式或者转换成对应的10进制数也成。
离线realfan

只看该作者 1楼 发表于: 2014-04-04
串口一次读进来的数据,几个字节都有可能。
每次读到QByteArray中,然后循环转换一下。存入QString。但有可能有些是不可显示字符。
这个有什么问题吗?
离线hyh0lh

只看该作者 2楼 发表于: 2014-04-04
就是存入QString这个步骤出现了问题,要求将QByteArray里的内容分割开单独的字节,然后再以QString的形似压入容器。但现在是整体直接压入到容器里了。比方说来了“55AA”,在QByteArray里显示是2个项,但直接转换成QSting压入QString容器则成了一个项,这就导致计数错误。我的问题就是如何将其分割转换,然后压入。谢谢帮忙啊
离线realfan

只看该作者 3楼 发表于: 2014-04-04
回 hyh0lh 的帖子
hyh0lh:
就是存入QString这个步骤出现了问题,要求将QByteArray里的内容分割开单独的字节,然后再以QString的形似压入容器。但现在是整体直接压入到容器里了。比方说来了“55AA”,在QByteArray里显示是2个项,但直接转换成QSting压入QString容器则成了一个项,这就导致计数错误。我的问题就是如何将其分割转换,然后压入。谢谢帮忙啊

    QByteArray byarr;
    QString str;
    ......
    for(int i = 0; i < byarr.size(); ++i)
    {
        str.push_back(byarr.at(i));
    }
离线hyh0lh

只看该作者 4楼 发表于: 2014-04-04
这样是不行的。我测试了,说是不能完成QByteRef和char之间的转换。
其实问题就是怎么把const char转换为QString。就是说如何完成“QString i(buf.at(i))”这个过程。
离线hyh0lh

只看该作者 5楼 发表于: 2014-04-04
解决了。我给搞晕了,不是转QString而是应该转QByteArray。将类型搞错了,难怪过不了。问题其实是一个有2个项的QByteArray分成2个有单独项的QByteArray。我用了如下的代码搞定了,谁有更好的方法给介绍下。上代码:
QVector<QByteArray>serialAck;
QByteArray buf = serialCom->readAll();
for(int i=0; i<buf.size(); i++){
   serialAck.append(QByteArray(QString(buf.at(i)).toLantin1());
   DisplayInfo(serialAck.last().toHex());
}
最后鄙视自己一下
离线dbzhang800

只看该作者 6楼 发表于: 2014-04-04
这个代码 QByteArray(QString(buf.at(i)).toLantin1() 你真需要好好改进一下,哪怕是 buf.mid(i, 1) 也行啊

不过用QByteArray来保存单个char字符,用QVector<QByteArray>来保存char字节串,说明设计本身就有问题
1条评分金钱+10
hyh0lh 金钱 +10 多谢指教 2014-04-08
离线彩阳

只看该作者 7楼 发表于: 2014-04-04
是啊,QByteArray又转QString又转回来了。
上海Qt开发联盟,热忱地欢迎你的加入!
离线realfan

只看该作者 8楼 发表于: 2014-04-04
严格说QByteArray转成QString,有时会有问题的。
如果某个字节是0,那QString就会断掉。
其实你直接保存ByteArray就好了,需要显示16进制,直接转。没必要转QString
1条评分金钱+10
hyh0lh 金钱 +10 多谢指教 2014-04-08
离线hyh0lh

只看该作者 9楼 发表于: 2014-04-08
回 dbzhang800 的帖子
dbzhang800:这个代码 QByteArray(QString(buf.at(i)).toLantin1() 你真需要好好改进一下,哪怕是 buf.mid(i, 1) 也行啊
不过用QByteArray来保存单个char字符,用QVector<QByteArray>来保存char字节串,说明设计本身就有问题 (2014-04-04 14:54) 

嘿嘿,我对上位机软件和qt都不怎么熟悉,现在就属于边工作边摸索的地步。我就拿QVector当计数器来用了。
离线hyh0lh

只看该作者 10楼 发表于: 2014-04-08
回 realfan 的帖子
realfan:严格说QByteArray转成QString,有时会有问题的。
如果某个字节是0,那QString就会断掉。
其实你直接保存ByteArray就好了,需要显示16进制,直接转。没必要转QString (2014-04-04 19:52)

你说的这个断掉的问题我应该是遇到了,所以我在代码里加了一句,只有当buf.zise()大于2时才这么处理,否则程序容易挂掉。我还在纳闷为什么呢。呵呵。其实我主要的目的是将可能接受到QByteArray进行分割,因为有时候接收到的QByteArray是2个项,并不想预想的那样是单项。分割开就好计数,也好知道什么时候字节接收完毕。毕竟字串长不是固定的。而如果发来的字串长度字节也和后面的字节合在一起,程序就出问题了。
离线hyh0lh

只看该作者 11楼 发表于: 2014-04-08
多谢指教
快速回复
限100 字节
 
上一个 下一个