如何实现在LINUX系统上直接控制串口RTS信号电
嵌入式开发板到手后一般都会开放串口,对串口的口源操作可以说是最基本的操作,那么拿到开发板后怎样操作串口呢?怎样利用串口向外发送数据呢?
我做的读写是一个通过串口来发送一串字符,实现NBIot的源码传输,系统是串串口linux系统下的,发送的口源跌幅变色指标源码数据需要是进制的数据。以下是读写c语言开发串口的相关代码记录。
1.找到串口的源码设备号
在linux系统下,所有的串串口设备都是文件,所以要先找到串口这个设备文件,口源之后就可以对这个串口进行操作。读写
#define UART_DEV "/dev/ttyAMA2"
2.打开串口并初始化串口
串口的源码打开只需要一个open函数就可以打开,下面有一个初始化的串串口函数,先将串口打开,口源如果打开成功,读写会返回一个设备描述符。
linux TTY子系统 之 串口
TTY结构体关系图
TTY设备
TTY 驱动类型包含串口,其层次结构分为两层,下层为直接与硬件接触的串口驱动层,上层为包括TTY核心层及线路规程的tty层。用户空间通过注册的字符设备节点访问串口设备。
芯片厂商定义一个全局的struct uart_driver类型变量,包含一些不涉及底层硬件访问的信息,如名字、设备号等。在struct uart_driver imx_uart_uart_driver中,有两个成员未被赋值,分别是tty_driver和uart_state。uart_driver代表上层,会在uart_register_driver过程中赋值;而uart_state代表下层,会在相同过程中分配空间,但真正设置硬件相关的源码助力东西是uart_state->uart_port,需要通过调用uart_add_one_port添加。
调用uart_register_driver将struct uart_driver类型变量注册到系统中,该过程仅执行一次,系统启动时完成。此过程会申请nr个uart_state空间,nr为uart_driver->nr,用于存放支持的串口物理信息。同时创建一个struct tty_driver类型变量并将其注册到系统中,使得串口驱动与TTY层关联。所有串口设备共用此normal变量。
串口设备与驱动通过platform总线进行匹配。当设备树中的串口设备与驱动匹配时,执行imx_uart_probe,此函数执行次数与芯片串口总数一致。在imx_uart_probe中,创建一个struct imx_port变量并添加到数组imx_uart_ports中,记录串口基地址、时钟、中断号等信息,还记录了芯片厂家提供的操作集imx_uart_pops,用于硬件寄存器级的适配。
uart_add_one_port与tty_port_register_device_attr_serdev之间的调用关系表明,serdev_tty_port_register返回值为-ENODEV,导致执行tty_register_device_attr。此函数创建设备文件,设备节点文件名由struct uart_driver的dev_name和编号组成,并创建并注册一个字符设备。
小结
对接底层部分,Kernel提供了两个关键接口:uart_register_driver和uart_add_one_port。通过这两个接口,芯片将自己的uiblureffect源码UART对接到Linux Kernel UART Driver中。芯片厂商需要自行设计并实现uart_driver结构、uart_port结构和uart_ops操作集。
结构上,对接过程涉及数据结构和相互关系,具体包括uart_register_driver和uart_add_one_port的调用关系。串口作为字符设备,用户空间的open、write、read等操作对应到TTY层的注册到字符设备的struct file_operation,即tty_fops。open流程涉及获取当前进程的tty、获取ops结构等,最终调用芯片厂商提供的硬件寄存器级函数。write流程涉及操作流、数据传递到芯片级对接层。read流程涉及数据读取、中断申请与处理等。
在芯片级对接层,接收数据前需要先通过irq_request申请中断,挂接中断服务程序。中断处理流程包括串口接收中断、数据写入tty_port->buf.tail、数据传递到n_tty_data::read_buf[]等。
Linux内核学习教程、资料、面试题、学习路线图等免费资源可通过指定链接访问,如有需求可自行加入学习交流群获取更多资源。
Linux下的命令行串口工具minicom安装和使用教程
Linux下的Minicom的功能与Windows下的超级终端功能相似,可以通过串口控制外部的硬件设备。适于在linux通过超级终端对嵌入式设备行管理.同样也可以使用minicom对外置Modem进行控制.1. 安装minicom
复制代码
代码如下:
$ sudo apt-get install minicom2. 配置minicom
2.1 启动minicom
复制代码
代码如下:
$ sudo minicom2.2 启动并配置minicom
复制代码
代码如下:
$ sudo minicom -s3. minicom常用功能
3.1 开启换行功能
复制代码
代码如下:
$ sudo minicom -w3.2 lrz串口传输公呢
启动minicom之后,linuxkconfig源码Ctrl + A, Z
3.3参数
Minicom是基于窗口的。要弹出所需功能的窗口,可按下Ctrl-A (以下
使用C-A来表示Ctrl-A),然后再按各功能键(a-z或A-Z)。先按C-A,再
按'z',将出现一个帮助窗口,提供了所有命令的简述。配置minicom
(-s 选项,或者C-A、O)时,可以改变这个转义键,不过现在我们还
是用Ctrl-A吧。
以下键在所有菜单中都可用:
UP arrow-up 或 'k'
DOWN arrow-down 或 'j'
LEFT arrow-left 或 'h'
RIGHT arrow-right 或 'l'
CHOOSE Enter
CANCEL ESCape.
屏幕分为两部分:上部行为终端模拟器的屏幕。 ANSI或VT转义
序列在此窗口中被解释。若底部还剩有一行,那么状态行就放在这儿;
否则,每次按C-A时状态行出现。 在那些有专门状态行的终端上将会
使用这一行,如果termcap信息完整且加了-k标志的话。
下面按字母顺序列出可用的命令:
C-A 两次按下C-A将发送一个C-A命令到远程系统。如果你把转义字符
换成了C-A以外的什么字符,则对该字符的工作方式也类似。
A 切换Add Linefeed为on/off。若为on,则每上回车键在屏幕上
显示之前,都要加上一个linefeed。
B 为你提供一个回卷(scroll back)的缓冲区。可以按u上卷,按d下卷,
按b上翻一页,按f下翻一页。batmap源码也可用箭头键和翻页键。可用s或S键
(大小写敏感)在缓冲区中查找文字串,按N键查找该串的下一次出现。
按c进入引用模式,出现文字光标,你就可以按Enter键指定起始行。
然后回卷模式将会结束,带有前缀''的内容将被发送。
C 清屏。
D 拨一个号,或转向拨号目录。
E 切换本地回显为on/off (若你的minicom版本支持)。
F 将break信号送modem。
G 运行脚本(Go)。运行一个登录脚本。
H 挂断。
I 切换光标键在普通和应用模式间发送的转义序列的类型(另参下面
关于状态行的注释)。
J 跳至shell。返回时,整个屏幕将被刷新(redrawn)。
K 清屏,运行kermit,返回时刷新屏幕。
L 文件捕获开关。打开时,所有到屏幕的输出也将被捕获到文件中。
M 发送modem初始化串。若你online,且DCD线设为on,则modem被初始化
前将要求你进行确认。
O 配置minicom。转到配置菜单。
P 通信参数。允许你改变bps速率,奇偶校验和位数。
Q 不复位modem就退出minicom。如果改变了macros,而且未存盘,
会提供你一个save的机会。
R 接收文件。从各种协议(外部)中进行选择。若filename选择窗口和下
载目录提示可用,会出现一个要求选择下载目录的窗口。否则将使用
Filenames and Paths菜单中定义的下载目录。
S 发送文件。选择你在接收命令中使用的协议。如果你未使文件名选择
窗口可用(在File Transfer Protocols菜单中设置),你将只能在一
个对话框窗口中写文件名。若将其设为可用,将弹出一个窗口,显示
你的上传目录中的文件名。可用空格键为文件名加上或取消标记,用
光标键或j/k键上下移动光标。被选的文件名将高亮显示。 目录名在
方括号中显示,两次按下空格键可以在目录树中上下移动。最后,按
Enter发送文件,或按ESC键退出。
T 选择终端模拟:ANSI(彩色)或VT。此处还可改变退格键,打开或
关闭状态行。
W 切换linewrap为on/off。
X 退出minicom,复位modem。如果改变了macros,而且未存盘,会提供
你一个save的机会。
Z 弹出help屏幕。
配置Linux系统默认串口配置linux默认串口
Linux系统的默认串口配置是指让操作系统在第一次启动的时候,就把这个串口设备作为主要的终端设备,而不需要每次有新的串口设备插入时手动添加或配置。在Linux系统的默认串口配置中,一般的串口设备厂家都使用ttyS0这一参数来表示第一个串口。
配置Linux系统默认串口配置,可以通过编辑Linux系统的终端启动文件,设置Linux系统默认使用某个串口方式启动,而不用重新进行设备驱动配置。
要配置Linux系统默认串口配置,具体步骤如下:
1. 打开终端,运行 sudo vi /etc/inittab. 在 /etc/inittab 文件最后面添加下面行:
T0::respawn:/sbin/getty -L ttyS0 vt
2. 运行sudo init q来重新载入 inittab 文件(在此之前,必须保证ttyS0设备已经正常创建)。
3. 设置完成后,在系统Reboot时,将自动使用此ttyS0设备进行系统启动。
配置Linux系统默认串口配置不仅可以使用ttyS0方式进行系统启动,还可以使用ttyS1等其他串口设备。例如要使用ttyS1设备进行启动,只需要将上面的/sbin/getty的第二个参数ttyS0改为ttyS1即可。另外,在Linux系统配置串口的时候,可以在/etc/init.d/boot.local脚本中体现,例如:
#vi /etc/init.d/boot.local
echo “config ttyS1 none” >/proc/sys/dev/serial/config
通过上面的配置,Linux系统就可以选择将ttyS1设为系统的默认控制台输出设备,以满足用户个性化需求,为使用者提供更好的操作体验。
linux下串口调试工具/串口终端推荐: picocom
在Linux环境下,选择一款合适的串口调试工具或串口终端对于开发者来说至关重要。在众多选择中,picocom以其简单易用性脱颖而出。
安装picocom,对于使用mint或ubuntu的用户,只需执行命令$ sudo apt-get install picocom。启动并使用时,只需输入命令$ picocom -b /dev/ttyUSB0(其中,/dev/ttyUSB0为串口设备文件,具体设备文件可能根据实际连接方式有所不同,如USB转串口则为 /dev/ttyUSB0)。
为了方便使用,可以设置一个别名,如 alias pc='picocom -b /dev/ttyUSB0',如此在终端输入sudo pc即可快速启动picocom。
退出picocom时,只需按下Ctrl-a,接着按Ctrl-q即可完成操作。
接下来对比其他工具,picocom的优点在于其简洁性,以及文字显示时的色彩效果,同时不会改变终端背景色,这是用户喜欢的半透明效果。
然而,picocom的启动和关闭速度相对较慢。相比之下,minicom启动速度快,但其在设置颜色后背景无法设置透明,且在显示中文时存在问题。此外,当串口数据持续输出到终端时,复制原有数据较为困难。
而kermit功能强大,支持自己的脚本语言和命令行,对于需要更高级功能的用户来说是不错的选择,但目前该工具暂未成为首选。
在Windows系统中,使用putty或SecureCRT是常见的选择。SecureCRT推荐使用,因为它不仅支持记录串口会话,还能调整透明度等。而putty在使用时,鼠标滚动会导致行跳动频繁,虽然操作界面友好,但设置选项可能不易找到。
综上所述,picocom以其简洁性、色彩效果和透明背景等优点,在Linux串口调试工具中脱颖而出。同时,针对Windows用户,SecureCRT提供了更全面的功能支持,适合追求性能和易用性的开发者。
Linux下串口通信的多线程实现linux多线程串口
Linux下串口通信的多线程实现
Linux系统中,串口适配器是一种常用且可靠的接口,比如用来连接扫描仪、打印机、终端等。串口能在有限的硬件资源下实现远程数据通信,是一种常用的接口。
在多线程下实现串口通信,可以提高数据处理的效率,减轻主线程的负担,从而提高数据处理系统的整个性能。
首先介绍如何实现多线程的Linux串口通信,下面介绍如何使用pthread库实现多线程的Linux串口通信:
1.初始化串口设备,在linux内核中,使用open()函数打开串口设备;
2.创建多个读写句柄,每次调用open()函数,就会创建一个新的fd(文件描述符);
3.创建线程,利用Pthread_create()函数创建新的线程,每个句柄被赋予一个线程,形成一个多线程串口通信环境;
4.线程循环读取串口,使用read()函数读取串口数据,每个线程每次读取一定量的数据,然后传递数据到下一个线程;
5.internal线程数据处理,每个线程负责一部分数据的处理;
6.最后写串口,每个线程负责部分数据的写入,最后使用write()函数发送数据到串口。
以上就是如何在Linux系统中使用pthread库实现多线程串口通信的流程。这样,我们就可以在Linux系统中实现多线程串口通信,提高了系统的并发能力和处理能力。
2024-12-24 01:05
2024-12-24 00:23
2024-12-24 00:18
2024-12-23 23:29
2024-12-23 22:49