CN104008008B - 一种Linux系统中复用调试串口的方法 - Google Patents

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

Info

Publication number
CN104008008B
CN104008008B CN201410269275.5A CN201410269275A CN104008008B CN 104008008 B CN104008008 B CN 104008008B CN 201410269275 A CN201410269275 A CN 201410269275A CN 104008008 B CN104008008 B CN 104008008B
Authority
CN
China
Prior art keywords
serial ports
debugging
drive thread
mode
ttyb
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201410269275.5A
Other languages
English (en)
Other versions
CN104008008A (zh
Inventor
陈义华
吕瑞明
范少卓
李琦
鲁林华
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Xiamen Yaxon Networks Co Ltd
Original Assignee
Xiamen Yaxon Networks Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Xiamen Yaxon Networks Co Ltd filed Critical Xiamen Yaxon Networks Co Ltd
Priority to CN201410269275.5A priority Critical patent/CN104008008B/zh
Publication of CN104008008A publication Critical patent/CN104008008A/zh
Application granted granted Critical
Publication of CN104008008B publication Critical patent/CN104008008B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

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

Description

一种Linux系统中复用调试串口的方法
技术领域
本发明涉及通信领域,尤其涉及Linux系统中的复用调试串口的方法。
背景技术
嵌入式设备通常需要一个串口作为调试串口,用于输出调试信息以及接收外部的命令。串口同一时间只能用于调试或者接外设,而不能同时用于调试和接外设。由于嵌入式设备的串口资源都较少,如果能将调试串口既用于调试作用,又能接外设使用,则可以最大限度的使用串口资源,降低硬件成本。
为此,一篇申请号为201310263610.6的中国发明专利,公开了一种串口分时复用的方法及系统。该发明通过在嵌入式操作系统中导出禁止接口、使能接口和提供一套第二串口驱动,实现当应用程序访问串口时,控制台停止访问串口;当应用程序停止访问串口时,控制台恢复访问串口,使得控制台和应用程序能够分时复用串口,从而避免了通信冲突。该发明虽然在一定程度上避免了通信冲突,但是具有以下问题:
1、其实现方式上使用2个串口驱动(第一串口驱动、第二串口驱动)的方式,两个串口驱动都将占用物理串口,同时通过导出禁止接口、使能接口来达到独占使用串口资源的目的,这使得程序架构显得复杂、冗余;
2、根据该发明的描述,其需要显式的调用禁止接口、使能接口来切换串口的使用者,因此当串口被应用程序占用时,如何通知应用程序释放串口是一个重要的问题。特别是在没有图形界面的操作系统上,当串口被应用程序(非控制台)占用时,由于此时控制台无法正常使用,无法通过控制台去通知应用程序释放串口。
因此该专利在实际使用上具有很大的局限性,仅用2个驱动的使能接口、禁止接口是无法达到预期目标的,需要进一步的完善、补充和改进。
发明内容
因此,针对上述的问题,本发明提出一种在Linux系统中复用调试串口的方法将串口数据的处理和接收分隔开来,使得系统和外设可以分时使用同一个串口,以达到最大限度使用串口资源的目的。
为了解决上述技术问题,本发明所采用的思路是,针对Linux系统调试串口的工作原理,分隔调试串口数据的获取流程与处理流程,通过软件上的开关,控制调试串口数据的获取与否,从而决定调试串口是处于系统调试模式还是接外设的模式。具体的,本发明的一种Linux系统中复用调试串口的方法,包括如下步骤:
步骤1:设置复用调试串口规则:
首先创建2个驱动,记为驱动线程ttyA和驱动线程ttyB,驱动线程ttyA用于调试,驱动线程ttyB用于与外设通信;
然后创建Uart0模块,该Uart0模块用于收发串口数据;
然后建立通信规则,使驱动线程ttyA和驱动线程ttyB在同一时间不能同时使用Uart0模块,以免出现错误;
最后配置Linux系统的内核启动参数,指定控制台使用的是驱动线程ttyA。以android系统为例,配置系统内核启动参数如下:CMDLINE:console=ttyAandroidboot.console=ttyA init=/init initrd=0x62000000,0x00800000,从而指定控制台使用的是“串口”ttyA;
步骤2:Linux系统启动时,首先检测驱动线程ttyB是否启动,如果驱动线程ttyB没有启动,则没有应用程序启动该驱动线程ttyB,此时系统默认处于调试模式,用于输出调试信息;当有应用程序需要使用串口的外设模式时,打开驱动线程ttyB并改变串口功能即可,例如android系统,可通过ioctrl指令改变串口功能;串口的具体用途并无优先级之分,可根据实际需要来建议优先级规则;其中,调试串口的工作模式包括调试模式和外设模式,调试模式用于输出调试信息,外设模式用于通过串口进行数据传输;
步骤3:Linux实时监测调试串口,当调试串口有数据传输时,检测当前调试串口的工作模式;如果是处于调试模式,则将串口数据推入驱动线程ttyA的缓冲区,等待系统处理;如果是处于外设模式,则将串口数据推入驱动线程ttyB的缓冲区,等待应用程序获取串口数据并处理。
当需要多个应用程序分时使用串口时,所述步骤1中,在驱动线程ttyB内部设置多对缓冲区,每对缓冲区缓冲对应应用程序的数据;步骤3中,串口的工作模式的切换,是通过外部向串口发送特定数据帧来实现,当Uart0模块检测到该特定数据帧,对其进行解析,从而获得当前待使用串口的应用程序,并将后续的数据缓存至相应应用程序的缓冲区,同时,数据的发送从该相应应用程序的缓冲区获取,从而实现多个应用程序分时复用串口的功能。
其中,步骤3中,检测当前调试串口的工作模式,可以通过以下过程:在Linux系统的内核上设置一个导出变量,该导出变量用于标记当前调试串口的工作模式(调试模式或者外设模式),当工作模式改变时,同时修改该导出变量。该导出变量可以通过驱动的相应指令(例如android系统可通过ioctrl指令)进行更改,即切换调试模式、外设模式。
更进一步的,步骤3中,Linux系统通过调试串口进行数据传输,由于与调试串口所连接的外设(外接设备)通信时,都会有数据通信格式,而系统调试信息都是没有帧格式的可见字符(ascii码),因此当调试串口需要从外设模式切换成调试模式时,可以通过发送特定的ascii码来通知驱动切换当前的串口工作模式,驱动线程ttyB收到相应的通知后,将释放Uart0模块,并且Uart0模块会将后续收到的串口数据推入驱动线程ttyA的缓冲区。同时只要检测到预设时间内有调试指令输入,则始终保持释放Uart0模块的状态,当调试结束后,驱动线程ttyB自动占用Uart0模块,串口恢复成外设模式。
本发明通过上述方法,与现有技术相比,其有益效果为:
1、通过编写2个驱动线程ttyA和ttyB,将串口数据的处理和接收分隔开来,从而使得系统和外设可以分时使用同一个串口,以达到最大限度使用串口资源的目的;
2、本发明的方法无需对外设做任何修改即可使用,成本低廉,简单方便;
3、本发明的方法与其它方法相比,只需要在Linux系统创建两个驱动线程,并做简单的设置即可实现调试串口复用,无需对系统的调试串口使用流程进行复杂的改写,易于实现;
4、当需要进行调试时,无需重启系统,发送特定的ascii字符即可将串口功能切换为调试功能,这有利于保存调试现场。
附图说明
图1为本发明的复用调试串口的方法的原理示意图;
图2为本发明的复用调试串口的方法的流程图。
具体实施方式
现结合附图和具体实施方式对本发明进一步说明。
本发明提出了一种通过软件复用串口的方法,主要思路如图1所示:针对Linux系统调试串口的工作原理,分隔调试串口数据的获取流程与处理流程,通过软件上的开关控制调试串口数据的获取与否,从而决定调试串口是出于系统调试模式还是接外设的模式。
实施例1
本发明以android系统为例来说明实现上述复用调试串口的方法,参见图2,主要过程如下:
步骤1、编写2个tty驱动:驱动线程ttyA、驱动线程ttyB,驱动线程ttyA用于调试,驱动线程ttyB用于与外设通信;
步骤2、编写实际的物理串口Uart0模块的数据收发代码,驱动线程ttyA和驱动线程ttyB同一时间只能有一者使用该代码,以免出现错误;
步骤3、配置android系统的内核启动参数:CMDLINE:console=ttyAandroidboot.console=ttyA init=/init,initrd=0x62000000,0x00800000,从而指定控制台使用的是“串口”ttyA;
步骤4、在android系统的内核设置一个导出变量,用于标记当前调试串口的用途,该变量可以通过驱动的ioctrl指令进行更改,即切换调试模式、外设模式;
步骤5、当处于调试模式时,串口数据由驱动线程ttyA获取并处理;当处于外设模式时,串口数据由驱动线程ttyB获取并处理;
步骤6、系统启动时,如果没有程序打开驱动线程ttyB,则系统默认处于调试模式,此时输出调试信息。当有程序需要使用串口的外设模式时,打开驱动线程ttyB,并通过ioctrl指令改变串口功能即可;
步骤7、由于与串口外设通信时,都会有数据通信格式,而系统调试信息都是没有帧格式的可见字符(ascii码),因此当串口需要从外设模式切换成调试模式时,可以通过发送特定的ascii码来通知驱动切换当前的串口工作模式,驱动线程ttyB收到相应的通知后,将释放Uart0模块,同时只要检测到在一定时间内有调试指令输入就将始终保持释放Uart0模块的状态,当调试结束后,ttyB将自动占用Uart0模块,串口恢复成外设模式。
实施例2
其中,本发明采用上述将串口数据的收发模块与串口数据的处理模块分开的模型具有通用性,与系统无关,同时只要能区分不同的数据流,该方法可扩展成多个应用程序(一个数据流对应一个应用程序)分时使用同一串口。
当需要多个应用程序分时使用串口时,需要在ttyB内部设置多对缓冲区(一个程序需要对应一对缓冲区,一个用于接收、一个用于发送)或者创建多个tty驱动线程即ttyA、ttyB、ttyC、ttyD…等等,每个tty驱动线程都包含一对缓冲区,用于缓冲对应应用程序的数据。
其中,串口的切换则通过外部向串口发送特定数据帧来实现(数据帧格式可以如下:帧头 + 校验和 + 指令ID + 指令数据 + 帧尾),当Uart0模块检测到特定的数据帧后,解析出当前待使用串口的应用程序,并将后续的数据缓存至相应的缓冲区,而数据的发送也仅仅是从指定的应用程序的缓冲区获取,从而实现多个应用程序分时复用串口的功能。
串口的切换功能也可以通过先让串口进入调试模式,然后在控制台执行相关的自定义切换指令进行。
特别的,本发明的上述分层模型适用于内核模型与Linux一致的所有系统,而不仅仅是android系统。
尽管结合优选实施方案具体展示和介绍了本发明,但所属领域的技术人员应该明白,在不脱离所附权利要求书所限定的本发明的精神和范围内,在形式上和细节上可以对本发明做出各种变化,均为本发明的保护范围。

Claims (4)

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模块,串口恢复成外设模式。
CN201410269275.5A 2014-06-17 2014-06-17 一种Linux系统中复用调试串口的方法 Active CN104008008B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410269275.5A CN104008008B (zh) 2014-06-17 2014-06-17 一种Linux系统中复用调试串口的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410269275.5A CN104008008B (zh) 2014-06-17 2014-06-17 一种Linux系统中复用调试串口的方法

Publications (2)

Publication Number Publication Date
CN104008008A CN104008008A (zh) 2014-08-27
CN104008008B true CN104008008B (zh) 2019-02-22

Family

ID=51368673

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410269275.5A Active CN104008008B (zh) 2014-06-17 2014-06-17 一种Linux系统中复用调试串口的方法

Country Status (1)

Country Link
CN (1) CN104008008B (zh)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105068964B (zh) * 2015-08-10 2018-03-27 上海斐讯数据通信技术有限公司 一种串口资源管理方法及系统
CN106569416B (zh) * 2016-10-28 2019-12-24 珠海格力电器股份有限公司 一种微控制器的串行接口与仿真调试接口复用方法及装置
CN108829375A (zh) * 2017-04-28 2018-11-16 武汉斗鱼网络科技有限公司 Android APP研发时的项目类型转换方法及系统
CN109086208B (zh) * 2018-08-06 2021-10-22 联想(北京)有限公司 一种数据处理方法及系统
CN110175139B (zh) * 2019-05-08 2021-01-05 厦门亿联网络技术股份有限公司 一种usb设备的通用调试方法及usb设备
CN112306912B (zh) * 2019-07-30 2023-07-14 西安诺瓦星云科技股份有限公司 串行接口设备驱动装置、嵌入式处理器和视频控制器
CN110737480B (zh) * 2019-09-18 2022-05-13 瑞芯微电子股份有限公司 一种串口驱动程序复用方法和装置
CN112256513B (zh) * 2020-10-29 2023-10-20 成都菁蓉联创科技有限公司 一种调试串口和数据串口复用的方法、装置和控制器
CN112948311B (zh) * 2021-03-30 2022-11-08 几维通信技术(深圳)有限公司 Linux系统下串口信息截获方法
CN113961495A (zh) * 2021-10-21 2022-01-21 青岛海信宽带多媒体技术有限公司 一种Linux系统串口功能禁用的方法

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101500331A (zh) * 2008-02-02 2009-08-05 中兴通讯股份有限公司 一种对串口进行分时复用的方法及移动终端
US8145807B1 (en) * 2010-08-23 2012-03-27 Smartech Worldwide Limited Multiplexing application and debug channels on a single USB connection
CN202404575U (zh) * 2011-12-29 2012-08-29 北京东土科技股份有限公司 一种Console串口及Debug串口的复用系统
CN102866976A (zh) * 2012-09-17 2013-01-09 山东神戎电子股份有限公司 一种嵌入式系统中串口分时复用方法
CN103365798A (zh) * 2013-06-27 2013-10-23 华为技术有限公司 一种串口分时复用的方法及系统

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101500331A (zh) * 2008-02-02 2009-08-05 中兴通讯股份有限公司 一种对串口进行分时复用的方法及移动终端
US8145807B1 (en) * 2010-08-23 2012-03-27 Smartech Worldwide Limited Multiplexing application and debug channels on a single USB connection
CN202404575U (zh) * 2011-12-29 2012-08-29 北京东土科技股份有限公司 一种Console串口及Debug串口的复用系统
CN102866976A (zh) * 2012-09-17 2013-01-09 山东神戎电子股份有限公司 一种嵌入式系统中串口分时复用方法
CN103365798A (zh) * 2013-06-27 2013-10-23 华为技术有限公司 一种串口分时复用的方法及系统

Also Published As

Publication number Publication date
CN104008008A (zh) 2014-08-27

Similar Documents

Publication Publication Date Title
CN104008008B (zh) 一种Linux系统中复用调试串口的方法
US9864711B2 (en) Automatic downstream to upstream mode switching at a universal serial bus physical layer
CN103914424B (zh) 基于gpio接口的lpc外设扩展方法及装置
CN103440216B (zh) 一种通过i2c从设备调试mcu的芯片及方法
CN102967815B (zh) 芯片测试方法、自动化测试机和系统
EP2466943B1 (en) Method and device for monitoring running state of card
CN116257472B (zh) 接口控制方法、装置、电子设备及存储介质
CN110543259B (zh) 一种显示设备的指纹解锁方法及显示设备
CN105807886B (zh) 一种芯片唤醒系统及方法以及移动终端
CN105095041A (zh) 芯片的调试方法
CN105868132B (zh) 一种基于usb通信的数字示波器模块化功能拓展方法及系统
CN103488598B (zh) 一种多模终端及其实现usb共用的方法
EP3696987A1 (en) Information processing method for radio frequency device, and mobile terminal
CN108153626B (zh) 一种usb、串口复用与安全隔离系统
CN101968759A (zh) 具有断点功能的处理器芯片仿真器
WO2016127953A1 (zh) 基于软硬架构的高端容错计算机fpga专用调试方法及其装置
CN103176930A (zh) 一种基于标准PCIe上行端口的IO扩展架构方法
CN103442134B (zh) 实现移动终端触摸屏开关功能的方法及系统
CN102890661A (zh) 一种主从机通讯协议
CN203754167U (zh) 一种电梯调试维修手持终端
CN103123463B (zh) 一种控制系统状态的方法及装置
CN206333527U (zh) 一种智能化妆镜
CN109271332A (zh) 一种节点设备驱动初始化的方法和设备
CN103440218A (zh) 基于usb-hid协议的can总线监控方法
CN204491174U (zh) 一种工业伺服缝纫机

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant