关于mc9s12dg128里面SCI中断接收的问题

[复制链接]
4723|2
 楼主| yetboy 发表于 2007-11-21 10:41 | 显示全部楼层 |阅读模式
我写了一道PC写单片机通讯的程序,PC用串口助手发送ASCII字符过来,单片机接收。每当串口助手一次过发几个字符时,单片机接收第一个字符是正常的,后面的全都出错了,SCI0SR1_IDLE位置1。但用串口助手将字符一个一个地发时,接收又正常。不知道哪里出错了,望各位指点一下,谢谢。程序如下:<br /><br /><br />#include&nbsp;&lthidef.h&gt<br />#include&nbsp;&ltstring.h&gt&nbsp;&nbsp;<br />#include&nbsp;&ltmc9s12dg128.h&gt<br />#pragma&nbsp;LINK_INFO&nbsp;DERIVATIVE&nbsp;&quot;mc9s12dg128b&quot;<br /><br />char&nbsp;i;<br />char&nbsp;re[3];<br /><br />#pragma&nbsp;&nbsp;CODE_SEG&nbsp;__NEAR_SEG&nbsp;NON_BANKED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />interrupt&nbsp;20&nbsp;void&nbsp;SCI0_rx(void)<br />{&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(SCI0SR1&nbsp;&&nbsp;0x20){&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re=SCI0SR1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re=SCI0DRL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i==3)i=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />#pragma&nbsp;CODE_SEG&nbsp;&nbsp;DEFAULT<br /><br />//&nbsp;&nbsp;SCI参数设置&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;Init_SCI(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCI0BDL=52;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCI0BDH=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//CLOCK=16MHz,&nbsp;&nbsp;bps=9600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCI0CR1=0x14;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//8&nbsp;bit,&nbsp;无效验&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCI0CR2=0x2C;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//中止符产生器关闭<br />&nbsp;&nbsp;&nbsp;&nbsp;SCI0CR2&nbsp;|=&nbsp;0x80;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*Enable&nbsp;TDRE&nbsp;interrupt*/<br />}&nbsp;<br /><br />void&nbsp;main(void)&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;Init_SCI();<br />&nbsp;&nbsp;DDRB&nbsp;=&nbsp;0Xff;<br />&nbsp;&nbsp;PORTB&nbsp;=&nbsp;0XAA;<br />&nbsp;&nbsp;EnableInterrupts;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;for&nbsp;(;;)<br />&nbsp;&nbsp;{}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}
张明峰 发表于 2007-11-21 13:10 | 显示全部楼层

立即发回去看看

if(SCI0SR1&nbsp;&&nbsp;0x20){&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re=SCI0SR1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re=SCI0DRL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#FF0000>SCI0DRL&nbsp;=&nbsp;re</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i==3)i=0;<br />}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />如果PC接收显示数据错误,最大可能是双方波特率或停止位长度不一致。<br />如果PC接收显示数据正常,看你自己数据处理程序吧。
 楼主| yetboy 发表于 2007-11-21 16:29 | 显示全部楼层

找到原因了

原来我将SCI0CR1里面的M位设成1了,改SCI0CR1=0x04就行了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部