请唐先生和各位高手帮忙解决奇怪的串口通讯问题。

我们在QNX6.2.1下开发的应用程序存在着串口通讯不稳定的现象,用示波器跟踪检查发现问题的原因在于数据有时发不出去(虽然write函数返回值是正确的)。我担心应用程序有问题所以编了一个简单的串口程序(只发送)来测试,还是会出现发不出去的问题,程序代码如下:
int main()
{
int fd;
struct termios tio;
BYTE buf[5]={0x1,0x6,0x0,0x52,0x60};
int num;

//open COM1
fd=open("/dev/ser1",O_RDWR );
if( -1 == fd )
cout<<“can’t open COM1 port”<<endl;

//set COM1 parameter
tcgetattr(fd, &tio); //set baudrate to 4800
cfsetospeed(&tio,B4800);
cfsetispeed(&tio,B4800);

tio.c_cflag &= ~CSIZE;
tio.c_cflag |= CS8; //set databit to 8

tio.c_cflag &= ~CSTOPB; //set stopbit to 1

tio.c_cflag &= ~PARENB; //set no parity
tio.c_cflag = tio.c_cflag | CLOCAL | CREAD;

tcflush(fd,TCIOFLUSH); //clear input and output buffer

tcsetattr(fd,TCSANOW,&tio );

for( ; ; )
{
num = write(fd, buf, 5 );
if( num == 5 )
cout<<“send successfully!”<<endl;
sleep(3);
}

close(fd);

return EXIT_SUCCESS;
}

在硬件(X86嵌入示开发板)上电后运行该程序,经常会发现能够send successfully!信息显示,但没有东西发出来,持续一段时间后,突然会一下子发出很多数据(有点象write程序将数据写入缓冲区,但没发出来),然后恢复正常。我觉得很困惑不知道为什么会这样,这到底是硬件问题、软件问题或者系统问题。硬件是委托专业专业的厂家(Advantech)开发的,操作系统似乎也不应该有这样的问题。因此我想问的是:
1.上述软件存在问题吗?
2.Write函数将数据写入缓冲区后是不是立即发出,什么情况下可能造成延缓发出的情况
3.这种现象能够排除硬件的问题吗?

PS:串口是以下命令驱动的:devc-tser8250 -u1 3f8,4

唯一可以想得到的,是Flow Control,试试看在tio里面把XON/XOFF什么的取消一下。

如xtang所说,取消了硬件流控制之后问题已解决,在程序中添加
tio.c_cflag &= ~IHFLOW; //Disable hardware flow control
tio.c_cflag &= ~OHFLOW;

虽然问题以解决,不用担心被老板骂了 :smiley: ,但还有以下疑惑的地方:

  1. 我只使用了三根通讯线(发,收,地),没有采用其它硬件握手线,按道理应该根本通不上,为什么只是偶尔通不上,特别是在刚开机的时候
  2. 记得以前在window下用串口调试助手测试,硬件流控制并不会影响收发啊