• 10272阅读
  • 11回复

[提问]一个QT串口通信程序,发送数据出了点问题 [复制链接]

上一主题 下一主题
离线kevincox
 

只看楼主 倒序阅读 楼主  发表于: 2013-10-28



环境:虚拟机VMware9+ubuntu12.04+qt 4.7.2+qt creator-2.1.0;串口使用USB转串口线,设备号为/dev/ttyUSB0


根据yafeilinux《Qt串口通信专题教程》编写代码,在windows上运行没问题,然后修改成为linux下运行的程序,可以编译通过运行,但是在qt软件的“应用程序输出”栏里出现了这样一个问题:


Trying to open File
Could not open File! Error code : 5


看样子应该是串口没有打开。因为发送接收端的LED数据灯都没有任何闪烁。为了证明串口是好的,我使用minicom,配置相同的波特率设备号等设置后,与外部串口设备进行通信,发现发送接收都完好,而且发送接收端的LED灯都会闪。看来真的是qt程序里串口没有打开啊!


然后我根据网上的经验,将设备号由"/dev/ttyUSB0"修改为"ttyUSB0",也就是不加路径,这时候的提示出现:

Trying to open File
Opened File succesfully

这种情况下看到可以成功打开了串口,但是我点发送数据之后仍然没法发送数据,发送数据端口的LED灯没有闪烁。


这个问题在网上看到很多类似的情况,感觉没有一个很好的总结性回答,不知道之前碰到这个问题的前辈们后来是怎样解决的呢?


离线dbzhang800

只看该作者 1楼 发表于: 2013-10-28
不清楚你用的是那个版本的QextSerialPort,如果不是最新版本,不妨试试 1.2RC 版本 https://code.google.com/p/qextserialport/

另外:你也可以试试QtSerialPort,不过它似乎只支持 Qt4.8 及后续版本
离线kevincox

只看该作者 2楼 发表于: 2013-10-28
回 1楼(dbzhang800) 的帖子
我现在使用的是qextserialport-1.2win-alpha,这个感觉跟1.2RC没有什么区别吧?
离线dbzhang800

只看该作者 3楼 发表于: 2013-10-28
一个2007年的,一个是2012年的,时间上相差了5年。另外,代码结构上改动也很大。
离线kevincox

只看该作者 4楼 发表于: 2013-10-28
具体在widget.cpp里的程序是这样的:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    myCom = new Posix_QextSerialPort("ttyUSB0",QextSerialBase::Polling);
    myCom->open(QIODevice::ReadWrite);
    myCom->setBaudRate(BAUD9600);
    myCom->setDataBits(DATA_8);
    myCom->setParity(PAR_NONE);
    myCom->setStopBits(STOP_1);
    myCom->setFlowControl(FLOW_OFF);
    myCom->setTimeout(10);
    readTimer=new QTimer(this);
    readTimer->start(100);
    connect(readTimer,SIGNAL(timeout()),this,SLOT(readMyCom()));

    /*
    struct PortSettings myComsetting={BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};
    myCom=new Win_QextSerialPort("COM2",myComsetting,QextSerialBase::EventDriven);
    myCom->open(QIODevice::ReadWrite);
    connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));
    */

}

void Widget::readMyCom()
{
    QByteArray temp =myCom->readAll();
    ui->textBrowser->insertPlainText(temp);
}

void Widget::on_pushButton_clicked()
{
    myCom->write(ui->lineEdit->text().toAscii());
    myCom->write("\r");
}

Widget::~Widget()
{
    delete ui;
}
离线dbzhang800

只看该作者 5楼 发表于: 2013-10-28
据我所知,在Qesp1.2beta2 之前,"ttyUSB0" 是不被接受的,你只能使用完整的文件路径 "/dev/XXXXX"
离线dbzhang800

只看该作者 6楼 发表于: 2013-10-28
另外,我一直不太清楚为什么很多人在代码中使用 Posix_QextSerialPort / Win_QextSerialPort 而不是直接用跨平台的 QextSerialPort 写法
离线kevincox

只看该作者 7楼 发表于: 2013-10-28
回 6楼(dbzhang800) 的帖子
好,那我尝试一下1.2rc。
在1.2RC里面是不是所有文件都要用到呢?
qextserialenumerator.cpp这个文件需要吗?
离线dbzhang800

只看该作者 8楼 发表于: 2013-10-28
不是必须的,但如果你按照Manual操作,可能会比你从中提取部分文件来使用更方便

https://code.google.com/p/qextserialport/wiki/QextSerialPort_1_2_RC
离线kevincox

只看该作者 9楼 发表于: 2013-10-28
回 8楼(dbzhang800) 的帖子
感觉这个man写的有点含糊。。。
其实我现在的问题是查不出原因,不知道为什么ttyUSB0已经打开了为什么不能发送数据,同样的程序在windows下跑的好好的
离线dbzhang800

只看该作者 10楼 发表于: 2013-10-28
Windows和Linux底层是完全不同的两套东西,Windows跑的好不能说明问题。对linux来说,你可以调试你的程序,只关注代码中的两点即可。一是 ::open(), 一是 ::write() . 检查一下它们的返回值,看看是否有问题。
离线kevincox

只看该作者 11楼 发表于: 2013-10-28
回 10楼(dbzhang800) 的帖子
好的,我用creator来debug一下
快速回复
限100 字节
 
上一个 下一个