关于Linux下用QT写的串口通讯的问题

    处女贴,勿见笑哈!

    最近在用串口通讯传一些数据,使用的系统是Linux Ubuntu12.04,开发环境是QT4,遇到串口无法通讯,虽然程序没报错,但是就感觉通讯不上,串口的数据总是传不上来,检查了线有没有问题,下位机那边有没有问题,都试过了都无法解决,在网上也找了好久,最后是在u013782830这位朋友的”Linux下的Qt程序里打不开串口???怎么回事的帖子里找到了答案,发现就是权限的问题,串口的通讯需要root权限,以下是我的总结。

    之前在网上也找了好多关于QT使用串口通讯的程序,我这里用的就是第三方类,其实也可以不用,这里为了方便就用了posix_qextserialport.h、posix_qextserialport.cpp、qextserialbase.h、qextserialbase.cpp,这些网上好多资源的。

串口通讯基本的流程就是:

    1、定义串口对象:Posix_QextSerialPort *yourCom;

    2、分配内存并初始化串口名、串口参数和工作模式:

    串口参数:波特率(BAUD9600)、数据位(DATA_8)、奇偶校验位(PAR_NONE)、停止位(STOP_1)、流模式(FLOW_OFF)、延迟时间(0);

     struct PortSettings myComSetting = {BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,0};

    yourCom= new Posix_QextSerialPort("/dev/ttyS0",yourComSetting,QextSerialBase::Polling);

这里延迟时间设置为0,主要是因为Linux下只能使用轮询模式,所以延迟触发时间可以设置为0 ;需要注意的是串口名称需要带上/dev/,单单是“ttyS0”的话是无法访问的,具体什么情况我还不是很了解。

    3、打开串口:yourCom->open(QIODevice::ReadWrite);

    4、读数据写数据:由于是轮询模式,所以这里使用定时器周期性的触发去读取串口数据;

#include   //别忘了加    

QTimer *readTimer;

readTimer = new QTimer(this);   readTimer->start(50);   connect(readTimer,SIGNAL(timeout()),this,SLOT(readYourCom()));

void MainWindow::readYourCom() //读串口函数
{
    QByteArray temp = yourCom->readAll();//读取串口缓冲区的所有数据给临时变量temp
    ui->RecieveDatatextEdit->insertPlainText(temp);//将串口的数据显示在窗口中
}

5、关闭串口:yourCom->close();

   以上是具体的流程。

  根据这个流程进行调试发现,串口发出来的东西根本传不过来,串口根本就没有连接上,在windows下用串口工具comdebug检查了发现下位机的串口通讯上是没问题的,串口RS232的线也没有问题,那就是我这边程序或者串口有问题了,由于我的Linux没能上网,而且没有自带的串口工具,于是在别的电脑下载了串口工具minicom,安装配置完,测试发现串口没问题,能够通讯上,能够收到数据。这会儿就去找是不是程序的问题,但是试过很多次发现没有办法了,最后在网上看到提到root权限的问题,我想了想在使用minicom的时候都需要我有root权限,我在想串口是否需要root权限才能使用,我是User账户登录的直接从QT执行程序肯定没有root权限,搞了半天想是不是把可执行文件弄成有root权限,我太天真了没办法操作,于是在终端sudo./程序名,来执行就没问题了可以接受数据了,这里要注意串口名一定要是”/dev/ttyS0“,而不能是”ttyS0“。

        至此我的问题解决了,也希望帮到有需要的朋友。不过有一点不方便的是以后我得用root账户登录了,这样其实蛮麻烦的,有没有朋友有什么办法可以解决在User用户下解决程序使用root权限的问题,我是希望在QT上ctrl+R能够直接运行。有的话给我留言哦!!!

你可能感兴趣的:(QT)