资源暂时不可用

问题描述:

考虑这个线程,它就像一个计时器,发送一些数据包的序列:资源暂时不可用

void PlCThead::run() 
{ 
    while(1) 
    { 
     const char str[]={UPDATE_PACKET}; 

     QByteArray built; 
     built.append(0x02); 
     built.append(0x05); 
     built.append(0x03); 

     emit requestForWriteAndReceive(built); 

     msleep(100); 
    } 
} 

EMIT工作得很好,这是不言而喻的插槽内,那里,只写78或字符x到串行而不是3个字节的数据包。

bool RS::rs_ThreadPlcDataAqustn(QByteArray byteArray) 
{ 
    QByteArray rd15Bytes; 

    char *data = byteArray.data(); 
    int len = byteArray.length(); 

    if(!rs_serialWrite(data, len)) 
    { 
     qDebug() << "Failure:(rs_dataqustn: rs_plcWrite(data, len)"; 
     emit plc_port_dscntd(); 
     return false; 
    } 
} 

bool RS::rs_serialWrite(char* buff, size_t length) 
{ 
    int tries; 

    int len; 

    tries = 0; 

    QByteArray built((char*)buff, length); 

    qDebug() << built.toHex(); 


      len = write(fd, buff, length); 

      qDebug() << len; 

      qDebug() << strerror(errno); 

      return true; 
} 

这是怎么FD创建:

fd = open(portPath, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK, S_IWUSR | S_IRUSR | S_IXUSR); 

这是在主窗口中创建线程如何:

rs_plc->rs_plcOpenPort((char *)"/dev/ttyS0"); /*/dev/ttyS3*/ 

PlCThead *thread = new PlCThead(); 
connect(thread, SIGNAL(requestForWriteAndReceive(QByteArray)), rs_plc, SLOT(rs_ThreadPlcDataAqustn(QByteArray))); 
thread->start(); 

rs_plc是主窗口的私有成员。

strerror返回此警告:

> Resource temporarily unavailable 

什么想法?这段代码可以很好的与定时器一起工作,它已经过精确的检查和测试,但是现在我需要添加这个线程而不是定时器。由于

+0

你为什么要在信号中传送'char str'而不是'QByteArray'? – UmNyobe 2013-04-23 13:52:59

你的问题是不完整的足够完整的诊断,因为你没有说明如何fd创建,线程是如何设置(你说的是问题的一部分)等

但是...您的resource temporarily unavailable系列是一个很大的提示。 write()函数没有成功写入所有内容,因为它返回一个错误(可能是EAGAINEWOULDBLOCK)。 fd文件描述符被附加到某个具有小缓冲区,无缓冲区或已满的缓冲区的东西。而且它已经满了,应用程序的工作是在它可以处理它之前不发送任何其他内容。如果错误代码为EAGAINEWOULDBLOCK,那么通常需要睡眠并再次尝试写入。

但是,你说它是返回3,这实际上也表示“没有错误”。如果是这种情况,那么错误字符串将不会指向写入本身,并且之前设置了其他的设置errno。 (过去本身可能是write)。 (可能),你可能需要注意写入速度太快(它看起来像一个串行缓冲区,它肯定属于易于填充的类型,的缓冲)。

简而言之:如果它没有写出比你想要的fd所有的字节,那是因为它不能处理更多的内容。顺便说一下,这可能与qt完全没有关系。这全是关于write()电话。

+0

我上面更新了我的代码,但我仍然不明白问题是什么 – Sam 2013-04-24 10:23:06

+0

不知道这与qt无关,只有3行代码我正在加载URL,并且它会搜索!在3个vm和1个物理机器上,在strace中有完全相同的错误,我错过了什么? – holms 2014-03-24 01:19:10