免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2020 | 回复: 0
打印 上一主题 下一主题

arm板串口每次只能读取8个字符 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-21 22:32 |只看该作者 |倒序浏览
我在开发板TQ2440运行QT编写的串口程序,但是每次只能接收到8个字符,有时还会少于8个字符。数据发送端是每隔1S发送一次。
以下是串口的设置函数与串口的读取函数。


bool SerialDialog::SetSerialAttr(int m_serial,int baudrate,int databits,int parity,int stopbits,int flowcontrol)
{
    //get serial attribute
    struct termios options;
    if  ( tcgetattr( m_serial,&options)  !=  0)
    {
        //#ifdef DEBUG
        //qDebug("Get serial attribute error");
        //#endif
        return false;
    }
    //set baud rate
    int i;
    for ( i= 0;  i < sizeof(speedArr) / sizeof(int);  i++)
    {
        if  (baudrate == nameArr)
        {
            //tcflush(m_serial, TCIOFLUSH);
            cfsetispeed(&options, speedArr);
            cfsetospeed(&options, speedArr);
            break;
        }
    }

    //set databits
    switch (databits)
    {
        case 7:
            options.c_cflag |= CS7;
            break;
        case 8:
            options.c_cflag |= CS8;
            break;
        default:
            #ifdef DEBUG
            qDebug("Unsupported data size,%d",databits);
            #endif
            return false;
    }

    //set parity
    switch (parity)
    {
        case 0: //none
            options.c_cflag &= ~PARENB;   
            options.c_iflag &= ~INPCK;   
            break;
        case 1: //odd
            options.c_cflag |= (PARODD | PARENB);
            options.c_iflag |= INPCK;            
            break;
        case 2: //even
            options.c_cflag |= PARENB;     
            options.c_cflag &= ~PARODD;  
            options.c_iflag |= INPCK;      
            break;
        case 3: //
            options.c_cflag &= ~PARENB;
            options.c_cflag &= ~CSTOPB;
            break;
        default:
            #ifdef DEBUG
            qDebug("Unsupported parity %d",parity);
            #endif
            return false;
    }

    //set stopbits
    switch (stopbits)
    {
        case 1:
            options.c_cflag &= ~CSTOPB;
            break;
        case 2:
            options.c_cflag |= CSTOPB;
            break;
        default:
            #ifdef DEBUG
            qDebug("Unsupported stop bits %d",stopbits);
            #endif
            return false;
    }

    switch(flowcontrol)
    {
        case 0:     //no flow control
            options.c_cflag &= ~CRTSCTS;
            options.c_iflag &= ~(IXON | IXOFF | IXANY);
            break;

        case 1:     //hardware flow contorl
            options.c_cflag |= CRTSCTS;
            options.c_iflag &= ~(IXON | IXOFF | IXANY);
            break;

        case 2:     //software flow contorl
            options.c_iflag |= (IXON | IXOFF | IXANY);
            options.c_cflag &= ~CRTSCTS;
            break;
    }

    options.c_iflag &= ~(INLCR | IGNCR | ICRNL);
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);     // select raw input已采用了非标准的模式。
    options.c_oflag &= ~ OPOST;

    //choose raw output
        //clear c_cflag
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~CSIZE;
    tcflush(m_serial,TCIOFLUSH);
    options.c_cc[VTIME] = 60;
    options.c_cc[VMIN] = 60;
    if (tcsetattr(m_serial,TCSANOW,&options) != 0)
    {
        //#ifdef DEBUG
        //qDebug("SetupSerial");
        //#endif
        //return false;
    }
    return true;
}

以下是一个线程的run函数,主要负责串口的数据读取


void ReadThread::run()
{
    struct timeval timeout;
    int fd_num;
    int usedLen;
    size_t bufLen;
    tcflush(m_serial,TCIOFLUSH);
    while(1)
    {
      qDebug()<<"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$";
      FD_ZERO(&m_readSet);
      FD_SET(m_serial,&m_readSet);
      timeout.tv_sec = 0;
      timeout.tv_usec = 300*000;
      //sleep(1);
      fd_num = select(m_serial + 1, &m_readSet, NULL, NULL, &timeout);
      if(fd_num>0)
      {
          if(ioctl(m_serial, FIONREAD, &m_aviLen) < 0)
            {
                #ifdef DEBUG
                qDebug("Error %s\n",strerror(errno));
                #endif
            }
          if(m_aviLen>0)
          {
            msleep(800);
            qDebug()<<m_aviLen<<"iiiii";
            usedLen = read(m_serial,m_recvBuf,m_aviLen);
            qDebug()<<"usedLen2024"<<usedLen;
            qDebug()<<"m_recvBuf2024"<<m_recvBuf;
            bufLen=strlen(m_recvBuf);
            if(m_data !=NULL)
                delete[] m_data;
            m_data=new char[bufLen];
            memcpy(m_data,m_recvBuf,bufLen);
            //qDebug()<<"xxxxx"<<m_data<<bufLen;
            QByteArray array(m_data,bufLen);
            QString result(array);
            //qDebug()<<result<<"zzzzzz"<<result.at(0);
            if(result.at(0) == QChar('$'))
            {
                qDebug()<<"wwwwww";
            }
            else
            {
                //::tcflush(m_serial,TCIOFLUSH);
            }
            //tcflush(m_serial,TCIOFLUSH);
            bufLen=0;
            bzero(m_recvBuf,1024);
          }
      }
    }
    exec();
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP