求助!!通过中断接收数据,只要另一台机器一发送这边就死机!!!!!!

我想通过中断接收数据,一台机器是windows一台是qnx。在windows运行一个串口调试程序,在qnx运行我写的程序,但是只要windows那边一发送,qnx就死机!而且什么也接不到!实在想不明白,请指点迷津呀!很急的!下面是我的程序:
#include

#define BUFFLEN 1024

void InitCOM();
void OpenPort();
void ClosePort();
unsigned char read_char();

const struct sigevent *asyncint (void *arg, int id);

unsigned char Buffer[BUFFLEN];
int buffin=0;
int buffout=0;

main()
{

unsigned char unChar;
short bExit_Flag=0;
OpenPort();

do
{

if(tcischars(1)>0)
{
unChar=getchar();
switch (unChar)
{
case 0x1B:
bExit_Flag = 1;
break;
//You may want to handle other keys here
}

}
unChar = read_char();
if (unChar != 0xff)
{

fprintf(stdout,"%c",unChar);
}

} while (!bExit_Flag);

ClosePort();
}


void OpenPort()
{
unsigned char ucTemp;
InitCOM();
InterruptDisable();
in8(0x3f8);
in8(0x3fe);
in8(0x3fb);
in8(0x3fa);
out8(0x3fc,0x08|0x0b);
out8(0x3f9,0x01);
ucTemp=in16(0x21)&0xef;
out8(0x21,ucTemp);
InterruptAttach(4,asyncint,NULL, 0, 0);

InterruptEnable();
}

const struct sigevent *asyncint (void *arg, int id)
{
Buffer[buffin++] =in8(0x3f8);
if (buffin >= BUFFLEN)
buffin=0;
out8(0x20,0x20);
}

void ClosePort(void)
{
InterruptDisable();
out8(0x3f9,0x00);
out8(0x3fc,0x00);
out8(0x21,in8(0x21)&0x10);
InterruptEnable();

}

void InitCOM()
{
ThreadCtl (_NTO_TCTL_IO, NULL);
out8(0x3fb,0x80);
out8(0x3f8,0x0C);
out8(0x3f9,0x00);
out8(0x3fb,0x03);
out8(0x3fc,0x08|0x0b);
out8(0x3f9,0x01);
}


unsigned char read_char()
{
unsigned unch;
if(buffout != buffin)
{
unch = Buffer[buffout];
buffout++;
if(buffout >= BUFFLEN)
buffout=0;
return(unch);
}
else
return(0xff);

}

如果中断4发生,你的中断服务程序 asyncint() 会被调用,这个函数的返回值是什么?

写什么样的返回值呀?怎么写呀?同样的程序改成vc++就可以使用呀

我只想在中断4发生时,用这个中断程序判断缓冲区是否满,然后就接收数据了,不知道这样写对吗?

中断服务程序(ISR)的返回值,告诉内核下一步应该做什么。你的返回值是“不定”,是任何在堆栈或是寄存器里的数,当然会造成死机。中断处理每一个操作系统都不一样,拿windows的直接来用,通常是行不通的。

你的情形,可以试试先返回一个 NULL。具体什么情形要怎样返回,可以参照文档。

http://www.qnx.com/developers/docs/6.3.0SP1/neutrino/prog/inthandler.html

太感谢了xtang!!死机和接收不到的问题解决了!但是又有了新的问题:当我把
fprintf(stdout, “\n\nReady to Receive DATA\n”
“press [ESC] to quit…\n\n”);
这个句子加在
unChar = read_char();
if (unChar != 0xff)
{

fprintf(stdout,"%c",unChar);
} 之前
if(tcischars(1)>0)
{
unChar=getchar();
switch (unChar)
{
case 0x1B:
bExit_Flag = 1;
break;
//You may want to handle other keys here
}

}
之后时可以接收到字符,但是放在do以前OpenPort(); 后时就什么也没有!!那是什么原因呢?

你的stdin/stdout是什么?是一个232口吗?你的程序抢占了232口中断,很可能系统标准的232驱动就不能正常工作了。

顺便提一个问题,为什么你要用自己的中断程序来取字符。系统提供了232串口驱动,你只要"open(/dev/ser1, …);", read()/write(); 就可以了,为什么要自己抢中断呢?

谢谢您的答复。问题基本解决了。但是麻烦您帮我看看我的接收过程,为什么我可以接收到一个字符,而当对方发一串字符时就没办法接收到了呢?我尝试过一些方法,都不是很理想。您有空能帮我改改吗?!当然不改也没关系,毕竟这是程序编写的问题了。谢谢!
您说的那个串口通讯方式,我作过了。但是我们的板子以后要连一些外设,所以会用到中断,所以要写一个中断调试一下。没想到,刚写就出问题!唉,学艺不精呀!

在一次中断中,你应该循环去读Line Status寄存器(0x3fd),直到所有字符都读出来了为止。

8250的驱动原码,芯片说明网上应该有很多了,可以找来参考一下。

非常感谢您的解答!问题已经解决了。