一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

Linux系统下RS485自动切换收发的实现方法与流程

2022-03-09 07:06:02 来源:中国专利 TAG:

linux系统下rs485自动切换收发的实现方法
【技术领域】
1.本发明涉及通信技术领域,特别涉及linux系统下rs485自动切换收发的实现方法。


背景技术:

2.rs485是一种半双工总线,其收发过程不能同时进行,也即同一时刻通讯端口要么只能发送数据,要么只能接收数据。通常由cpu引出三根管脚:两个uart的收发管脚(rx、tx)和一个rs485收发方向控制gpio(dir),这三根管脚接到485芯片上,485芯片再向外引出d 、d-两根具有抗干扰、传输距离远特性的差分信号,从而构成了rs485的通信。
3.上层编写应用程序时,在原来的普通串口通信基础上,加上rs485收发方向gpio控制即可。具体说来,rs485使用write接口发送数据时,先将dir脚拉高使得可以往rs485总线上发送数据,然后使用tcdrain接口等待数据发送完毕,最后再将dir脚拉低使得rs485总线可以接收数据。但是tcdrain接口在等待设备数据传输完毕的过程中,最终反映到实际硬件的动作上,存在一定的切换延迟,用示波器实测有5~20ms的误差,如图1所示,也即当所有的数据真正发送完毕后,本来此时dir应该马上设置为接收电平以便rs485总线可以接收数据,但实际上延迟了5~20ms,如果对方收到数据并在20ms内返回数据时,就会造成当前rs485总线漏接收部分数据,tcdrain接口切换延迟的原因如下:
4.(1)linux是一个多任务调度实时系统,任务的切换和调度存在抢占现象;
5.(2)linux的工作队列机制,使得下半部的内核线程存在一定的延时执行。


技术实现要素:

6.为了克服上述问题,本发明提出一种可有效解决上述问题的linux系统下rs485自动切换收发的实现方法。
7.本发明解决上述技术问题提供的一种技术方案是:提供一种linux系统下rs485自动切换收发的实现方法,包括如下步骤:
8.步骤s1,去掉用户空间中对dir的手动切换操作和tcdrain接口的调用;
9.步骤s2,将对dir的切换操作转移到linux内核的tty驱动中,当有rs485数据发送时,先将dir设置为发送电平,数据发送完后,再将dir设置为接收电平,从而完成了rs485收发数据方向的自动切换。
10.优选地,所述步骤s2中,在tty驱动中添加ioctl接口,用于在上层中设置是否开启对dir的自动切换操作。
11.优选地,所述步骤s2中,将对dir的切换操作转移到linux内核的tty驱动中,包括如下步骤:
12.步骤s21,在struct uart_8250_port中新增struct serial_rs485 rs485和配置函数rs485_config;
13.步骤s22,在serial8250_register_ports中注册配置函数rs485_config;
14.步骤s23,在struct uart_ops serial8250_pops中添加并实现ioctl接口serial8250_ioctl;
15.步骤s24,在数据发送时配置dir:set_dir_2_high();
16.步骤s25,在数据发送完毕时配置dir:set_dir_2_low()。
17.优选地,所述步骤s2中,在底层驱动和上层应用中分别做出如下修改:
18.修改1,添加dir设置接口;
19.修改2,添加结构体和配置接口;
20.修改3,内核空间注册rs485配置接口rs485_config;
21.修改4,内核空间rs485数据发送前的处理;
22.修改5,内核空间rs485数据发送完毕的处理;
23.修改6,内核空间添加ioctl接口;
24.修改7,用户空间rs485的设置。
25.优选地,所述修改1中,
26.具体为在路径linux-3.10.14.x\drivers\tty\serial\serial_core.c中添加dir的设置接口。
27.优选地,所述修改2中,
28.具体为在路径linux-3.10.14.x/include/linux/serial_8250.h中添加结构体rs485和配置接口rs485_config。
29.优选地,所述修改3中,
30.具体为在路径linux-3.10.14.x/drivers/tty/serial/8250/8250_core.c的serial8250_register_ports函数中注册新增的rs485配置接口rs485_config。
31.优选地,所述修改4中,
32.具体为在路径linux-3.10.14.x/drivers/tty/serial/8250/8250_core.c的serial8250_start_tx函数中处理rs485数据发送前的操作。
33.优选地,所述修改5中,
34.具体为在路径linux-3.10.14.x/drivers/tty/serial/8250/8250_core.c的serial8250_tx_chars函数中处理rs485数据发送完毕后的操作。
35.优选地,所述修改6中,
36.具体为在路径linux-3.10.14.x/drivers/tty/serial/8250/8250_core.c中的结构体serial8250_pops中添加ioctl接口。
37.与现有技术相比,本发明的linux系统下rs485自动切换收发的实现方法使得rs485收发数据时对dir的操作在tty驱动中自动完成,无需在用户空间中对dir手动操作,从而避免了在用户空间中使用tcdrain接口而造成的切换延迟,通过示波器监测tx和dir管脚的波形,实测在驱动中对dir自动切换时无任何延迟,也即数据一发送完毕,dir马上就切换成接收电平的,从而解决了rs485可能漏接收数据的问题;从软件上解决了rs485收发数据切换的延迟,相比于硬件上增加自控收发电路,减少了使用硬件解决该问题的成本;在内核空间中添加了rs485数据收发自动切换,简化了用户的应用程序编写;在用户空间中去掉了rs485数据收发手动切换,提高代码的可移植性。
【附图说明】
38.图1为传统rs485用户空间中对dir手动有延迟切换的时间轴;
39.图2为本发明linux系统下rs485自动切换收发的实现方法的无延迟切换时间轴;
40.图3为本发明linux系统下rs485自动切换收发的实现方法的总体步骤流程图;
41.图4为本发明linux系统下rs485自动切换收发的实现方法中将对dir的切换操作转移到linux内核的tty驱动中的步骤流程图。
【具体实施方式】
42.为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施实例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用于解释本发明,并不用于限定本发明。
43.需要说明,本发明实施例中所有方向性指示(诸如上、下、左、右、前、后
……
)仅限于指定视图上的相对位置,而非绝对位置。
44.另外,在本发明中如涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。
45.请参阅图2至图4,本发明的linux系统下rs485自动切换收发的实现方法,包括如下步骤:
46.步骤s1,去掉用户空间中对dir的手动切换操作和tcdrain接口的调用。
47.步骤s2,将对dir的切换操作转移到linux内核的tty驱动中,即在底层驱动中,当有rs485数据发送时,先将dir设置为发送电平,然后等数据发送完后,再将dir设置为接收电平,从而完成了rs485收发数据方向的自动切换。
48.所述步骤s2中,由于tty驱动既用在rs232串口,也用在rs485串口中,为了使得它们对dir的操作可以设置不一样,在tty驱动中添加了ioctl接口,用于在上层中设置是否开启对dir的自动切换操作,从而使得对驱动的修改不影响rs232串口。
49.所述步骤s2中,将对dir的切换操作转移到linux内核的tty驱动中,包括如下步骤:
50.步骤s21,在struct uart_8250_port中新增struct serial_rs485 rs485和配置函数rs485_config;
51.步骤s22,在serial8250_register_ports中注册配置函数rs485_config;
52.步骤s23,在struct uart_ops serial8250_pops中添加并实现ioctl接口serial8250_ioctl;
53.步骤s24,在数据发送时配置dir:set_dir_2_high();
54.步骤s25,在数据发送完毕时配置dir:set_dir_2_low()。
55.所述步骤s2中,为了实现linux系统下rs485数据收发自动切换功能,需要在底层驱动和上层应用中分别做出修改,具体实施如下:
56.修改1,添加dir设置接口。
57.所述修改1中,具体为在路径linux-3.10.14.x\drivers\tty\serial\serial_
core.c中添加dir的设置接口,本系统中用于控制rs485数据收发方向的gpio为45,当使能rs485接收时为低电平,即rs485_set_gpio(45,0);当使能rs485发送时为高电平,即rs485_set_gpio(45,1)。
58.所述dir设置接口在如下的场合下被调用:
59.场合1、用户空间使能rs485收发自动切换功能时,
60.通过ioctl接口用于设置rs485总线默认状态,如接收状态。
61.场合2、内核空间数据开始发送,
62.用于设置rs485总线为发送状态。
63.场合3、内核空间数据发送完毕,
64.用于设置rs485总线为接收状态。
65.修改2,添加结构体和配置接口。
66.所述修改2中,在路径linux-3.10.14.x/include/linux/serial_8250.h中添加结构体rs485和配置接口rs485_config。
67.结构体rs485用于用户空间中设置标识,从而方便驱动程序中使能rs485数据收发自动切换功能,也使得可以让rs232和rs485作不同的处理(默认rs485启用数据收发自动切换功能,而rs232不需要);而配置接口rs485_config用于初始化dir如配置为rs485默认接收电平,还有注册接收中断底半部tasklet处理函数do_rs485_tasklet。在路径linux-3.10.14.x/drivers/tty/serial/serial_core.c中实现配置接口do_rs485_config。
68.修改3,内核空间注册rs485配置接口rs485_config。
69.所述修改3中,在路径linux-3.10.14.x/drivers/tty/serial/8250/8250_core.c的serial8250_register_ports函数中注册新增的rs485配置接口rs485_config。
70.tty驱动的调用链如下:serial8250_init()-》serial8250_register_ports()-》注册rs485配置接口rs485_config。本系统中配置了两个串口,一个rs232,另一个为rs485,它们都注册了rs485配置接口rs485_config,但是否启用数据收发自动切换最终通过用户空间中的ioctl进行配置。
71.修改4,内核空间rs485数据发送前的处理。
72.所述修改4中,在路径linux-3.10.14.x/drivers/tty/serial/8250/8250_core.c的serial8250_start_tx函数中处理rs485数据发送前的操作。
73.在rs485发送数据之前,先判断是否启用了rs485收发自动切换功能,如果启用就设置dir发送电平。
74.修改5,内核空间rs485数据发送完毕的处理。
75.所述修改5中,在路径linux-3.10.14.x/drivers/tty/serial/8250/8250_core.c的serial8250_tx_chars函数中处理rs485数据发送完毕后的操作。
76.在rs485发送数据完毕后,先判断是否启用了rs485收发自动切换功能,如果启用就通过tasklet设置dir为接收电平。
77.修改6,内核空间添加ioctl接口。
78.所述修改6中,在路径linux-3.10.14.x/drivers/tty/serial/8250/8250_core.c中的结构体serial8250_pops中添加ioctl接口。
79.在用户空间中,使用tiocsrs485就可以在内核空间中调用到rs485的配置接口
rs485_config,从而启用了rs485数据收发自动切换功能。
80.修改7,用户空间rs485的设置。
81.所述修改7中,在用户空间中就可以通过tty驱动提供的ioctl接口启用rs485数据收发自动切换功能,而且不需要对dir进行任何处理了。
82.与现有技术相比,本发明的linux系统下rs485自动切换收发的实现方法使得rs485收发数据时对dir的操作在tty驱动中自动完成,无需在用户空间中对dir手动操作,从而避免了在用户空间中使用tcdrain接口而造成的切换延迟,通过示波器监测tx和dir管脚的波形,实测在驱动中对dir自动切换时无任何延迟,也即数据一发送完毕,dir马上就切换成接收电平的,从而解决了rs485可能漏接收数据的问题;从软件上解决了rs485收发数据切换的延迟,相比于硬件上增加自控收发电路,减少了使用硬件解决该问题的成本;在内核空间中添加了rs485数据收发自动切换,简化了用户的应用程序编写;在用户空间中去掉了rs485数据收发手动切换,提高代码的可移植性。
83.以上所述仅为本发明的较佳实施例,并非因此限制本发明的专利范围,凡是在本发明的构思之内所作的任何修改,等同替换和改进等均应包含在本发明的专利保护范围内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献