CortexM0开发 —— LPC11C14的UART使用方法

LPC1100系列微控制器UART  LPC1100系列Cortex-M0微控制器具有一个符合16C550工业标准的异步串行口(UART)。此口同时增加了调制解调器(Modem)接口,DSR、DCD和RI Modem信号是只用于LQFP48和PLCC44封装的管脚配置。 

 特性  

 16字节收发FIFO; 

 寄存器位置符合16C550工业标准;  

 接收器FIFO触发点可为1、4、8和14字节; 

 内置波特率发生器;  

  用于精确控制波特率的小数分频器,并拥有赖以实现软件流控制的自动波特率检测能力和机制;  

 支持软件或硬件流控制执行;  

 包含标准Modem接口信号(CTS、DCD、DTS、DTR、RI、RTS); 

 支持RS-458/EIA-485的9位模式和输出使能。


【实验步骤】:

先看一下板子上UART的原理图

PL-2303HX是一款UART-USB芯片,这里先不管其原理,我们只学习如何将数据从CPU发送到这个TXD RXD处。


一、LPC11C14 UART 寄存器描述



这里只贴出部分



具体寄存器分析,这里不再阐述,先看一下在头文件中我们这样定义

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. /*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/  
  2. /** @addtogroup LPC11xx_UART LPC11xx Universal Asynchronous Receiver/Transmitter  
  3.   @{ 
  4. */  
  5. typedef struct  
  6. {  
  7.   union {  
  8.   __I  uint32_t  RBR;                   /*!< Offset: 0x000 Receiver Buffer  Register (R/ ) */  
  9.   __O  uint32_t  THR;                   /*!< Offset: 0x000 Transmit Holding Register ( /W) */  
  10.   __IO uint32_t  DLL;                   /*!< Offset: 0x000 Divisor Latch LSB (R/W) */  
  11.   };  
  12.   union {  
  13.   __IO uint32_t  DLM;                   /*!< Offset: 0x004 Divisor Latch MSB (R/W) */  
  14.   __IO uint32_t  IER;                   /*!< Offset: 0x000 Interrupt Enable Register (R/W) */  
  15.   };  
  16.   union {  
  17.   __I  uint32_t  IIR;                   /*!< Offset: 0x008 Interrupt ID Register (R/ ) */  
  18.   __O  uint32_t  FCR;                   /*!< Offset: 0x008 FIFO Control Register ( /W) */  
  19.   };  
  20.   __IO uint32_t  LCR;                   /*!< Offset: 0x00C Line Control Register (R/W) */  
  21.   __IO uint32_t  MCR;                   /*!< Offset: 0x010 Modem control Register (R/W) */  
  22.   __I  uint32_t  LSR;                   /*!< Offset: 0x014 Line Status Register (R/ ) */  
  23.   __I  uint32_t  MSR;                   /*!< Offset: 0x018 Modem status Register (R/ ) */  
  24.   __IO uint32_t  SCR;                   /*!< Offset: 0x01C Scratch Pad Register (R/W) */  
  25.   __IO uint32_t  ACR;                   /*!< Offset: 0x020 Auto-baud Control Register (R/W) */  
  26.        uint32_t  RESERVED0;  
  27.   __IO uint32_t  FDR;                   /*!< Offset: 0x028 Fractional Divider Register (R/W) */  
  28.        uint32_t  RESERVED1;  
  29.   __IO uint32_t  TER;                   /*!< Offset: 0x030 Transmit Enable Register (R/W) */  
  30.        uint32_t  RESERVED2[6];  
  31.   __IO uint32_t  RS485CTRL;             /*!< Offset: 0x04C RS-485/EIA-485 Control Register (R/W) */  
  32.   __IO uint32_t  ADRMATCH;              /*!< Offset: 0x050 RS-485/EIA-485 address match Register (R/W) */  
  33.   __IO uint32_t  RS485DLY;              /*!< Offset: 0x054 RS-485/EIA-485 direction control delay Register (R/W) */  
  34.   __I  uint32_t  FIFOLVL;               /*!< Offset: 0x058 FIFO Level Register (R) */  
  35. } LPC_UART_TypeDef;  
  36. /*@}*/ /* end of group LPC11xx_UART */  

相关宏定义(部分)

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. ****************************************************************************/  
  2. #ifndef __UART_H   
  3. #define __UART_H  
  4.   
  5. #define RS485_ENABLED   0  
  6. #define TX_INTERRUPT    0       /* 0 if TX uses polling, 1 interrupt driven. */  
  7. #define MODEM_TEST      0  
  8.   
  9. #define IER_RBR         (0x01<<0)  
  10. #define IER_THRE        (0x01<<1)  
  11. #define IER_RLS         (0x01<<2)  
  12.   
  13. #define IIR_PEND        0x01  
  14. #define IIR_RLS         0x03  
  15. #define IIR_RDA         0x02  
  16. #define IIR_CTI         0x06  
  17. #define IIR_THRE        0x01  
  18.   
  19. #define LSR_RDR         (0x01<<0)  
  20. #define LSR_OE          (0x01<<1)  
  21. #define LSR_PE          (0x01<<2)  
  22. #define LSR_FE          (0x01<<3)  
  23. #define LSR_BI          (0x01<<4)  
  24. #define LSR_THRE        (0x01<<5)  
  25. #define LSR_TEMT        (0x01<<6)  
  26. #define LSR_RXFE        (0x01<<7)  
  27.   
  28. #define UART0_RBUF_SIZE 64  

二、UART的初始化

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. /***************************************************************************** 
  2. ** Function name:       UARTInit 
  3. ** 
  4. ** Descriptions:        Initialize UART0 port, setup pin select, 
  5. **                      clock, parity, stop bits, FIFO, etc. 
  6. ** 
  7. ** parameters:          UART baudrate 
  8. ** Returned value:      None 
  9. **  
  10. *****************************************************************************/  
  11. void UARTInit(uint32_t baudrate)  
  12. {  
  13.   uint32_t Fdiv;  
  14.   uint32_t regVal;  
  15.   
  16.   UARTTxEmpty = 1;  
  17.   UARTCount = 0;  
  18.     
  19.   NVIC_DisableIRQ(UART_IRQn);  
  20.   
  21.   LPC_IOCON->PIO1_6 &= ~0x07;    /*  UART I/O config */  
  22.   LPC_IOCON->PIO1_6 |= 0x01;     /* UART RXD */  
  23.   LPC_IOCON->PIO1_7 &= ~0x07;      
  24.   LPC_IOCON->PIO1_7 |= 0x01;     /* UART TXD */  
  25.   
  26.   /* Enable UART clock */  
  27.   LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);  
  28.   LPC_SYSCON->UARTCLKDIV = 0x1;     /* divided by 1 */  
  29.   
  30.   LPC_UART->LCR = 0x83;             /* 8 bits, no Parity, 1 Stop bit */  
  31.   regVal = LPC_SYSCON->UARTCLKDIV;  
  32.   Fdiv = ((SystemAHBFrequency/regVal)/16)/baudrate ;    /*baud rate */  
  33.   
  34.   LPC_UART->DLM = Fdiv / 256;                              
  35.   LPC_UART->DLL = Fdiv % 256;  
  36.   LPC_UART->LCR = 0x03;      /* DLAB = 0 */  
  37.   LPC_UART->FCR = 0x07;      /* Enable and reset TX and RX FIFO. */  
  38.   
  39.   /* Read to clear the line status. */  
  40.   regVal = LPC_UART->LSR;  
  41.   
  42.   /* Ensure a clean start, no data in either TX or RX FIFO. */  
  43.   while (( LPC_UART->LSR & (LSR_THRE|LSR_TEMT)) != (LSR_THRE|LSR_TEMT) );  
  44.   while ( LPC_UART->LSR & LSR_RDR )  
  45.   {  
  46.     regVal = LPC_UART->RBR;  /* Dump data from RX FIFO */  
  47.   }  
  48.    
  49.   /* Enable the UART Interrupt */  
  50.   NVIC_EnableIRQ(UART_IRQn);  
  51.   
  52. #if TX_INTERRUPT  
  53.   LPC_UART->IER = IER_RBR | IER_THRE | IER_RLS;  /* Enable UART interrupt */  
  54. #else  
  55.   LPC_UART->IER = IER_RBR | IER_RLS; /* Enable UART interrupt */  
  56. #endif  
  57.   return;  
  58. }  


CortexM0 中UART与CPIO口复用,这里看到用到了PIO1_6 与PIO1_7


1、对IO口进行设置

以PIO1_7寄存器为例

可以看到低3位用于配置管脚功能 001为TXD,PIO1_6配置也相同

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. LPC_IOCON->PIO1_6 &= ~0x07;    /*  UART I/O config */  
  2. LPC_IOCON->PIO1_6 |= 0x01;     /* UART RXD */  
  3. LPC_IOCON->PIO1_7 &= ~0x07;    
  4. LPC_IOCON->PIO1_7 |= 0x01;     /* UART TXD */  

2、时钟设置

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. /* Enable UART clock */  
  2.   LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);  
  3.   LPC_SYSCON->UARTCLKDIV = 0x1;     /* divided by 1 */  

3、设置波特率、数据位

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. LPC_UART->LCR = 0x83;             /* 8 bits, no Parity, 1 Stop bit */  
  2. regVal = LPC_SYSCON->UARTCLKDIV;  
  3. Fdiv = ((SystemAHBFrequency/regVal)/16)/baudrate ;  /*baud rate */  

4、UART相应配置

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. LPC_UART->DLM = Fdiv / 256;                            
  2. LPC_UART->DLL = Fdiv % 256;  
  3. LPC_UART->LCR = 0x03;        /* DLAB = 0 */  
  4. LPC_UART->FCR = 0x07;        /* Enable and reset TX and RX FIFO. */  
第4行 FCR为 FIFO控制寄存器。控制UART  FIFO的使用和模式 


5、使能中断等操作

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1.   /* Read to clear the line status. */  
  2.   regVal = LPC_UART->LSR;  
  3.   
  4.   /* Ensure a clean start, no data in either TX or RX FIFO. */  
  5.   while (( LPC_UART->LSR & (LSR_THRE|LSR_TEMT)) != (LSR_THRE|LSR_TEMT) );  
  6.   while ( LPC_UART->LSR & LSR_RDR )  
  7.   {  
  8.     regVal = LPC_UART->RBR;  /* Dump data from RX FIFO */  
  9.   }  
  10.    
  11.   /* Enable the UART Interrupt */  
  12.   NVIC_EnableIRQ(UART_IRQn);  
  13.   
  14. #if TX_INTERRUPT  
  15.   LPC_UART->IER = IER_RBR | IER_THRE | IER_RLS;  /* Enable UART interrupt */  
  16. #else  
  17.   LPC_UART->IER = IER_RBR | IER_RLS; /* Enable UART interrupt */  
  18. #endif  
LCR寄存器作用



三、发送数据

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. /***************************************************************************** 
  2. ** Function name:       UARTSend 
  3. ** 
  4. ** Descriptions:        Send a block of data to the UART 0 port based 
  5. **                      on the data length 
  6. ** 
  7. ** parameters:          buffer pointer, and data length 
  8. ** Returned value:      None 
  9. **  
  10. *****************************************************************************/  
  11. void UARTSend(uint8_t *BufferPtr, uint32_t Length)  
  12. {  
  13.     
  14.   while ( Length != 0 )  
  15.   {  
  16.       /* THRE status, contain valid data */  
  17. #if !TX_INTERRUPT  
  18.       while ( !(LPC_UART->LSR & LSR_THRE) );  
  19.       LPC_UART->THR = *BufferPtr;  
  20. #else  
  21.       /* Below flag is set inside the interrupt handler when THRE occurs. */  
  22.       while ( !(UARTTxEmpty & 0x01) );  
  23.       LPC_UART->THR = *BufferPtr;  
  24.       UARTTxEmpty = 0;  /* not empty in the THR until it shifts out */  
  25. #endif  
  26.       BufferPtr++;  
  27.       Length--;  
  28.   }  
  29.   return;  
  30. }  



四、接收数据

       这里利用中断

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. /***************************************************************************** 
  2. ** Function name:       UART_IRQHandler 
  3. ** 
  4. ** Descriptions:        UART interrupt handler 
  5. ** 
  6. ** parameters:          None 
  7. ** Returned value:      None 
  8. **  
  9. *****************************************************************************/  
  10. void UART_IRQHandler(void)  
  11. {  
  12.   uint8_t IIRValue, LSRValue;  
  13.   uint8_t Dummy = Dummy;  
  14.   
  15.   IIRValue = LPC_UART->IIR;  
  16.       
  17.   IIRValue >>= 1;         /* skip pending bit in IIR */  
  18.   IIRValue &= 0x07;         /* check bit 1~3, interrupt identification */  
  19.   if (IIRValue == IIR_RLS)      /* Receive Line Status */  
  20.   {  
  21.     LSRValue = LPC_UART->LSR;  
  22.     /* Receive Line Status */  
  23.     if (LSRValue & (LSR_OE | LSR_PE | LSR_FE | LSR_RXFE | LSR_BI))  
  24.     {  
  25.       /* There are errors or break interrupt */  
  26.       /* Read LSR will clear the interrupt */  
  27.       UARTStatus = LSRValue;  
  28.       Dummy = LPC_UART->RBR; /* Dummy read on RX to clear  
  29.                                 interrupt, then bail out */  
  30.       return;  
  31.     }  
  32.     if (LSRValue & LSR_RDR) /* Receive Data Ready */              
  33.     {  
  34.       /* If no error on RLS, normal ready, save into the data buffer. */  
  35.       /* Note: read RBR will clear the interrupt */  
  36.       UARTBuffer[UARTCount++] = LPC_UART->RBR;  
  37.       if (UARTCount >= UART0_RBUF_SIZE)  
  38.       {  
  39.         UARTCount = 0;      /* buffer overflow */  
  40.       }   
  41.     }  
  42.   }  
  43.   else if (IIRValue == IIR_RDA) /* Receive Data Available */  
  44.   {  
  45.     /* Receive Data Available */  
  46.     UARTBuffer[UARTCount++] = LPC_UART->RBR;  
  47.     if (UARTCount >= UART0_RBUF_SIZE)  
  48.     {  
  49.       UARTCount = 0;        /* buffer overflow */  
  50.     }  
  51.   }  
  52.   else if (IIRValue == IIR_CTI) /* Character timeout indicator */  
  53.   {  
  54.     /* Character Time-out indicator */  
  55.     UARTStatus |= 0x100;        /* Bit 9 as the CTI error */  
  56.   }  
  57.   else if (IIRValue == IIR_THRE)    /* THRE, transmit holding register empty */  
  58.   {  
  59.     /* THRE interrupt */  
  60.     LSRValue = LPC_UART->LSR;        /* Check status in the LSR to see if 
  61.                                 valid data in U0THR or not */  
  62.     if (LSRValue & LSR_THRE)  
  63.     {  
  64.       UARTTxEmpty = 1;  
  65.     }  
  66.     else  
  67.     {  
  68.       UARTTxEmpty = 0;  
  69.     }  
  70.   }  
  71.   return;  
  72. }  

下面学习一下UART中断


对于UART接口来说,有两种情况可以触发UART接收中断:接收字节数达到接收FIFO的触发点(RDA)、接收超时(CTI)。

(1) 接收字节数达到接收FIFO中的触发点(RDA)

     LPC1100系列Cortex-M0微控制器UART接口具有16字节的接收FIFO,接收触发点可以设置为1、4、8、14字节,当接收到的字节数达到接收触发点时,便会触发中断。

     通过UART FIFO控制寄存器U0FCR,将接收触发点设置为“8字节触发”。那么当UART接收8个字节时,便会触发RDA中断(注:在接收中断使能的前提下)。


下面看一下IIR



五、其他操作补充

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. /******************************************************************************* 
  2. * Function Name  : UART0_PutChar 
  3. * Description    : Send a char to uart0 channel. 
  4. * Input          : c 
  5. * Output         : None 
  6. * Return         : None 
  7. *******************************************************************************/  
  8. void UART0_PutChar(char ch)  
  9. {  
  10.   while(!(LPC_UART->LSR & LSR_THRE));  
  11.   LPC_UART->THR = ch;  
  12. }  
  13.   
  14. /******************************************************************************* 
  15. * Function Name  : uart0_sendstring 
  16. * Description    : Send string to uart0 channel. 
  17. * Input          : pString  --  string 
  18. * Output         : None 
  19. * Return         : None 
  20. *******************************************************************************/  
  21. void UART0_PutString(char *pString)  
  22. {  
  23.   while(*pString)  
  24.   {  
  25.     UART0_PutChar(*pString++);  
  26.   }  
  27. }  
  28.   
  29. /******************************************************************************* 
  30. * Function Name  : UART0_printf 
  31. * Description    : print format string. 
  32. * Input          : fmt 
  33. * Output         : None 
  34. * Return         : None 
  35. *******************************************************************************/  
  36. void UART0_printf(char *fmt, ...)  
  37. {  
  38.   char      uart0_pString[101];  
  39.   va_list   uart0_ap;  
  40.   
  41.   va_start(uart0_ap, fmt);  
  42.   vsnprintf(uart0_pString, 100, fmt, uart0_ap);  
  43.   UART0_PutString(uart0_pString);  
  44.   va_end(uart0_ap);  
  45. }  
  46.   
  47. /******************************************************************************* 
  48. * Function Name  : UART0_GetChar 
  49. * Description    : print format string. 
  50. * Input          : fmt 
  51. * Output         : None 
  52. * Return         : None 
  53. *******************************************************************************/  
  54. uint8_t UART0_GetChar(uint8_t *ch)  
  55. {  
  56.   if(UART_op != UARTCount)  
  57.   {  
  58.     *ch = UARTBuffer[UART_op];  
  59.     UART_op ++;  
  60.     if(UART_op >= UART0_RBUF_SIZE)  
  61.       UART_op = 0;  
  62.   
  63.     return 1;  
  64.   }  
  65.   
  66.   return 0;  
  67. }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux SD卡驱动开发(一) —— SD 相关基础概念

一.SD/MMC卡基础概念 1.1.什么是MMC卡 MMC&#xff1a;MMC就是MultiMediaCard的缩写&#xff0c;即多媒体卡。它是一种非易失性存储器件&#xff0c;体积小巧(24mm*32mm*1.4mm)&#xff0c;容量大,耗电量低,传输速度快&#xff0c;广泛应用于消费类电子产品中。 1.2.什么是SD卡…

Linux SD卡驱动开发(二) —— SD 卡驱动分析HOST篇

回顾一下前面的知识&#xff0c;MMC 子系统范围三个部分&#xff1a; HOST 部分是针对不同主机的驱动程序&#xff0c;这一部是驱动程序工程师需要根据自己的特点平台来完成的。 CORE 部分: 这是整个MMC 的核心存&#xff0c;这部分完成了不同协议和规范的实现&#xff0c;并为…

MVC应用程序显示RealPlayer(rm)视频

本篇博文是演示MVC应用程序显示RealPlayer视频。 客户端能观看到RealPlayer视频&#xff0c;前提条件是需要安装RealPlayer客户端&#xff0c;就是想看Falsh或理WMV视频一样&#xff0c;均要安装客户端或相关插件等。 Insus.NET实现方法&#xff0c;还是在控制器中Render RealP…

Linux从入门到精通系列之PPTP

Linux从入门到精通系列之PPTP今天我们来说下怎么在linux环境下如何搭建PPTP-&#xff0c;PPTP&#xff08;Point to Point Tunneling Protocol&#xff09;&#xff0c;即点对点隧道协议。该协议是在PPP协议的基础上开发的一种新的增强型安全协议&#xff0c;支持多协议虚拟专用…

Linux SD卡驱动开发(三) —— SD 卡驱动分析CORE篇

废话不多说&#xff0c;直接切进主题&#xff1a; Linux在内核源码的drivers/mmc/core文件夹下为我们的提供了一系列SD卡的接口服务函数。可以查看Makefile如下 可见&#xff0c;core文件夹下有针对总线的服务bus.c&#xff0c;针对主控制器的服务host.c&#xff0c;针对SD卡的…

Python数值计算:一 使用Pylab绘图(1)

Pylab的使用 学习使用Python进行科学计算&#xff0c;然而很难找到简单实用&#xff0c;又循序渐进的例子。正好手边有一本《Matlab可视化大学物理学》&#xff0c;里面的例子非常清晰地解释了Matlab在物理学中的应用。重新使用Python实现这些例子&#xff0c;学习了Python&…

Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作

前面对SD卡控制器有了一个基本的介绍。其实SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法&#xff0c;当然不同的控制器对硬件控制的方法不尽相同&#xff0c;但是他们最终都能像core层提交一个统一的封装有操作方法的数据结构&#xff0c;那便是即将闪亮登场…

Linux SD卡驱动开发(五) —— SD 卡驱动分析Core补充篇

Core层中有两个重要函数 mmc_alloc_host 用于构造host&#xff0c;前面已经学习过&#xff0c;这里不再阐述&#xff1b;另一个就是 mmc_add_host,用于注册host 前面探测函数s3cmci_probe&#xff0c;现在就来回顾一下这个函数的作用。先简要的概括一下这个函数的功能&#xff…

navicat连接oracle 报 ORA-12737 set CHS16GBK

2019独角兽企业重金招聘Python工程师标准>>> 1首 先&#xff0c;我们打开“工具”-->"选项"菜单&#xff0c;见到如下界面&#xff0c;依据OCI library(oci.dll) 路径&#xff0c;导航到 navicat oci 目录下&#xff0c;备份里面的文件&#xff08;通过…

Linux SD卡驱动开发(六) —— SD卡启动过程总体分析

一、工作流程 mmc驱动主要文件包括 drivers/mmc/card/block.c drivers/mmc/card/queue.c drivers/mmc/core/core.c drivers/mmc/core/host.c drivers/mmc/core/ 内核启动时&#xff0c;首先执行core/core.c的mmc_init&#xff0c;注册mmc、sd总线&#xff0c;以及一个host clas…

svn怎么上传文件 — 百度经验无耻推广

2019独角兽企业重金招聘Python工程师标准>>> svn怎么上传文件 — 欢乐地点进去捧场 PS&#xff1a;觉得笔者太无耻&#xff0c;直接在下方评论抨击 转载于:https://my.oschina.net/cenqingbo/blog/212284

apache 重写和虚拟目录配置

要求&#xff1a;假如我请求一个地址&#xff1a;www.lxy.com/news-sport-id123.html转成&#xff1a;www.lxy.com/show.php?catenews&classsport&id123步骤&#xff1a;①首先我们需要在apache中启用rewrite模块打开apache的httpd.conf文件&#xff0c;找到#LoadModu…

JavaScript代码片段

简介&#xff1a;本文收集了我常用的JavaScript代码片段&#xff0c;欢迎提意见&#xff01; 大灰狼边敲门边说&#xff1a;“小兔子乖乖&#xff0c;把门儿开开&#xff01;” 小兔子听到后&#xff0c;连忙去开门&#xff1a;“来喽&#xff01;” 兔妈妈对小兔子喊道&#x…

路由器开发(一)—— 路由器硬件结构及软件体系

一、路由器的硬件构成 路由器主要由以下几个部分组成&#xff1a;输入/输出接口部分、包转发或交换结构部分&#xff08;switching fabric&#xff09;、路由计算或处理部分。如图所示 图1 路由器的基本组成 输入端口是物理链路和输入包的进口处。端口通常由线卡提供&#…

路由器开发(二)—— 路由器工作原理

当信息需要在两个网络之间传输时&#xff0c;常用路由器这种互连设备来负责数据的传输。路由器的主要工作是&#xff1a;路径的决定和数据包的转发&#xff08;从路由器一个接口输入&#xff0c;然后选择合适接口输出&#xff09;&#xff1b;维护路由表。 路由器工作的方式非常…

Android颜色渐变的分隔线(ListView)

2019独角兽企业重金招聘Python工程师标准>>> shape.xml xx <?xml version"1.0" encoding"utf-8"?><shape xmlns:android"http://schemas.android.com/apk/res/android" > <gradient android:startColor&qu…

项目实践中Linux集群的总结和思考

2019独角兽企业重金招聘Python工程师标准>>> 前言&#xff1a;作为一名Linux/unix系统工程师、项目实施工程师&#xff0c;这几年一直在涉及到对外项目&#xff0c;经手过许多小中型网站的架构&#xff0c;F5、LVS及Nginx接触的都比较多&#xff0c;我想一种比较通俗…

路由器基础知识详解

第一章 网络互联 网络的根本目的非常简单&#xff1a;方便人们交换所获得的信息。但是网络的应用需求非常复杂&#xff1a;有的用户希望高带宽&#xff0c;但并不要求很长的传输距离&#xff1b;有的用户要求很长的距离&#xff0c;但对带宽要求很低&#xff1b;有的对网络的…

事务与锁机制

2019独角兽企业重金招聘Python工程师标准>>> 事务定义&#xff1a; 访问并可能更新数据库&#xff1a;一句或一组SQL&#xff0c;或者是一段程序&#xff0c;反正update了就是事务 ACID的4原则&#xff1a; 原子性&#xff1a; 一致性&#xff1a; 隔离性&#xff1…

路由器 VS OSI七层模型

OSI Open Source Initiative&#xff08;简称OSI&#xff0c;有译作开放源代码促进会、开放原始码组织&#xff09;是一个旨在推动开源软件发展的非盈利组织。OSI参考模型&#xff08;OSI/RM&#xff09;的全称是开放系统互连参考模型&#xff08;Open System Interconnection …