查看完整版本: [-- 【求教->已解决】串口收到的数据如何转为十六进制数(请看7L) --]

QTCN开发网 -> Qt基础编程 -> 【求教->已解决】串口收到的数据如何转为十六进制数(请看7L) [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

davis45 2010-08-10 10:37

【求教->已解决】串口收到的数据如何转为十六进制数(请看7L)

接收数据:
if(MyCom_5->bytesAvailable()>8) //串口缓冲区大于8位再读取
{
     QByteArray temp = MyCom_5->readAll();
     qDebug() << "read: "<<MyCom_5->bytesAvailable()<<"bytes";
     QTextStream textStrem(temp,QIODevice::ReadOnly);
     QString insertString = textStrem.readAll();
      textBrowser->insertPlainText(insertString+" ");
}
我使用串口调试工具打开串口COM1,使用它发送数据,发送ASCII码,然后用自己写的程序打开COM5收数据,可是收到的时候总是显示以下乱码,其中第一个数据都是对的,程序每次都先读取第一个数据,后面的就都读取到乱码,不知道这是为什么
1LΒ5摙6M ?LΒ5摙6 M?LΒ5摙 6M?LΒ5? ?M?LΒ5 摙6M?LΒ 5摙6M?L? ?摙6M?L Β5摙6M? LΒ5摙6M? 1LΒ5摙6M ?Β1Β1Β 1Β1Β1Β a鯽鯽鯽鯽(这里就是a开头的一串数据)

发送数据:
QString tempString = dataEdit->text();//将输入的文本变为QString
bool ok;
int tempInt_16 = tempString.toInt(&ok,16);//再将QString变为十六进制数字
QByteArray tempByte = QString(tempInt_16).toAscii();//再将十六进制数强制转为QString,再转为ASCII码
if(ok)
    MyCom_5->write(tempByte);
发送数据是对的,串口调试工具都能够接收到正确的数据

davis45 2010-08-10 11:36
ASCII码的接收已经正常了,原来是我写ComboBox的时候写错了

现在接收十六进制的数有问题,收到的为QByteArray类型,可是内容不正确,正在调,希望能够调出来吧

davis45 2010-08-10 13:25
请问怎么样将串口收到的字节一个一个的读出来啊?
用QDataStream读取?
    QDataStream out(MyCom_5);

    while(!out.atEnd())
    {
        quint8 tmp = 0;
        out<<tmp;
        textBrowser->insertPlainText(QString("%1 ").arg(tmp));
    }
    textBrowser->insertPlainText(QString("%1 ").arg(tempInt));
试了四五个小时了,实在不知道怎么解决……

最终问题转化为,如何将ASCII码转为16进制数?

davis45 2010-08-10 15:47
各位大虾,串口发的是十六进制数,如果我用
      QByteArray temp = MyCom_5->readAll();
那么读取出来的必定是乱码,有什么方法能够将十六进制的数读取并显示出来呢?

dbzhang800 2010-08-10 17:01
引用第3楼davis45于2010-08-10 15:47发表的 各位高手、大虾,教教俺吧 :
各位大虾,串口发的是十六进制数,如果我用
      QByteArray temp = MyCom_5->readAll();
那么读取出来的必定是乱码,有什么方法能够将十六进制的数读取并显示出来呢?

多看manual

QByteArray QByteArray::toHex () const


davis45 2010-08-10 17:12
引用第4楼dbzhang800于2010-08-10 17:01发表的 Re:各位高手、大虾,教教俺吧 :
多看manual
QByteArray QByteArray::toHex () const

.......

楼上的大虾,我在坛子里看到过这个函数,可是QT4.2.2中没有这个函数,请问有其他方法吗?
http://www.qtcn.org/bbs/read.php?tid=27826&keyword=%CA%AE%C1%F9%BD%F8%D6%C6

dbzhang800 2010-08-10 18:27
引用第5楼davis45于2010-08-10 17:12发表的 Re:Re:各位高手、大虾,教教俺吧 :
楼上的大虾,我在坛子里看到过这个函数,可是QT4.2.2中没有这个函数,请问有其他方法吗?
http://www.qtcn.org/bbs/read.php?tid=27826&keyword=%CA%AE%C1%F9%BD%F8%D6%C6


那就一个字符一个字符的转呗,用个循环就够了,也很简单

davis45 2010-08-11 08:36
读取数据(贴出代码,方便他人):
qDebug() << "read: "<<MyCom_5->bytesAvailable()<<"bytes";

QByteArray temp = MyCom_5->readAll();

QDataStream out(&temp,QIODevice::ReadWrite);//用QDataStream将字节数组读入
while(!out.atEnd())
{
    qint8 outChar = 0;
    out>>outChar;//每一字节填充一次,直到结束
    QString str = QString("%1 ").arg(outChar&0xFF, 2, 16, QLatin1Char('0'));//在这里转十六进制数
    textBrowser->insertPlainText(str);
}
谢谢作答的dbzhang800大虾

koenlee93 2019-07-23 19:53
标记学习















yunchao630 2019-07-24 16:37
学一下 std::string 吧


查看完整版本: [-- 【求教->已解决】串口收到的数据如何转为十六进制数(请看7L) --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled