<br />#include "D:xiechunfuprojectarm empoldersoftLPC213Xsystem.h"<br /><br /><br />//UART1<br />static uint8 txd1sta=0;<br />static uint8 txd1end=0;<br />static uint8 uart1txd[100];<br />//////////////////////////////////////////////////////////////////////////////////<br />//接收$开始*结束的数据串.如果数据串超过100个后面的数据将删掉<br />//如果三个BUFFER都是装满了,UART1停止接收<br />//等处理了数据过后在接收下一个有效的数据串<br />//处理完数据过后将响应的shuju1wei置0 uart1rxd0[0][X] 置0<br />uint8 uart1rxdnb=0; //表示可用的数组<br />//最大值为3 ,0为空3为满<br />uint8 uart1rxd0[100][3];<br />uint8 shuju1wei0; <br />//表示这个数据串接收了几个字节uart1rxd0[100][0]<br />uint8 shuju1wei1; <br />//表示这个数据串接收了几个字节uart1rxd0[100][1]<br />uint8 shuju1wei2; <br />//表示这个数据串接收了几个字节uart1rxd0[100][2]<br />//UART0 <br />/********************************************************************************************<br /><br />********************************************************************************************/<br />static uint8 txd0sta=0;<br />static uint8 txd0end=0;<br />static uint8 uart0txd[100];<br />//////////////////////////////////////////////////////////////////////////////////<br />//接收$开始*结束的数据串.如果数据串超过100个后面的数据将删掉<br />//如果三个BUFFER都是装满了,UART0停止接收<br />//等处理了数据过后在接收下一个有效的数据串<br />//处理完数据过后将响应的shuju0wei置0 uart0rxd0[0][X] 置0<br />uint8 uart0rxdnb=0; //表示可用的数组<br />//最大值为3 ,0为空3为满<br />uint8 uart0rxd0[100][3];<br />uint8 shuju0wei0; <br />//表示这个数据串接收了几个字节uart0rxd0[100][0]<br />uint8 shuju0wei1; <br />//表示这个数据串接收了几个字节uart0rxd0[100][1]<br />uint8 shuju0wei2; <br />//表示这个数据串接收了几个字节uart0rxd0[100][2]<br />////////////////////////////////////////////////////////////////////<br />//<br />/**************************************************************************************<br /><br />***************************************************************************************/<br />extern uchar myprintf0(uchar *ip,uchar n)<br />{<br /> uchar i,j;<br /> uchar *p;<br /> if( txd0end!=0)return 0;<br /> p = ip ;<br /> if(U0LSR&0X40) //发送器为空<br /> {<br /> j = n-1;<br /> for(i=0;i<j;i++)<br /> { <br /> p++;<br /> uart0txd = *p ; <br /> }<br /> txd0end=j;<br /> txd0sta=0;<br /> U0THR = *ip;<br /> }<br /> else<br /> {<br /> for(i=0;i<n;i++)<br /> { <br /> uart0txd = *p ; <br /> p++;<br /> }<br /> txd0end=n;<br /> txd0sta=0;<br /> }<br />IO0SET = 0X80000000 ; //RS4850CN 1 发送状态<br /> return 1 ;<br />}<br />/**************************************************************************************<br /><br />***************************************************************************************/<br />void uart0int (void) __irq <br />{<br />uchar i,j,m;<br />uchar shuzhu[14];<br />uchar stendzh; <br />//0表示接收到了开始位1表示接收到了数据2表示接收到了结束位<br />static uchar rxtstatic=0; //保存当前接收的字节数<br />static uchar uart0rxdip=0; //当前保存的数组<br />//判断是什么中断<br />i = U0IIR&0x0F; <br />switch(i)<br /> {<br /> //接收数据可用有14个字节<br /> case 0x04: // <br /> //接收的数据可用有字节但是发生了中断小于14个字节<br /> case 0x0C: //<br /> stendzh = 1 ;<br /> for(j=0;j<14;j++)<br /> {<br /> shuzhu[j] = U0RBR ;<br /> if(shuzhu[j] ==RXD0STA) {stendzh = 0 ;break;}<br /> if(shuzhu[j] ==RXD0END) {stendzh = 2 ;break;}<br /> if(!(U0LSR&0x01)) break;<br /> }<br /> //表示接收到了开始位或结束位<br /> if(j<14) <br /> {<br /> if(stendzh == 0)//KAI SHI<br /> {<br /> if(uart0rxdnb<3) /*当前接收的数组为空*/<br /> {<br /> if(shuju0wei0==0) uart0rxdip=0;<br /> if(shuju0wei1==0) uart0rxdip=1;<br /> if(shuju0wei2==0) uart0rxdip=2;<br /> uart0rxd0[0] [uart0rxdip] = RXD0STA;<br /> rxtstatic = 1 ;<br /> break;<br /> }<br /> else break;<br /> }<br /> if(stendzh == 2) //STOP<br /> {<br /> if(rxtstatic==0)break; /*这个结束字符没有开始字符*/<br /> m = j +1;<br /> for(j=0;j<m;j++)<br /> {<br /> uart0rxd0[rxtstatic] [uart0rxdip] = shuzhu[j]; /*当前数组已经装满超过100的数据删掉*/<br /> if(rxtstatic<99)rxtstatic++; <br /> } <br /> uart0rxdnb++;<br /> if(uart0rxdip==0)shuju0wei0 = rxtstatic ;<br /> if(uart0rxdip==1)shuju0wei1 = rxtstatic ;<br /> if(uart0rxdip==2)shuju0wei2 = rxtstatic ;<br /> rxtstatic = 0 ;<br /> if(shuju0wei0==0) uart0rxdip=0;/*指向空的数组*/<br /> if(shuju0wei1==0) uart0rxdip=1; <br /> if(shuju0wei2==0) uart0rxdip=2;<br /> <br /> break;<br /> }<br /> if(stendzh == 1) /*正常结束的数据shuju */<br /> {<br /> j++;<br /> }<br /> }<br /> //正常数据j为接收的数据个数<br /> m = j ;<br /> if(uart0rxdnb<3)//当前接收的数组为空<br /> {<br /> if(uart0rxd0[0] [uart0rxdip] !=RXD0STA) break; /*shuju wu xiao 无开始字符*/<br /> for(j=0;j<m;j++)<br /> {<br /> uart0rxd0[rxtstatic] [uart0rxdip] = shuzhu[j]; /*当前数组已经装满超过100的数据删掉*/<br /> if(rxtstatic<99)rxtstatic++; <br /> } <br /> }<br /> break;<br /> //发送中断<br /> case 0x02: // <br /> if( txd0end!=txd0sta)<br /> {<br /> for(j=0;j<14;j++)<br /> {<br /> U0THR = uart0txd[txd0sta];<br /> txd0sta++;<br /> if(txd0sta == txd0end )<br /> {<br /> txd0end=0;<br /> txd0sta =0;<br /> break;<br /> }<br /> }<br /> }<br /> break;<br /> }<br /> VICVectAddr = 0x00; // 通知VIC中断处理结束<br />} <br />/**************************************************************************************<br />初始化串口0<br />***************************************************************************************/<br />extern void uart0init(void)<br />{<br />U0LCR = 0x80; // DLAB位置1<br />//bak = (FPCLK>>4)/baud; <br />U0DLM = 0; //9600<br />U0DLL = 0xc3; <br /> /* 设置串口模式 */ <br /> U0LCR = 0X03; /* 1开始位8位数据1个停止位*/<br /> U0FCR = 0xc1; /*使能FIFO,并设置触发点为14字节*/<br /> U0TER= 0x80; <br /> U0IER = 0x03; /* 允许RBR中断,即接收中断*/<br /> //允许发送中断<br /> IO0CLR= 0X80000000 ; /*RS4850CN 0 接收P0.31*/<br /> VICVectCntl0 = 0x26; /* UART0通道分配到IRQ slot 0,即优先级最高*/<br /> VICVectAddr0 = (uint32)uart0int; //UART0中断 <br /> VICIntEnable = 0x00000040; // 使能 中断<br />}<br />/********************************************************************************************************<br /><br />********************************************************************************************************/<br />extern uchar myprintf1(uchar *ip,uchar n)<br />{<br /> uchar i,j;<br /> uchar *p;<br /> if( txd1end!=0)return 0;<br /> p = ip ;<br /> if(U1LSR&0X40) //发送器为空<br /> {<br /> while(myprintf0("R",1)==0);<br /> j = n-1;<br /> for(i=0;i<j;i++)<br /> { <br /> p++;<br /> uart1txd = *p ; <br /> U1THR = *p;<br /> }<br /> txd1end=j;<br /> txd1sta=0; <br /> //U1THR = *ip;<br /> }<br /> else<br /> {<br /> while(myprintf0("S",1)==0);<br /> for(i=0;i<n;i++)<br /> { <br /> uart1txd = *p ; <br /> p++;<br /> }<br /> txd1end=n;<br /> txd1sta=0;<br /> }<br /> while(myprintf0("T",1)==0);<br />IO0SET = 0X00800000 ; //RS4851CN 0 发送P0.23<br /> return 1 ;<br />}<br />/********************************************************************************************************<br /><br />********************************************************************************************************/<br />void uart1int (void) __irq //UART1中断<br />{<br />uchar i,j,m;<br />uchar shuzhu[14];<br />uchar stendzh; <br />//0表示接收到了开始位1表示接收到了数据2表示接收到了结束位<br />static uchar rxtstatic=0; //保存当前接收的字节数<br />static uchar uart0rxdip=0; //当前保存的数组<br />//判断是什么中断<br />while(myprintf0("X",1)==0);<br />i = U1IIR&0x0F; <br />switch(i)<br /> {<br /> //接收数据可用有14个字节<br /> case 0x04: // <br /> //接收的数据可用有字节但是发生了中断小于14个字节<br /> case 0x0C: //<br /> stendzh = 1 ;<br /> for(j=0;j<14;j++)<br /> {<br /> shuzhu[j] = U1RBR ;<br /> if(shuzhu[j] ==RXD1STA) {stendzh = 0 ;break;}<br /> if(shuzhu[j] ==RXD1END) {stendzh = 2 ;break;}<br /> if(!(U1LSR&0x01)) break;<br /> }<br /> //表示接收到了开始位或结束位<br /> if(j<14) <br /> {<br /> if(stendzh == 0)//KAI SHI<br /> {<br /> if(uart1rxdnb<3) /*当前接收的数组为空*/<br /> {<br /> if(shuju1wei0==0) uart0rxdip=0;<br /> if(shuju1wei1==0) uart0rxdip=1;<br /> if(shuju1wei2==0) uart0rxdip=2;<br /> uart1rxd0[0] [uart0rxdip] = RXD0STA;<br /> rxtstatic = 1 ;<br /> break;<br /> }<br /> else break;<br /> }<br /> if(stendzh == 2) //STOP<br /> {<br /> if(rxtstatic==0)break; /*这个结束字符没有开始字符*/<br /> m = j +1;<br /> for(j=0;j<m;j++)<br /> {<br /> uart1rxd0[rxtstatic] [uart0rxdip] = shuzhu[j]; /*当前数组已经装满超过100的数据删掉*/<br /> if(rxtstatic<99)rxtstatic++; <br /> } <br /> uart1rxdnb++;<br /> if(uart0rxdip==0)shuju1wei0 = rxtstatic ;<br /> if(uart0rxdip==1)shuju1wei1 = rxtstatic ;<br /> if(uart0rxdip==2)shuju1wei2 = rxtstatic ;<br /> rxtstatic = 0 ;<br /> if(shuju1wei0==0) uart0rxdip=0;/*指向空的数组*/<br /> if(shuju1wei1==0) uart0rxdip=1; <br /> if(shuju1wei2==0) uart0rxdip=2;<br /> <br /> break;<br /> }<br /> if(stendzh == 1) /*正常结束的数据shuju */<br /> {<br /> j++;<br /> }<br /> }<br /> //正常数据j为接收的数据个数<br /> m = j ;<br /> if(uart1rxdnb<3)//当前接收的数组为空<br /> {<br /> if(uart1rxd0[0] [uart0rxdip] !=RXD1STA) break; /*shuju wu xiao 无开始字符*/<br /> for(j=0;j<m;j++)<br /> {<br /> uart1rxd0[rxtstatic] [uart0rxdip] = shuzhu[j]; /*当前数组已经装满超过100的数据删掉*/<br /> if(rxtstatic<99)rxtstatic++; <br /> } <br /> }<br /> break;<br /> //发送中断<br /> case 0x02: // <br /> if( txd1end!=txd1sta)<br /> {<br /> for(j=0;j<14;j++)<br /> {<br /> U1THR = uart1txd[txd1sta];<br /> txd1sta++;<br /> if(txd1sta == txd1end )<br /> {<br /> txd1end=0;<br /> txd1sta =0;<br /> break;<br /> }<br /> }<br /> }<br /> break;<br /> }<br /> VICVectAddr = 0x00; // 通知VIC中断处理结束<br />} <br />/********************************************************************************************************<br /><br />********************************************************************************************************/<br />//初始化串口1<br />extern void uart1init(void)<br />{<br />U1LCR = 0x80; // DLAB位置1<br />//bak = (FPCLK>>4)/baud; <br />U1DLM = 0; //9600<br />U1DLL = 0xc3; <br /> /* 设置串口模式 */ <br /> U1LCR = 0X03; /* 1开始位8位数据1个停止位*/<br /> U1FCR = 0xc1; /*使能FIFO,并设置触发点为14字节*/<br /> U1TER= 0x80; <br /> U1IER = 0x03; /* 允许RBR中断,即接收中断*/<br /> //允许发送中断<br /> IO0CLR= 0X00800000 ; //RS4851CN 0 接收P0.23<br /> VICVectCntl1 = 0x27; // UART1通道分配到IRQ slot 1,<br /> VICVectAddr1 = (uint32)uart1int; <br /> VICIntEnable = 0x00000080; // 使能 中断<br />}<br /><br />
|