
一、 故障现象及处理
单位以Cisco7513路由器作为广域网骨干路由器,采用标准配置,IOS的版本为111。一日发现该路由器的2M主干出口线路协议处于down状态,从而使与之相联的网络中断,用“show running-config”命令检查所有运行参数,没有发现错误;又用“show interfaces serial”命令检查串口,发现某些端口状态up,而线路协议是 down,并且出现这种情况的串口均在同一个串口板(A板)上,其它各模块工作正常。经查所有物理线路也都正常,从而排除了线路故障的可能性。然而在一般情况下同一个串口板上的串口同时出现线路故障的可能性也并不大。至此可以初步确定可能A板出了问题。当进入全局配置模式后,再想进入A板上串口的端口配置模式时却发现无法实现,每次键入“interface serial串口号”时,总是报错,但是同样的命令却可以进入其它串口的端口配置模式。这时,可以初步判断IOS本身出现了某种软件故障,用reload 命令重启路由器后系统进入ROMmonitor模式,提示符为“rommon>”,键入命令“boot”可启动路由器但故障依然存在,而且所有A板串口的配置语句全都报错。
再将路由器关电然后加电时观察到:路由器的交流(或直流)OK LED灯为绿色,这说明系统的供电子系统工作正常,风扇旋转正常且输出错误LED灯未亮,这说明冷却子系统工作正常,路由交换处理器(RSP)的LED灯为绿色,这也表示系统工作正常。各接口的Enable LED灯为绿色,表示RSP已完成了接口处理器的初始化。但A板的LED灯全闪了一下就灭了,执行“reset”命令再用“boot”引导系统后所有A板串口的配置语句全部消失了。
进一步检查A板时发现其型号为VIP2,其上的两个子模块中只安装了一个四串口子模块,因此A板上只有四个串(可扩充至8个),其中三个串口已使用,一个空闲。正常时三个使用的串口的LED灯应亮,而未使用的串口的LED灯应为**,但目前却是四个串口的LED都不亮。系统启动后,用命令“show version”可以发现系统已找到了A板并识别出该板的型号为VIP2,只是没有详细信息。为进一步压缩故障,将A板调换插槽安装,故障依然存在;将A 板安装在另一台无故障的机器上时,则一切正常。
通过以上的步骤,将故障压缩到路由器配置参数上了。再用“show version”命令,在显示信息的最后一行,发现路由器配置寄存器数值为0x0,将其修改为0x2102后,重新引导路由器,将备份配置从 tftpserver上拷入running-config后,路由器工作恢复正常,至此排除了这一貌似硬件接口损坏而实为软件参数设置错误的故障。
二、故障原因分析
72、75等系列高档路由器寄存器值由四个16进制数组成,其中低4位决定系统的启动方式:
当最低4位为0-0-0-0,路由器不装载系统镜像,而是进入监控状态(ROM monitor mode)或维护状态(Maintenance mode),需要手工引导。
当最低4位为0-0-0-1,路由器装载从ROMs里找到的系统镜像。
当最低4位为0-0-1-0至于1-1-1-1之间,路由器按启动配置中BOOT SYSTEM命令的设置装载 *** 作系统镜像,如果没有设置该命令则从一个默认的网络服务器上的系统镜像中装载 *** 作系统镜像。
当第6位为1时,路由器启动时忽略NVRAM中的配置。例如:
0x0 :不自动装载 *** 作系统镜像而是进入ROM monitor模式等待用户键入命令(如上例故障,仅能用“boot”引导系统不能加载接口模块IOS);
0xf :按启动配置中的命令或从一个默认的网络服务器上的系统镜像中装载 *** 作系统镜像(Cisco 72系列、Cisco75系列等,不能从ROM引导)。
0x101:禁止break健,直接从ROM中引导。
0x2102:一般为引值。
0x2142:启动时忽略startup-config。
现在举一个自动从flash memory引导的例子:
Router # configure terminal
Router (config) # boot system flash gsnew-image
Router (config) # config-register 0x010f
^Z
Router # copy running-config startup-config
[ok]
Router # reload
[confirm]
串口时钟使能,GPIO 时钟使能
2) 串口复位
3) GPIO 端口模式设置
4) 串口参数初始化
5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)
6) 使能串口
7) 编写中断处理函数
串口时钟使能。串口是挂载在 APB2 下面的外设,所以使能函数为:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);
2串口复位。当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置
这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外
设的 *** 作。复位的是在函数 USART_DeInit()中完成:
void USART_DeInit(USART_TypeDef USARTx);//串口复位
比如我们要复位串口 1,方法为:
USART_DeInit(USART1); //复位串口 1
3串口参数初始化。串口初始化是通过 USART_Init()函数实现的,
void USART_Init(USART_TypeDef USARTx, USART_InitTypeDef USART_InitStruct);
这个函数的第一个入口参数是指定初始化的串口标号,这里选择 USART1。
第二个入口参数是一个 USART_InitTypeDef 类型的结构体指针,这个结构体指针的成员变量用
来设置串口的一些参数。一般的实现格式为:
USART_InitStructureUSART_BaudRate = bound; //一般设置为 9600;
USART_InitStructureUSART_WordLength = USART_WordLength_8b;//字长为 8 位数据格式
USART_InitStructureUSART_StopBits = USART_StopBits_1; //一个停止位
USART_InitStructureUSART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStructureUSART_HardwareFlowControl
= USART_HardwareFlowControl_None; //无硬件数据流控制
USART_InitStructureUSART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口
从上面的初始化格式可以看出初始化需要设置的参数为:波特率,字长,停止位,奇偶校验位,
硬件数据流控制,模式(收,发)。我们可以根据需要设置这些参数。
4数据发送与接收。STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是
一个双寄存器,包含了 TDR 和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收
到数据的时候,也是存在该寄存器内。
STM32 库函数 *** 作 USART_DR 寄存器发送数据的函数是:
void USART_SendData(USART_TypeDef USARTx, uint16_t Data);
通过该函数向串口寄存器 USART_DR 写入一个数据。
STM32 库函数 *** 作 USART_DR 寄存器读取串口接收到的数据的函数是:
uint16_t USART_ReceiveData(USART_TypeDef USARTx);
通过该函数可以读取串口接受到的数据。
5串口状态。串口的状态可以通过状态寄存器 USART_SR 读取。USART_SR 的各位描述如
这里我们关注一下两个位,第 5、6 位 RXNE 和 TC。
RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并
且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将
该位清零,也可以向该位写 0,直接清除。
TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如
果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读 USART_SR,写
USART_DR。2)直接向该位写 0。
状态寄存器的其他位我们这里就不做过多讲解,大家需要可以查看中文参考手册。
在我们固件库函数里面,读取串口状态的函数是:
FlagStatus USART_GetFlagStatus(USART_TypeDef USARTx, uint16_t USART_FLAG);
这个函数的第二个入口参数非常关键,它是标示我们要查看串口的哪种状态,比如上面讲解的
RXNE(读数据寄存器非空)以及 TC(发送完成)。例如我们要判断读寄存器是否非空(RXNE), ***
作库函数的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_RXNE);
我们要判断发送是否完成(TC), *** 作库函数的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_TC);
这些标识号在 MDK 里面是通过宏定义定义的:
通过串口,获取开关状态的输入?这应该是单片机检测开关状态,然后从串 口发送出去,送给电脑,或送给另外的单片机,是这样的吧。
这很容易,只要会写串口发送程序就行了。至于检测开关状态,就更容易了,有几个开关,都接一个并口上,随时读出这个并口,就可以随时检测开关的状态了。如果状态有变化就把读取同并口状态(就是开关的状态)从串口发送出去就行了。
下面就是一个双机通信的实例,甲机检测16个开关状态,将状态发送到乙机,乙机接收后控制16个LED灯,LED灯的状态与甲机的开关状态完全相同。甲机开关接通,乙机对应的LED灯亮。
方法如下:
1、如下拓扑图,电脑1和电脑2分别接在交换机1口和2口,1口作为监控口,2口作为被监控口,即通过电脑3接配置线,即USB转串口线连接交换机console口配置华为5700。
2、电脑3通过配置线连接华为5700后,进入交换机配置界面,输入sys,按下回车键进入#模式,即全局配置模式。
3、执行命令display interface brief,可以查看交换机当前端口的开放状态。down表示端口关闭,up表示端口开启,在这里可以看出,拓扑图里直接了电脑1和电脑2,所以只有1口和2口是UP状态。
4、此时在全局模式下输入interface GigabitEthernet 0/0/1,进入子接口1口,命令为port-mirroring to observe-port 1 both,both表示流量的方向是双向的,若只想镜像出口流量,则将both改为outbound,只想镜像进口流量,则把both改为inbound。
5、在以上步骤配置完成后,输入qui回车推出子接口模式,在全局模式下输入observe-port 1 interface GigabitEthernet 0/0/2,配置被监控端口。
6、再执行命令display observe-port,如图已显示端口2代表成功。此时端口镜像已经做好了,可通过电脑1安装抓包软件,对交换机端口2,即电脑2上产生的流量进行分析。
以上就是关于路由器故障处理及分析全部的内容,包括:路由器故障处理及分析、stm32怎样设置串口发送与接收、通过串口,获取开关状态的输入,如何实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)