M2440有三个串口,USRT0,UART1,UART3。 
对串口的操作有三种:串口初始化,串口接收,串口发送 
1 串口初始化 
1)串口初始化函数 
void Uart_Init(int pclk,int baud)    // 此段为UART设置 可略过不看
{     
int i;    //定义一个参数
if(pclk == 0)  //假定pclk的值为0 
pclk    = PCLK;     
rUFCON0 = 0x0;  //UART channel 0 FIFO control register, FIFO disable      rUFCON1 = 0x0;  //UART channel 1 FIFO control register, FIFO disable      rUFCON2 = 0x0;  //UART ch
annel 2 FIFO control register, FIFO disable      rUMCON0 = 0x0;  //UART chaneel 0 MODEM control register, AFC disable      rUMCON1 = 0x0;  //UART chaneel 1 MODEM control register, AFC disable  //UART0     
rULCON0 = 0x3;  //Line control register : Normal,No parity,1 stop,8 bits                      //正常模式,无校验位,每帧一个停止位,8位数据   
//    [10]      [9]    [8]        [7]        [6]      [5]        [4]          [3:2]        [1:0]     
// Clock Sel,  Tx Int,  Rx Int, Rx Time Out, Rx err, Loop-back, Send break,  Transmit Mode, Receive Mode     
//    0        1      0    ,    0          1        0          0    ,      01          01     
//  PCLK      Level    Pulse    Disable    Generate  Normal      Normal        Interrupt or Polling     
//PCLK时钟 发送/接受时分别用电平/脉冲中断方式 接收超时中断关 接收出错时触发中断 不设置回环 发送中断 发送和接收为中断或者轮询模式 
  rUCON0  = 0x245;  // Control register     
rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 );  //Baud rate divisior register 0                                          //波特率设置 //UART1     
rULCON1 = 0x3;    //设置UART0无奇偶校验,一位停止位,8位数据
rUCON1  = 0x245;    //PCLK为时钟源,接收和发送数据为中断方式 
rUBRDIV1=( (int)(pclk/16./baud+0.5) -1 ); 
//UART2     
rULCON2 = 0x3;     
rUCON2  = 0x245;     
rUBRDIV2=( (int)(pclk/16./baud+0.5) -1 );         
for(i=0;i<100;i++); 
}
l    串口时钟的设置 
pclk    = PCLK;使用PCLK作为串口的时钟。  l      寄存器进行了设置  主要是对三种寄存器进行了设置  rUFCONn (n=0,1,2) —— 串口FIFO控制寄存器                rUMCONn (n=0,1)——串口调制控制寄存器  rULCONn (n=0,1,2)——串口线性控制寄存器                rUCONn(n=0,1,2)——串口控制寄存器                rUBRDIVn(n=0,1,2)——串口Tx,Rx收发速率的设定 
2)串口的选择 
void Uart_Select(int ch)
{   
whichUart = ch;
2 串口发送  串口发送数据通过判断rUTRSTATn (n=0,1,2)的第2位是不是为1来判断发送缓存是否为空。 
1)         
串口发送字节   
void Uart_SendByte(int data)
{   
  if(whichUart==0)    //选择通道0   
{         
if(data=='\n')    //遇到结束符       
{             
while(!(rUTRSTAT0 & 0x2));    //直到发送缓存区为空            // Delay(1);          //because th
e slow response of hyper_terminal              WrUTXH0('\r');    //向发送缓存写入转义字符        }          while(!(rUTRSTAT0 & 0x2));  //等发送完上一个数据      // 
Delay(1);          //because the slow response of hyper_terminal
WrUTXH0(data);    //写入下一个数据到发送缓存    }     
else if(whichUart==1)    //选择通道1   
{         
if(data=='\n')    //遇到结束符       
{             
while(!(rUTRSTAT1 & 0x2));    //直到发送缓存区为空            //Delay(1);                //because the slow response of hyper_terminal                  rUTXH1 = '\r';    //向发送缓存写入转义字符       
}         
while(!(rUTRSTAT1 & 0x2));  //等发送完上一个数据        //Delay(1);         
rUTXH1 = data;    //写入下一个数据到发送缓存    }        else if(whichUart==2)    //选择通道2   
{          isalpha 函数
if(data=='\n')    //遇到结束符       
{             
while(!(rUTRSTAT2 & 0x2));    //直到发送缓存区为空            //Delay(1);                //because the slow response of hyper_terminal           
rUTXH2 = '\r';    //向发送缓存写入转义字符       
}       
while(!(rUTRSTAT2 & 0x2));  //等发送完上一个数据        //Delay(1);         
rUTXH2 = data;    //写入下一个数据到发送缓存 
  }     
}         
首先是串口通道的选择;然后判断THR是否为空,直到等到发送缓存为空,退出while循环;再要发送的字节data放到发送缓存中。如果发送的数据是回车的话,直接发送转义字符/r,当然也要等到THR为空才可以发送。 
2)         
串口发送字符串 
void Uart_SendString(char *pt) 
{     
while(*pt)    //判断是否为空指针       
Uart_SendByte(*pt++);    //发送数据,指针指向下一个数据
把字符串看作是字符数组,字符指针*pt来指代字符数组的首地址,读取指针指向的字符,这样就可以把发送的的字符串逐个进行字节发送了。 
2 串口接收  串口接收通过判断rUTRSTATn (n=0,1,2)的第1位是不是为1来判断发送缓存是否为空。 
1)串口等待接收状态 
void Uart_TxEmpty(int ch) 
{   
if(ch==0)         
while(!(rUTRSTAT0 & 0x4)); //等到发送移位寄存器空   
else if(ch==1)         
while(!(rUTRSTAT1 & 0x4)); //等到发送移位寄存器空             
else if(ch==2)         
while(!(rUTRSTAT2 & 0x4)); //等到发送移位寄存器空
寄存器rUTRSTATn & 0x4  (n=0,1,2)来判断发送移位寄存器是不是为空 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。