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

QT串口通讯

11
回复
12492
查看
[复制链接]
累计签到:1 天
连续签到:1 天
来源: 2013-7-20 09:04:26 显示全部楼层 |阅读模式
1Qter豆
各位大虾好,我是QT初学者,最近在弄QT串口通讯遇到点问题,希望大家不吝赐教!
void MainWindow:n_sendMsgBtn_clicked()
{
    myCom->write(ui->sendMsgLineEdit->text().toAscii());
    //以ASCII码形式将行编辑框中的数据写入串口
    ui->textBrowser->append(tr("发送:")+ui->sendMsgLineEdit->text());
    ui->statusBar->showMessage(tr("发送数据成功"));
}
这里是将数据以ASCII码形式写入串口,我需要将数据以16进制形式写入串口,请问怎么实现??
我自己这样改还是不行
myCom->write(ui->sendMsgLineEdit->text().toAscii().toHex());
void Widget::readMyCom() //读取串口数据并显示出来
{
    if(myCom->bytesAvailable() >=37 )
    //如果可用数据大于或等于37字节再读取
    {
    qDebug() << "read: "<<myCom->bytesAvailable()<<"bytes";//我们输出每次获得的字节数
    QByteArray temp = myCom->readAll();
    //读取串口缓冲区的所有数据给临时变量temp
   // ui->textBrowser->insertPlainText(temp);
    //将串口的数据显示在窗口的文本浏览器中
     ui->textBrowser->append(tr("")+temp.toHex());
    }
}
这些数据读过来了,也能十六进制显示了,我怎么把这些字节一个个拆分下来,然后拿来使用?比如,我在界面上要设计几个显示框,显示数据,每2个字节组合为一个显示的数据,请问这个功能怎么来做?
应该就是我怎么把 变量temp 里的数据解析出来使用
比如:temp数据是 :16#11 22,我们怎么把这串数据解析出来,存放在UISUT[2]的一个数组里 分别 USINT[0]= 16#11 , USINT[1]= 16#22

最佳答案

查看完整内容

可以看下最新的串口助手的代码:http://www.qter.org/?page_id=203
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2013-7-20 09:04:27 显示全部楼层
可以看下最新的串口助手的代码:http://www.qter.org/?page_id=203
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2013-7-21 08:40:20 显示全部楼层
yafeilinux 发表于 2013-7-20 11:05
可以看下最新的串口助手的代码:http://www.qter.org/?page_id=203

谢谢答复,我看了这个代码后,问题解决一半了,请问剩下的怎么解决呢?哪里有代码学习吗?
void Widget::readMyCom() //读取串口数据并显示出来
{
    if(myCom->bytesAvailable() >=37 )
    //如果可用数据大于或等于37字节再读取
    {
    qDebug() << "read: "<<myCom->bytesAvailable()<<"bytes";//我们输出每次获得的字节数
    QByteArray temp = myCom->readAll();
    //读取串口缓冲区的所有数据给临时变量temp
   // ui->textBrowser->insertPlainText(temp);
    //将串口的数据显示在窗口的文本浏览器中
     ui->textBrowser->append(tr("")+temp.toHex());
    }
}
这些数据读过来了,也能十六进制显示了,我怎么把这些字节一个个拆分下来,然后拿来使用?比如,我在界面上要设计几个显示框,显示数据,每2个字节组合为一个显示的数据,请问这个功能怎么来做?
应该就是我怎么把 变量temp 里的数据解析出来使用
比如:temp数据是 :16#11 22,我们怎么把这串数据解析出来,存放在UISUT[2]的一个数组里 分别 USINT[0]= 16#11 , USINT[1]= 16#22 。
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2013-7-21 10:52:22 显示全部楼层
kendozhou 发表于 2013-7-21 08:40
谢谢答复,我看了这个代码后,问题解决一半了,请问剩下的怎么解决呢?哪里有代码学习吗?
void Widget:: ...

QByteArray就是一个字节数组,里面就是分字节存放的。

可以去Qt帮助里面查看下QByteArray的介绍,上面介绍很详细的。
回复

使用道具 举报

累计签到:29 天
连续签到:1 天
2013-7-22 11:55:27 显示全部楼层
可不可以这样做呢? 就是从串口读上来什么就显示什么显示的时候只不过是
十六进制还是字符显示输出的问题吧,我也想看看串口的读写代码,谢谢
yafeilinux 老师的资料。
回复

使用道具 举报

尚未签到

2013-7-23 08:39:12 显示全部楼层
windows xp 下能找到虚拟串口工具。可以把两个串口给连起来,从一个串口中发送,另一个串口中可以接受。然后开个串口调试工具,就可以接收发送出去的是什么了。在win7和win8下没找到类似的工具,谁有给分享一个
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2013-7-24 09:30:46 显示全部楼层
void Widget::readMyCom() //读取串口数据并显示出来
{
    QByteArray temp = myCom->readAll();
     ui->textBrowser->append(tr("")+temp.toHex());
}
研究了几天,还是没弄明白,怎么把串口接收的这一组数据拆分并在界面上显示出来。。。
我在界面上设了几个label
QByteArray temp = myCom->readAll();
temp.resize(5);
int stemp;
stemp = temp[0];
ui->label->setText(stemp);

我是想这么弄的,可还是还行。。
yafeilinux老师,请指教!  有这方面的资料可以提供参考下吗?
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2013-7-24 17:10:38 显示全部楼层
kendozhou 发表于 2013-7-24 09:30
void Widget::readMyCom() //读取串口数据并显示出来
{
    QByteArray temp = myCom->readAll();

QByteArray temp = myCom->readAll();
temp.resize(5);
ushort stemp;
stemp = ushort (temp[0]);
ui->label->setText(QString::number(stemp,10));

我这样做可以显示数据了,但是串口读过来数据超过0X80就出问题,0X80应该要显示128的,可显示-127
回复

使用道具 举报

累计签到:181 天
连续签到:1 天
2013-7-24 17:34:33 显示全部楼层
你要显示的数据范围是多少?串口发送过来的数据格式又是什么样的?
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2013-7-24 22:02:44 显示全部楼层
串口接收的是数据我用以下方法读取和显示就是一组十六进制数据:
QByteArray temp = myCom->readAll();
  ui->textBrowser->append(tr("")+temp.toHex());
然后我是要对这些数据分别进行处理。。
要显示的有short 、 unsigned short 、usigned long 和 unsigned char  四种!
回复

使用道具 举报

累计签到:181 天
连续签到:1 天
2013-7-25 09:06:40 显示全部楼层
Byte是一字节的。short, unsigned shrot大概是两字节的,usigned long是四字节的,char也是一字节的数据,你需要把bytearray里的数据重新组合,或者进行强制指针转换。才能正确显示。
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2016-5-10 10:42:36 显示全部楼层
感谢yafeilinux给的链接 http://www.qter.org/?page_id=203
回复

使用道具 举报

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

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