【发明内容】
为了克服上述问题,本发明提出一种可有效解决上述问题的Linux系统下串口信息截获方法。
本发明解决上述技术问题提供的一种技术方案是:提供一种Linux系统下串口信息截获方法,包括如下步骤:
步骤S1,通过Linux内核中的tty驱动截获用户空间的串口Log输出信息,通过Linux内核中的console驱动截获内核空间的串口Log输出信息,在内核中创建一个环形队列,并将tty驱动和console驱动截获的串口Log输出信息拷贝并保存于所述环形队列中;
步骤S2,在内核中创建/proc/comInfo2App数据通道,用于用户空间内的进程LogApp与环形队列进行交互;
步骤S3,在嵌入式设备的Flash中划分出一个分区,将所述分区挂载成可读写的文件系统,用于供进程LogApp保存串口Log输出信息;
步骤S4,进程LogApp根据其配置参数,启动进程并周期性地从/proc/comInfo2App数据通道获取串口Log输出信息进行处理,并存放到Log文件中,当Log文件达到设置的大小后,对Log文件进行压缩,并以特定文件名保存在可读写的文件系统中,最后通过以太网将压缩后的Log文件发送到远程服务器中,供上位机调用。
优选地,所述步骤S3中,嵌入式设备的Flash中创建一个可读写UBI分区。
优选地,所述可读写UBI分区的创建包括如下步骤:
步骤S31,在Flash中划分出一个mtd分区;
步骤S32,建立关联,即把mtd分区关联为ubi设备;
步骤S33,划分逻辑卷;
步骤S34,挂载UBI分区。
优选地,所述步骤S4中,进程LogApp的处理流程包括如下步骤:
步骤S41,读取进程LogApp的配置信息;
步骤S42,从/proc/comInfo2App数据通道获取数据到comInfo2App.txt;
步骤S43,判断comInfo2App.txt大小是否超过设置的阈值,若大小超过阈值,则将comInfo2App.txt压缩成sn-序号-年月日-时分秒.tar.gz;
步骤S44,将sn-序号-年月日-时分秒.tar.gz发送到远程服务器;
步骤S45,判断步骤S44是否发送成功,若发送成功,则继续判断设备剩余空间是否足够,若空间足够,则获取当前所有压缩文件的个数;
步骤S46,根据sleep设置的秒数周期性重复步骤S42。
优选地,所述步骤S1中,在tty驱动的uart_write接口中将用户空间的各个printf输出数据截获拷贝一份,并保存到环形队列中。
优选地,所述步骤S1中,在console驱动关联的write接口中将内核空间的各个printk输出数据截获拷贝一份,并保存到环形队列中。
优选地,所述步骤S1中,所述环形队列由tty驱动初始化时创建,环形队列是一个首尾相连的FIFO数据结构。
优选地,所述步骤S1中,将tty驱动初始化之前的各个printk先保存到一个缓冲中,等tty驱动初始化并创建环形队列后,再一次性将缓冲中的所有数据保存到环形队列中。
优选地,所述tty驱动初始化时指定元素的个数为16384,设置了元素数据大小为128B。
优选地,所述步骤S2中,/proc/comInfo2App数据通道由tty驱动初始化时使用函数proc_create创建,同时注册结构体file_operations的read接口my_proc_read和write接口my_proc_write。
与现有技术相比,本发明的Linux系统下串口信息截获方法使得设备无需接串口线就能获取设备串口Log的完整信息,然后通过以太网将压缩后的串口Log发送到远程的服务器中,突破串口线近距离的限制,也省去连接并配置上位机的麻烦,主要是省去USB转串口HUB和上位机串口软件的配置,容易远程收集多个设备的串口Log,从而定位问题和掌握各个设备的状态,从而方便设备在外场的调试和部署。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施实例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用于解释本发明,并不用于限定本发明。
需要说明,本发明实施例中所有方向性指示(诸如上、下、左、右、前、后……)仅限于指定视图上的相对位置,而非绝对位置。
另外,在本发明中如涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。
请参阅图2至图5,本发明的Linux系统下串口信息截获方法,包括如下步骤:
步骤S1,通过Linux内核中的tty驱动截获用户空间的串口Log输出信息,通过Linux内核中的console驱动截获内核空间的串口Log输出信息,在内核中创建一个环形队列,并将tty驱动和console驱动截获的串口Log输出信息拷贝并保存于所述环形队列中;
步骤S2,在内核中创建/proc/comInfo2App数据通道,用于用户空间内的进程LogApp与环形队列进行交互;
步骤S3,在嵌入式设备的Flash中划分出一个分区,将所述分区挂载成可读写的文件系统,用于供进程LogApp保存串口Log输出信息;
步骤S4,进程LogApp根据其配置参数,启动进程并周期性地从/proc/comInfo2App数据通道获取串口Log输出信息进行处理,并存放到Log文件中,当Log文件达到设置的大小后,对Log文件进行压缩,并以特定文件名保存在可读写的文件系统中,最后通过以太网将压缩后的Log文件发送到远程服务器中,供上位机调用。
所述步骤S1中,用户空间的各个printf打印,最终都会经过底层tty驱动的uart_write接口输出到硬件并打印出来,因此,本发明在uart_write接口中将所有的printf输出数据截获拷贝一份出来,然后保存到环形队列中;同理,内核空间的各个printk打印,最终都会经过底层console驱动关联的write接口输出到硬件并打印出来,因此,本发明在write接口中将所有的printk输出数据截获拷贝一份出来,然后同样保存到环形队列中;由于printk的前期输出早于tty驱动的初始化,为使得前期的printk信息不丢失,本发明将tty驱动初始化之前的各种printk先保存到一个缓冲中,然后等tty驱动初始化并创建环形队列后,再一次性将缓冲中的所有数据保存到环形队列中,从而保证串口Log输出信息的完整性,可实现在不接串口线的情况下获取和有接串口线一样的串口Log信息。
所述步骤S1中,所述环形队列由tty驱动初始化时创建,环形队列是一个首尾相连的FIFO数据结构,采用数组的线性空间,数据组织简单,能快速获取队列是否满或空,也能快速存取数据。tty驱动初始化时指定元素的个数为16384,为提高数据的实时性,设置了元素数据大小为128B。所述环形队列提供了如下的接口:
1、创建环形队列;
2、清除环形队列;
3、判断环形队列是否满;
4、判断环形队列是否空;
5、获取环形队列的元素个数;
6、元素入队列;
7、元素出队列;
8、打印队列信息。
所述步骤S2中,/proc/comInfo2App数据通道由tty驱动初始化时使用函数proc_create创建,同时注册结构体file_operations的read接口my_proc_read和write接口my_proc_write。
所述接口my_proc_read用于用户空间的进程LogApp通过/proc/comInfo2App数据通道获取环形队列中的串口Log数据,并进行各种后端处理。
所述接口my_proc_write用于用户空间进程(不仅为LogApp)通过/proc/comInfo2App对环形队列进行各种控制操作,操作类型如下:
1、echo ON>/proc/comInfo2App,打开截获开关;
2、echo OFF>/proc/comInfo2App,关闭截获开关;
3、echo INFO>/proc/comInfo2App,获取环形队列信息;
4、echo CLEAR>/proc/comInfo2App,清空环形队列。
特别说明,Linux系统上的/proc目录是一种文件系统,主要用于内核与用户层交换信息,与其它常见的文件系统不同的是,/proc是一种伪文件系统,存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
所述步骤S3中,为了使得重启或异常掉电后,截获到的串口Log输出信息不会丢失,嵌入式设备的Flash中创建了一个可读写UBI分区。UBIFS可认为是JFFS2文件系统的下一代,UBIFS专门为大容量Flash嵌入式移动设备设计,有如下的特点:良好的Flash尺寸扩展性、快速mount、支持write-back、快速I/O读写、可恢复性和完整性。
所述可读写UBI分区的创建包括如下步骤:
步骤S31,在Flash中划分出一个mtd分区;
步骤S32,建立关联,即把mtd分区关联为ubi设备;
步骤S33,划分逻辑卷;
步骤S34,挂载UBI分区。
所述步骤S31中,划分一个32MB的mtd8分区,大小可根据Flash容量而定。
所述步骤S32中,采用命令ubiattach/dev/ubi_ctrl-m 8建立关联。
所述步骤S33中,采用命令ubimkvol/dev/ubi0-N ubiMtd8-s$size划分逻辑卷,其中$size为步骤S32关联后显示的可用大小。
所述步骤S34中,采用命令mount-t ubifs ubi0_0/mnt挂载UBI分区,其中/mnt为挂载目录,成功后/mnt目录就可以用来保存进程LogApp获取后的串口Log了。
所述步骤S4中,进程LogApp的处理流程包括如下步骤:
步骤S41,读取进程LogApp的配置信息;
步骤S42,从/proc/comInfo2App数据通道获取数据到comInfo2App.txt;
步骤S43,判断comInfo2App.txt大小是否超过设置的阈值,若大小超过阈值,则将comInfo2App.txt压缩成sn-序号-年月日-时分秒.tar.gz;
步骤S44,将sn-序号-年月日-时分秒.tar.gz发送到远程服务器;
步骤S45,判断步骤S44是否发送成功,若发送成功,则继续判断设备剩余空间是否足够,若空间足够,则获取当前所有压缩文件的个数;
步骤S46,根据sleep设置的秒数周期性重复步骤S42。
所述步骤S41中,所述配置参数包括如下参数:
1、comInfoEnabled,截获开关;
2、comInfoLogMaxSizeMB,压缩前串口Log大小的阈值,达到这个阈值就开始压缩;
3、comInfoTftpServerIP,远程服务器IP,压缩后的Log文件通过以太网发到该服务器中;
4、comInfoLogSaveDir,获取到的串口Log的保存路径;
5、comInfoGetDataSeconds,进程LogApp通过/proc/comInfo2App数据通道获取串口Log数据的频率;
6、comInfoTarFilesMaxCnt,保存压缩后的串口Log最大个数,超过这个数就循环删除最开始的文件,从而使得一直保存最新comInfoTarFilesMaxCnt个压缩的Log文件。
所述步骤S45中,若设备空间不足,则删除发送成功的压缩文件,直至判断为空间足够。
所述步骤S45中,若当前所有压缩文件的个数超过设定的阈值,则删除最开始形成的压缩文件。
与现有技术相比,本发明的Linux系统下串口信息截获方法使得设备无需接串口线就能获取设备串口Log的完整信息,然后通过以太网将压缩后的串口Log发送到远程的服务器中,突破串口线近距离的限制,也省去连接并配置上位机的麻烦,主要是省去USB转串口HUB和上位机串口软件的配置,容易远程收集多个设备的串口Log,从而定位问题和掌握各个设备的状态,从而方便设备在外场的调试和部署。
以上所述仅为本发明的较佳实施例,并非因此限制本发明的专利范围,凡是在本发明的构思之内所作的任何修改,等同替换和改进等均应包含在本发明的专利保护范围内。