关于串口2延迟写问题

大家: 目前遇到一个棘手的问题:
在QNX6.2.1下开发的应用程序存在着串口通讯不稳定的现象,用示波器跟踪检查发现问题现象是:数据有时发不出去(虽然write函数返回值是正确的)。持续一段时间(大约12s)后,突然又会发出(有点象write程序将数据写入缓冲区,但没发出来),然后恢复正常。我觉得很困惑不知道为什么会这样,这到底是硬件问题、软件问题或者系统问题。
我们关于串口的写操作是封装了一个函数,采用select和write,我们串口的写操作是采用一个单独的线程进行处理的,但是我查了在6.2.1下select函数,发现help帮助说它在线程中是不安全的,这个意味着什么呢?程序如下:
int WriteComPort (int PortId, UINT8 * data, int datalength,UINT8 *err)
{
INT32 retval, len = 0, total_len = 0;

FD_ZERO (&fs_write);
FD_SET (PortId, &fs_write);
tv_timeout.tv_sec = 2;
tv_timeout.tv_usec = 0;

for (total_len = 0, len = 0; total_len < datalength;) {
retval = select (PortId + 1, NULL, &fs_write, NULL, &tv_timeout);
if (retval) {
len = write (PortId, &data[total_len], datalength - total_len);
if (len > 0) {
total_len += len;
}
}
else {
tcflush (PortId, TCOFLUSH); /* flush all output data */
break;
}
}
return (total_len);
}

可以把启动串口驱动的时候,把那个 -T和-t参数设置成 0 ,把软件的buffer去掉,

如果还有问题的话,可能就是设置中断的问题了。


很少用过select,不知道能够精确到多少

我们用的串口硬件是带16字节硬件FIFO的,我们从系统资源角度考虑将
devc-ser8250的硬件FIFO设置成14.我想如果将软件BUFFER去掉的话,如果我连续发送很多字节的话,那么驱动程序如何进行数据处理呢?
而且我们遇到的问题也仅在串口1上面才会出现,其他串口不会出现此现象,从我们调试以及分析后发现与串口的波特率/字节数/发送频率没有关系.

select()/write()操作你都完成了,那数据已经在驱动里了,唯一可能它不发数据的原因好象只有Flow Control了。试试把硬件、软件的Flow Crontol都关了,看有没有帮助。

当然,如果像ball-point说的,中断出了问题(出问题的串口没有跟别人共享中断吧),也会数据发不出去的。

xtang你好.你能把联系方式告诉我吗?我有些问题想直接与你沟通下.我的邮箱:
wo6631077@163.com

出问题的串口为串口1 CPU板自带的串口基地址为0X3F8,中断为4,与其他串口没有相关性.很奇怪的现象,而且我们其他的串口(串口扩展板)也同样有收和发却没有发现问题. 我们的devc-ser8250 的设置是将硬件流关闭的,软件流是自动关闭的(我们用的raw模式,软件流自动关闭).我们的系统是6.2.1的版本的.