UART0设置触发深度8, 但是要接收16个字节, 用两次 的8个字节中断接收,<br /><br />想要完成:用串口助手发送16字节数据给串口,串口接收到数据然后将数据再发送回串口助手显示<br /><br />运行结果:如发送8字节数据则可以正常返回发送的数据,如发送16字节数据则返回的数据与串口助手发送的数据不一样。 <br /><br />代码如下(根据周工书上的程序改的):<br /><br />#include "config.h" <br /><br /><br />/* 定义串口模式设置数据结构 */<br />typedef struct UartMode<br />{ uint8 datab; // 字长度,5/6/7/8<br /> uint8 stopb; // 停止位,1/2<br /> uint8 parity; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验<br />} UARTMODE;<br /><br /><br />uint8 rcv_buf[16]; // UART0数据接收缓冲区<br />volatile uint8 rcv_new; // 接收新数据标志<br /><br /><br />uint8 tail=0;<br />/****************************************************************************<br />* 名称:IRQ_UART0()<br />* 功能:串口UART0接收中断。<br />* 入口参数:无<br />* 出口参数:无<br />****************************************************************************/<br />void __irq IRQ_UART0(void)<br />{ <br /> <br /> if( 0x04==(U0IIR&0x0F) )<br /> rcv_new = 1; // 设置接收到新的数据标志<br /> //else<br /> //return;<br /> <br /> while((U0LSR&0x01)!=0)<br /> {<br /> <br /> rcv_buf[tail] = U0RBR; // 读取FIFO的数据,并清除中断标志<br /> tail++;<br /> tail%=16;<br /> }<br /> <br /> VICVectAddr = 0x00; // 中断处理结束 <br />} <br /><br /><br />/****************************************************************************<br />* 名称:SendByte()<br />* 功能:向串口UART0发送字节数据。<br />* 入口参数:data 要发送的数据<br />* 出口参数:无<br />****************************************************************************/<br />void SendByte(uint8 data)<br />{ <br /> U0THR = data; // 发送数据<br /> <br />}<br /><br /><br />/****************************************************************************<br />* 名称:ISendBuf()<br />* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。<br />* 入口参数:无<br />* 出口参数:无<br />****************************************************************************/<br />void ISendBuf(void)<br />{ uint8 i;<br /> <br /> for(i=0; i<16; i++) SendByte(rcv_buf);<br /> <br /> head=tail;<br /> <br /> while( (U0LSR&0x40)==0 ); // 等待数据发送<br />} <br /> <br /> <br />/****************************************************************************<br />* 名称:UART0_Ini()<br />* 功能:初始化串口0。设置其工作模式及波特率。<br />* 入口参数:baud 波特率<br />* set 模式设置(UARTMODE数据结构)<br />* 出口参数:返回值为1时表示初化成功,为0表除参数出错<br />****************************************************************************/<br />uint8 UART0_Ini(uint32 baud, UARTMODE set)<br />{ uint32 bak;<br /><br /> /* 参数过滤 */<br /> if( (0==baud)||(baud>115200) ) return(0);<br /> if( (set.datab<5)||(set.datab>8) ) return(0);<br /> if( (0==set.stopb)||(set.stopb>2) ) return(0);<br /> if( set.parity>4 ) return(0);<br /><br /> /* 设置串口波特率 */<br /> U0LCR = 0x80; // DLAB位置1<br /> bak = (Fpclk>>4)/baud;<br /> U0DLM = bak>>8;<br /> U0DLL = bak&0xff;<br /> <br /> /* 设置串口模式 */<br /> bak = set.datab-5; // 设置字长度<br /> if(2==set.stopb) bak |= 0x04; // 判断是否为2位停止位 <br /> <br /> if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}<br /> bak |= set.parity<<4; // 设置奇偶校验<br /> <br /> U0LCR = bak;<br /> <br /> return(1);<br />}<br /> <br />/****************************************************************************<br />* 名称:main()<br />* 功能:初始化串口,并等待接收到串口数据。<br />* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。<br />****************************************************************************/<br />int main(void)<br />{ <br /> //uint8 i;<br /> <br /> UARTMODE uart0_set; <br /> PINSEL0 = 0x00000005; // 设置I/O连接到UART0<br /> rcv_new = 0;<br /> <br /> uart0_set.datab = 8; // 8位数据位<br /> uart0_set.stopb = 1; // 1位停止位<br /> uart0_set.parity = 1; // 奇校验<br /> UART0_Ini(4800, uart0_set); // 初始化串口模式<br /> <br /> U0FCR = 0x81; // 使能FIFO,并设置触发点为8字节<br /> U0IER = 0x01; // 允许RBR中断,即接收中断<br /> <br /> /* 设置中断允许 */<br /> VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断<br /> VICVectCntl0 = 0x26; // UART0中断通道分配到IRQ slot 0,即优先级最高<br /> VICVectAddr0 = (int)IRQ_UART0; // 设置UART0向量地址<br /> VICIntEnable = 0x00000040; // 使能UART0中断<br /> <br /> <br /> while(1) // 等待中断<br /> {<br /> <br /> if(1==rcv_new)<br /> { <br /> U0IER=0x00; <br /> rcv_new = 0;<br /> ISendBuf();<br /> U0IER=0x01; <br /> }<br /> <br /> }<br /> return(0);<br />}<br /><br /><br /> |
|