找回密码
 立即注册
收起左侧

将串口数据转化成字节数组一直出错的问题!

5
回复
3637
查看
[复制链接]

尚未签到

来源: 2014-4-28 11:34:04 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 miling 于 2014-4-28 11:38 编辑

要写一个QT的串口数据处理软件,因为还用到数据帧协议,得把数据转成字节数组,再分析数组的数得到有用数据。但现在收数据成功了,但是转化的字节数组读出来的一直是乱码,用了很多方法,还是 不行。求解救!!~
  1. void MainWindow::readData()
  2. {
  3.     QByteArray temp = serial->readAll();
  4.     QString buf;
  5. char bufInfo[16];
  6.     for(int i = 0; i < temp.count(); i++)
  7.     {
  8.         QString s;
  9.         s.sprintf("%x",(unsigned char)temp.at(i));
  10. bufInfo[i] = temp.at(i);
  11.         buf += s;
  12.     }
  13.     console->insertPlainText(buf);
  14.     QTextCursor conCursor = console->textCursor();
  15.     conCursor.movePosition(QTextCursor::End);
  16.     console->setTextCursor(conCursor);
  17.     ui->statusBar->showMessage(tr("成功读取%1字节数据").arg(temp.count()));
  18.     qDebug() << bufInfo[0];
复制代码
我第一个发的数据是0XA5,在PlainText里面显示的第一个数据也是A5,但是qDebug()读到的 bufInfo[0]就不是了!还用过其它方法,比如char *bufInfo; bufInfo = temp.data(),再 qDebug()  << bufInfo[0]也不是A5,有时甚至是个“{”,还有char i = temp.data()[0];读出的i 也不是A5.还有定义一个QString i; i.sprintf("%x",(unsigned char)temp.at(0)); 结果qDebug() 出来的i居然是A5还有后面连着好几字节的数据。都不知道是什么情况! 希望谁能帮我看看!谢谢拉~
回复

使用道具 举报

尚未签到

2014-4-28 11:55:37 显示全部楼层
我以前也遇到过,其实bufInfo[0]就是0xa5,只是他打印出来的是ascii码,显示的是字符。比如”0x61“他会显示a,如果没有对应的可能是空吧。你把接受的转换成16进制,在显示试试吧。
回复 支持 反对

使用道具 举报

尚未签到

2014-4-28 12:50:03 显示全部楼层
shengdewu 发表于 2014-4-28 11:55
我以前也遇到过,其实bufInfo[0]就是0xa5,只是他打印出来的是ascii码,显示的是字符。比如”0x61“他会显示 ...

哎。。把帧头改为0x31,收到的数也不是1!头疼啊~
回复 支持 反对

使用道具 举报

尚未签到

2014-4-28 14:53:23 显示全部楼层
miling 发表于 2014-4-28 12:50
哎。。把帧头改为0x31,收到的数也不是1!头疼啊~

这个。。。。。
其实你可以试试 if(0x31 == bufinfo[0]) qDebug()<<bufinfo[0];
我以前和你一样的
回复 支持 反对

使用道具 举报

尚未签到

2014-4-28 14:56:59 显示全部楼层
miling 发表于 2014-4-28 12:50
哎。。把帧头改为0x31,收到的数也不是1!头疼啊~

其实 要判断你接受是否正确,你可以直接输出 QByteArray 定义的变量。
回复 支持 反对

使用道具 举报

尚未签到

2014-4-29 12:27:49 显示全部楼层
shengdewu 发表于 2014-4-28 14:56
其实 要判断你接受是否正确,你可以直接输出 QByteArray 定义的变量。

差不多找到原因了,是我太理所当然地认为串口是一次性接收一整帧的数据的。其实不是,一帧的数据被他分几次接收,也就是调用readCom函数好几次。不过我试过一进入接收函数,调用Sleep(5)还有while(serial->waitForReadyRead(5)){temp += serial.readall},还是不能一整帧地接收数据。这个我就搞不懂了。。。
回复 支持 反对

使用道具 举报

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

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了