天嵌 ARM开发社区

 找回密码
 注册
查看: 2016|回复: 8

E9的V2,使用Qt打开串口总是失败。

[复制链接]
wangyong5217 发表于 2016-12-20 18:27:32 | 显示全部楼层 |阅读模式
本人,使用E9+linux+Qt5.4.0 ,在使用Qt打开串口,烧写一次程序,打开成功,几次断电后,就总是打开失败。求助!
代码:bool Device::OpenCom()
{
#ifdef APP_X86
    Com3 = new QSerialPort("/dev/ttyUSB0");
#else
    Com3 = new QSerialPort("/dev/ttySAC2");
#endif
    if(Com3->open(QIODevice::ReadWrite))
    {
        Com3->setBaudRate(QSerialPort::Baud9600);//Baud9600
        Com3->setParity(QSerialPort::NoParity);//无奇偶校验
        Com3->setDataBits(QSerialPort::Data8); //数据位
        Com3->setStopBits(QSerialPort::OneStop);//1停止位
        Com3->setFlowControl(QSerialPort::NoFlowControl);//无控制
        Com3->setReadBufferSize(4096);
        //connect(Com3,SIGNAL(readyRead()),this,SLOT(Com3Read()));//连接槽
        QTimer *TimerP=new (QTimer);
        connect(TimerP,SIGNAL(timeout()),this,SLOT(Com3Read()));//连接槽
        TimerP->setInterval(100);
        TimerP->start();
        Delayms(10);
        Com3Dat.clear();
        Delayms(10);
        if(Com3->isWritable())
        {
            Com3->write("com3 is ok !\r\n");
        }
        qDebug()<<"com3 is ok !";
    }
    else
    {
        qDebug()<<"com3 open is error !";
    }
    Delayms(100);
#ifdef APP_X86
    Com4 = new QSerialPort("/dev/ttyUSB0");
#else
    Com4 = new QSerialPort("/dev/ttySAC3");
#endif
    if(Com4->open(QIODevice::ReadWrite))
    {
        Com4->setBaudRate(QSerialPort::Baud9600);//Baud9600
        Com4->setParity(QSerialPort::NoParity);//无奇偶校验
        Com4->setDataBits(QSerialPort::Data8); //数据位
        Com4->setStopBits(QSerialPort::OneStop);//1停止位
        Com4->setFlowControl(QSerialPort::NoFlowControl);//无控制
        Com4->setReadBufferSize(4096);
        //connect(Com4,SIGNAL(readyRead()),this,SLOT(Com4Read()));//连接槽
        QTimer *TimerP=new (QTimer);
        connect(TimerP,SIGNAL(timeout()),this,SLOT(Com4Read()));//连接槽
        TimerP->setInterval(100);
        TimerP->start();
        Delayms(10);
        Com4Dat.clear();
        Delayms(10);
        if(Com4->isWritable())
        {
            Com4->write("com4 is ok !\r\n");
        }
        qDebug()<<"com4 is ok !";
    }
    else
    {
        qDebug()<<"com4 open is error !";
    }
    Delayms(100);
    if(Com3->isOpen() && Com4->isOpen())
    {
        return true;
    }
    else
    {
        return false;
    }
    return true;
}
Jerom 发表于 2016-12-21 10:40:56 | 显示全部楼层
你好 ,有可能是端口被占用,已经被打开
麻烦把open的错误信息打印出来
 楼主| wangyong5217 发表于 2016-12-21 17:55:25 | 显示全部楼层
open 函数没有错误信息返回的,open返回是false;

bool open(OpenMode mode) Q_DECL_OVERRIDE;

不是占用的,开机后,第一次运行程序,就是
qDebug()<<"com3 open is error !";
qDebug()<<"com4 open is error !";
重新烧写一下系统,就可以了,但是断电,再上电几次后,就又出现,打开失败的现象。
Jerom 发表于 2016-12-22 11:33:18 | 显示全部楼层
wangyong5217 发表于 2016-12-21 17:55
open 函数没有错误信息返回的,open返回是false;

bool open(OpenMode mode) Q_DECL_OVERRIDE;

你好 ,不用 qt的呢?用 c语言或者我们系统自带的串口测试程序可以吗?
JK_Huang 发表于 2016-12-26 11:07:56 | 显示全部楼层
自己写的qt程序么?有没有对比过天嵌的例程
 楼主| wangyong5217 发表于 2016-12-26 18:39:46 | 显示全部楼层
你好,用C++的程序可以打开成功,读写,收发,都可以的。
C++程序:

bool Device::OpenComWy()
{
    bool State=true;
    memset(&Com1.Buf[0],0,4096);
    sprintf(Com1.Dev,"/dev/ttySAC2");
     if((Com1.Port=open(Com1.Dev,O_RDWR|O_NOCTTY|O_NDELAY))<0)
     {
        printf("open com1 error !\r\n");
        State=false;
     }
     else
     {
         tcgetattr(Com1.Port,&Com1.oldtio);
         setTermios(&Com1.newtio,B9600);
         tcflush(Com1.Port,TCIFLUSH);
         tcsetattr(Com1.Port,TCSANOW,&Com1.newtio);
         printf("open com1 ok !\r\n");
     }

     memset(&Com2.Buf[0],0,4096);
     sprintf(Com2.Dev,"/dev/ttySAC3");
      if((Com2.Port=open(Com2.Dev,O_RDWR|O_NOCTTY|O_NDELAY))<0)
      {
         printf("open com2 error !\r\n");
         State=false;
      }
      else
      {
          tcgetattr(Com2.Port,&Com2.oldtio);
          setTermios(&Com2.newtio,B9600);
          tcflush(Com2.Port,TCIFLUSH);
          tcsetattr(Com2.Port,TCSANOW,&Com2.newtio);
          printf("open com2 ok !\r\n");
      }
      return State;
}
 楼主| wangyong5217 发表于 2016-12-26 18:50:02 | 显示全部楼层
现在,又发现一个问题,E9 的 RTC 时间不保存。
执行命令
[ date  -s "2015-5-8 19:48:00" ]
[ hwclock -w ]
但是断电,重新开机后,时间还是1970年。
Jerom 发表于 2016-12-27 09:19:12 | 显示全部楼层
wangyong5217 发表于 2016-12-26 18:50
现在,又发现一个问题,E9 的 RTC 时间不保存。
执行命令
[ date  -s "2015-5-8 19:48:00" ]

电池 电量有 检测过 吗 ?
 楼主| wangyong5217 发表于 2017-1-31 11:54:16 | 显示全部楼层
电池电量检测过,没问题的,刚换的新电池。
请教。。。。。?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-26 07:28 , Processed in 1.062500 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表