有哪位大哥能提供思路吗???想不通什么原因:
com0/1使用接收中断,接收到数据后立即转发。不使用中断嵌套,也不使用FIFO,而且两个串口寄存器设置一样。
1)进入com0接收中断,接收一个字节,等到发送寄存器为空,然后同时向com0/1转发,正常
2)进入com1接收中断,接收一个字节,等到发送寄存器为空,向com1直接转发,向com0直接写入字符[email=]'@'[/email]....如果pc使用串口调试工具往com1发送一个字符,则正常;但是发送两个以上的字符就会出错。
另外,我在com1中的接受中判断,收到的数据是不是#,如果不是,则蜂鸣。然后我在pc上用串口调试工具一次发送多个###,并没有蜂鸣。而且用1ms间隔发送多个###,也没有蜂鸣,说明com1收到的数据至少不是错的。但是com1接受中断,往com0 1写入数据有问题。。。
我两个串口的寄存器设置完全一样,而且接受中断也是一样的
串口设置如下:
rUFCON0 = 0x0; //FIFO disable
rUFCON1 = 0x0;
rUMCON0 = 0x0;
rUMCON1 = 0x0;
rULCON0 = 0x3; //Normal,No parity,1 stop,8 bit
rUCON0 = 0x205; //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
rUBRDIV0 = ((int)(mclk/16./baud + 0.5) -1);
rULCON1 = 0x3;
rUCON1 = 0x205;
rUBRDIV1 = ((int)(mclk/16./baud + 0.5) -1);
-------------------------------------------------------
void __irq URxd1Isr() //uart1 recv
{
unsigned char tmp_byte;
int count=0;
rI_ISPC=BIT_URXD1;
if( rUTRSTAT1 & 0x01)//接收缓冲区有数据
{
tmp_byte=rURXH1;
if(tmp_byte!= '#')
jbm_led_on;
while( !((rUTRSTAT0 & 0x04) && (rUTRSTAT0 & 0x02) ));
WrUTXH0([email=]'@'[/email]);
while( !((rUTRSTAT1 & 0x04) && (rUTRSTAT1 & 0x02) ));
WrUTXH1(tmp_byte);
}
} |