资源暂时不可用
问题描述:
考虑这个线程,它就像一个计时器,发送一些数据包的序列:资源暂时不可用
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
什么想法?这段代码可以很好的与定时器一起工作,它已经过精确的检查和测试,但是现在我需要添加这个线程而不是定时器。由于
答
你的问题是不完整的足够完整的诊断,因为你没有说明如何fd
创建,线程是如何设置(你说的是问题的一部分)等
但是...您的resource temporarily unavailable
系列是一个很大的提示。 write()函数没有成功写入所有内容,因为它返回一个错误(可能是EAGAIN
或EWOULDBLOCK
)。 fd
文件描述符被附加到某个具有小缓冲区,无缓冲区或已满的缓冲区的东西。而且它已经满了,应用程序的工作是在它可以处理它之前不发送任何其他内容。如果错误代码为EAGAIN
或EWOULDBLOCK
,那么通常需要睡眠并再次尝试写入。
但是,你说它是返回3,这实际上也表示“没有错误”。如果是这种情况,那么错误字符串将不会指向写入本身,并且之前设置了其他的设置errno
。 (过去本身可能是write
)。 (可能),你可能需要注意写入速度太快(它看起来像一个串行缓冲区,它肯定属于易于填充的类型,的缓冲)。
简而言之:如果它没有写出比你想要的fd
所有的字节,那是因为它不能处理更多的内容。顺便说一下,这可能与qt
完全没有关系。这全是关于write()
电话。
你为什么要在信号中传送'char str'而不是'QByteArray'? – UmNyobe 2013-04-23 13:52:59