一种Linux系统中复用调试串口的方法转让专利

申请号 : CN201410269275.5

文献号 : CN104008008B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陈义华吕瑞明范少卓李琦鲁林华

申请人 : 厦门雅迅网络股份有限公司

摘要 :

本发明公开一种Linux系统中复用调试串口的方法,其包括:步骤1:设置复用调试串口规则:创建2个驱动,记为驱动线程ttyA和驱动线程ttyB;创建Uart0模块,该Uart0模块用于收发串口数据;建立通信规则,使驱动线程ttyA和驱动线程ttyB在同一时间不能同时使用Uart0模块;配置Linux系统的内核启动参数,指定控制台使用的是驱动线程ttyA;步骤2:Linux系统启动时,首先检测驱动线程ttyB是否启动,如果没有启动,系统默认处于调试模式;步骤3:Linux实时监测调试串口,当调试串口有数据传输时,检测当前调试串口的工作模式;如果是处于调试模式,则将串口数据推入驱动线程ttyA的缓冲区,等待处理;如果是处于外设模式,则将串口数据推入驱动线程ttyB的缓冲区,等待获取串口数据并处理。

权利要求 :

1.一种Linux系统中复用调试串口的方法,包括如下步骤:

步骤1:设置复用调试串口规则:

首先创建2个驱动,记为驱动线程ttyA和驱动线程ttyB,驱动线程ttyA用于调试,驱动线程ttyB用于与外设通信;

然后创建Uart0模块,该Uart0模块用于收发串口数据;

然后建立通信规则,使驱动线程ttyA和驱动线程ttyB在同一时间不能同时使用Uart0模块,以免出现错误;

最后配置Linux系统的内核启动参数,指定控制台使用的是驱动线程ttyA;

步骤2:Linux系统启动时,首先检测驱动线程ttyB是否启动,如果驱动线程ttyB没有启动,系统默认处于调试模式,用于输出调试信息;当有应用程序需要使用串口的外设模式时,打开驱动线程ttyB并改变串口功能即可;其中,调试串口的工作模式包括调试模式和外设模式,调试模式用于输出调试信息,外设模式用于通过串口进行数据传输;

步骤3:Linux实时监测调试串口,当调试串口有数据传输时,检测当前调试串口的工作模式;如果是处于调试模式,则将串口数据推入驱动线程ttyA的缓冲区,等待系统处理;如果是处于外设模式,则将串口数据推入驱动线程ttyB的缓冲区,等待应用程序获取串口数据并处理;

其中,所述步骤1中,在驱动线程ttyB内部设置多对缓冲区,每对缓冲区缓冲对应应用程序的数据;步骤3中,串口的工作模式的切换,是通过外部向串口发送特定数据帧来实现,当Uart0模块检测到该特定数据帧,对其进行解析,从而获得当前待使用串口的应用程序,并将后续的数据缓存至相应应用程序的缓冲区,同时,数据的发送从该相应应用程序的缓冲区获取,从而实现多个应用程序分时复用串口的功能。

2.根据权利要求1所述的Linux系统中复用调试串口的方法,其特征在于:步骤3中,检测当前调试串口的工作模式,通过以下过程:在Linux系统的内核上设置一个导出变量,该导出变量用于标记当前调试串口的工作模式,当工作模式改变时,同时修改该导出变量。

3.根据权利要求1或2所述的Linux系统中复用调试串口的方法,其特征在于:步骤3中,当调试串口的工作模式从外设模式切换成调试模式时,通过发送特定的ascii码来切换当前的工作模式,驱动线程ttyB收到相应的通知后,将释放Uart0模块,并且Uart0模块将后续收到的串口数据推入驱动线程ttyA的缓冲区。

4.根据权利要求3所述的Linux系统中复用调试串口的方法,其特征在于:步骤3中,只要检测到预设时间内有调试指令输入,则始终保持释放Uart0模块的状态,当调试结束后,驱动线程ttyB自动占用Uart0模块,串口恢复成外设模式。

说明书 :

一种Linux系统中复用调试串口的方法

技术领域

[0001] 本发明涉及通信领域,尤其涉及Linux系统中的复用调试串口的方法。

背景技术

[0002] 嵌入式设备通常需要一个串口作为调试串口,用于输出调试信息以及接收外部的命令。串口同一时间只能用于调试或者接外设,而不能同时用于调试和接外设。由于嵌入式设备的串口资源都较少,如果能将调试串口既用于调试作用,又能接外设使用,则可以最大限度的使用串口资源,降低硬件成本。
[0003] 为此,一篇申请号为201310263610.6的中国发明专利,公开了一种串口分时复用的方法及系统。该发明通过在嵌入式操作系统中导出禁止接口、使能接口和提供一套第二串口驱动,实现当应用程序访问串口时,控制台停止访问串口;当应用程序停止访问串口时,控制台恢复访问串口,使得控制台和应用程序能够分时复用串口,从而避免了通信冲突。该发明虽然在一定程度上避免了通信冲突,但是具有以下问题:
[0004] 1、其实现方式上使用2个串口驱动(第一串口驱动、第二串口驱动)的方式,两个串口驱动都将占用物理串口,同时通过导出禁止接口、使能接口来达到独占使用串口资源的目的,这使得程序架构显得复杂、冗余;
[0005] 2、根据该发明的描述,其需要显式的调用禁止接口、使能接口来切换串口的使用者,因此当串口被应用程序占用时,如何通知应用程序释放串口是一个重要的问题。特别是在没有图形界面的操作系统上,当串口被应用程序(非控制台)占用时,由于此时控制台无法正常使用,无法通过控制台去通知应用程序释放串口。
[0006] 因此该专利在实际使用上具有很大的局限性,仅用2个驱动的使能接口、禁止接口是无法达到预期目标的,需要进一步的完善、补充和改进。

发明内容

[0007] 因此,针对上述的问题,本发明提出一种在Linux系统中复用调试串口的方法将串口数据的处理和接收分隔开来,使得系统和外设可以分时使用同一个串口,以达到最大限度使用串口资源的目的。
[0008] 为了解决上述技术问题,本发明所采用的思路是,针对Linux系统调试串口的工作原理,分隔调试串口数据的获取流程与处理流程,通过软件上的开关,控制调试串口数据的获取与否,从而决定调试串口是处于系统调试模式还是接外设的模式。具体的,本发明的一种Linux系统中复用调试串口的方法,包括如下步骤:
[0009] 步骤1:设置复用调试串口规则:
[0010] 首先创建2个驱动,记为驱动线程ttyA和驱动线程ttyB,驱动线程ttyA用于调试,驱动线程ttyB用于与外设通信;
[0011] 然后创建Uart0模块,该Uart0模块用于收发串口数据;
[0012] 然后建立通信规则,使驱动线程ttyA和驱动线程ttyB在同一时间不能同时使用Uart0模块,以免出现错误;
[0013] 最后配置Linux系统的内核启动参数,指定控制台使用的是驱动线程ttyA。以android系统为例,配置系统内核启动参数如下:CMDLINE:console=ttyA androidboot.console=ttyA init=/init initrd=0x62000000,0x00800000,从而指定控制台使用的是“串口”ttyA;
[0014] 步骤2:Linux系统启动时,首先检测驱动线程ttyB是否启动,如果驱动线程ttyB没有启动,则没有应用程序启动该驱动线程ttyB,此时系统默认处于调试模式,用于输出调试信息;当有应用程序需要使用串口的外设模式时,打开驱动线程ttyB并改变串口功能即可,例如android系统,可通过ioctrl指令改变串口功能;串口的具体用途并无优先级之分,可根据实际需要来建议优先级规则;其中,调试串口的工作模式包括调试模式和外设模式,调试模式用于输出调试信息,外设模式用于通过串口进行数据传输;
[0015] 步骤3:Linux实时监测调试串口,当调试串口有数据传输时,检测当前调试串口的工作模式;如果是处于调试模式,则将串口数据推入驱动线程ttyA的缓冲区,等待系统处理;如果是处于外设模式,则将串口数据推入驱动线程ttyB的缓冲区,等待应用程序获取串口数据并处理。
[0016] 当需要多个应用程序分时使用串口时,所述步骤1中,在驱动线程ttyB内部设置多对缓冲区,每对缓冲区缓冲对应应用程序的数据;步骤3中,串口的工作模式的切换,是通过外部向串口发送特定数据帧来实现,当Uart0模块检测到该特定数据帧,对其进行解析,从而获得当前待使用串口的应用程序,并将后续的数据缓存至相应应用程序的缓冲区,同时,数据的发送从该相应应用程序的缓冲区获取,从而实现多个应用程序分时复用串口的功能。
[0017] 其中,步骤3中,检测当前调试串口的工作模式,可以通过以下过程:在Linux系统的内核上设置一个导出变量,该导出变量用于标记当前调试串口的工作模式(调试模式或者外设模式),当工作模式改变时,同时修改该导出变量。该导出变量可以通过驱动的相应指令(例如android系统可通过ioctrl指令)进行更改,即切换调试模式、外设模式。
[0018] 更进一步的,步骤3中,Linux系统通过调试串口进行数据传输,由于与调试串口所连接的外设(外接设备)通信时,都会有数据通信格式,而系统调试信息都是没有帧格式的可见字符(ascii码),因此当调试串口需要从外设模式切换成调试模式时,可以通过发送特定的ascii码来通知驱动切换当前的串口工作模式,驱动线程ttyB收到相应的通知后,将释放Uart0模块,并且Uart0模块会将后续收到的串口数据推入驱动线程ttyA的缓冲区。同时只要检测到预设时间内有调试指令输入,则始终保持释放Uart0模块的状态,当调试结束后,驱动线程ttyB自动占用Uart0模块,串口恢复成外设模式。
[0019] 本发明通过上述方法,与现有技术相比,其有益效果为:
[0020] 1、通过编写2个驱动线程ttyA和ttyB,将串口数据的处理和接收分隔开来,从而使得系统和外设可以分时使用同一个串口,以达到最大限度使用串口资源的目的;
[0021] 2、本发明的方法无需对外设做任何修改即可使用,成本低廉,简单方便;
[0022] 3、本发明的方法与其它方法相比,只需要在Linux系统创建两个驱动线程,并做简单的设置即可实现调试串口复用,无需对系统的调试串口使用流程进行复杂的改写,易于实现;
[0023] 4、当需要进行调试时,无需重启系统,发送特定的ascii字符即可将串口功能切换为调试功能,这有利于保存调试现场。

附图说明

[0024] 图1为本发明的复用调试串口的方法的原理示意图;
[0025] 图2为本发明的复用调试串口的方法的流程图。

具体实施方式

[0026] 现结合附图和具体实施方式对本发明进一步说明。
[0027] 本发明提出了一种通过软件复用串口的方法,主要思路如图1所示:针对Linux系统调试串口的工作原理,分隔调试串口数据的获取流程与处理流程,通过软件上的开关控制调试串口数据的获取与否,从而决定调试串口是出于系统调试模式还是接外设的模式。
[0028] 实施例1
[0029] 本发明以android系统为例来说明实现上述复用调试串口的方法,参见图2,主要过程如下:
[0030] 步骤1、编写2个tty驱动:驱动线程ttyA、驱动线程ttyB,驱动线程ttyA用于调试,驱动线程ttyB用于与外设通信;
[0031] 步骤2、编写实际的物理串口Uart0模块的数据收发代码,驱动线程ttyA和驱动线程ttyB同一时间只能有一者使用该代码,以免出现错误;
[0032] 步骤3、配置android系统的内核启动参数:CMDLINE:console=ttyA androidboot.console=ttyA init=/init,initrd=0x62000000,0x00800000,从而指定控制台使用的是“串口”ttyA;
[0033] 步骤4、在android系统的内核设置一个导出变量,用于标记当前调试串口的用途,该变量可以通过驱动的ioctrl指令进行更改,即切换调试模式、外设模式;
[0034] 步骤5、当处于调试模式时,串口数据由驱动线程ttyA获取并处理;当处于外设模式时,串口数据由驱动线程ttyB获取并处理;
[0035] 步骤6、系统启动时,如果没有程序打开驱动线程ttyB,则系统默认处于调试模式,此时输出调试信息。当有程序需要使用串口的外设模式时,打开驱动线程ttyB,并通过ioctrl指令改变串口功能即可;
[0036] 步骤7、由于与串口外设通信时,都会有数据通信格式,而系统调试信息都是没有帧格式的可见字符(ascii码),因此当串口需要从外设模式切换成调试模式时,可以通过发送特定的ascii码来通知驱动切换当前的串口工作模式,驱动线程ttyB收到相应的通知后,将释放Uart0模块,同时只要检测到在一定时间内有调试指令输入就将始终保持释放Uart0模块的状态,当调试结束后,ttyB将自动占用Uart0模块,串口恢复成外设模式。
[0037] 实施例2
[0038] 其中,本发明采用上述将串口数据的收发模块与串口数据的处理模块分开的模型具有通用性,与系统无关,同时只要能区分不同的数据流,该方法可扩展成多个应用程序(一个数据流对应一个应用程序)分时使用同一串口。
[0039] 当需要多个应用程序分时使用串口时,需要在ttyB内部设置多对缓冲区(一个程序需要对应一对缓冲区,一个用于接收、一个用于发送)或者创建多个tty驱动线程即ttyA、ttyB、ttyC、ttyD…等等,每个tty驱动线程都包含一对缓冲区,用于缓冲对应应用程序的数据。
[0040] 其中,串口的切换则通过外部向串口发送特定数据帧来实现(数据帧格式可以如下:帧头 + 校验和 + 指令ID + 指令数据 + 帧尾),当Uart0模块检测到特定的数据帧后,解析出当前待使用串口的应用程序,并将后续的数据缓存至相应的缓冲区,而数据的发送也仅仅是从指定的应用程序的缓冲区获取,从而实现多个应用程序分时复用串口的功能。
[0041] 串口的切换功能也可以通过先让串口进入调试模式,然后在控制台执行相关的自定义切换指令进行。
[0042] 特别的,本发明的上述分层模型适用于内核模型与Linux一致的所有系统,而不仅仅是android系统。
[0043] 尽管结合优选实施方案具体展示和介绍了本发明,但所属领域的技术人员应该明白,在不脱离所附权利要求书所限定的本发明的精神和范围内,在形式上和细节上可以对本发明做出各种变化,均为本发明的保护范围。