linux串口编程

串口编程步骤:

在ARM Linux系统上进行串口编程可以按照以下步骤进行:

1.打开串口设备:

首先,需要打开要使用的串口设备文件,一般在Linux系统中,串口设备文件位于/dev/ttySx或/dev/ttyUSBx,其中x是串口号或USB串口号。可以使用系统调用open()函数以读写方式打开串口设备文件。

2、配置串口参数:

termios数据结构和相关的函数来进行设置

tcsetattr()函数将修改后的参数应用到串口设备

在打开串口设备后,需要配置串口的通信参数,如波特率、数据位、停止位、校验位等。可以使用termios数据结构和相关的函数来进行设置。可以使用函数tcgetattr()获取当前串口参数,然后修改相关参数,最后通过tcsetattr()函数将修改后的参数应用到串口设备。

termios数据结构体:
复制代码
struct termios {`
`	tcflag_t c_iflag;		/*、输入模式标志*/`
`	tcflag_t c_oflag;		/* 输出模式标志 */`
`	tcflag_t c_cflag;		/* 控制模式标志 */`
`	tcflag_t c_lflag;		/* 本地模式标志 */`
`	cc_t c_cc[NCCS];		/* 控制字符数组 */`
`	cc_t c_line;			/* 线路规程(== c_cc[19]) */`
`	speed_t c_ispeed;		/* 输入波特率 */`
`	speed_t c_ospeed;		/* 输出波特率 */`
`};`
`

各个参数介绍:

c_iflag(输入模式标志位):这个字段包含一系列用于控制输入模式的标志位。例如,可以使用IGNBRK来忽略BREAK键输入,使用INPCK来启用奇偶校验等。

c_oflag(输出模式标志位):这个字段包含一系列用于控制输出模式的标志位。例如,可以使用OPOST来启用输出处理(执行输出转义字符的功能),使用ONLCR来将输出中的换行符转换为回车换行等。

c_cflag(控制模式标志位):这个字段包含一系列用于控制串口硬件特性的标志位。例如,可以使用CBAUD来设置波特率,使用CS8来设置数据位为8位等。

c_lflag(本地模式标志位):这个字段包含一系列用于控制本地模式(终端行为)的标志位。例如,可以使用ICANON来启用规范模式,使用ECHO来启用回显等。

c_cc(控制字符数组):这个数组存储了一些特殊控制字符的值,如终端驱动程序使用的信号字符,输入和输出的起始字符等。

c_line(线路规程):这个字段存储了用于处理数据的线路规程(line discipline)的标识符。一般情况下,可以将其设置为0。

c_ispeed(输入波特率):这个字段指定输入的波特率,表示从串口接收数据的速度。

c_ospeed(输出波特率):这个字段指定输出的波特率,表示向串口发送数据的速度。

复制代码
#include "serial_init.h"`
`void uart_init(int fd, int id)`
`{`
    `//创建一个串口参数结构体数组。`
`    struct termios options;`
`    //设置串口属性`
`    //获取串口原有属性`
`    tcgetattr(fd, &options);//将fd的状态放入到options中`
`    //激活选项CLOCAL(本地连接)和CREAD(接受使能)`
`    options.c_cflag |= (CLOCAL | CREAD);`
`    options.c_cflag &= ~CSIZE;//设置字符大小`
`    options.c_cflag &= ~CRTSCTS;//设置流控`
`    options.c_cflag |= CS8;//设置8位数据位`
`    options.c_cflag &= ~CSTOPB;//设置停止位`
`    options.c_iflag |= IGNPAR;//忽略奇偶错字符`
`    //将输入的CR转换为NL和停止输出控制流起作用`
`    options.c_iflag &= ~(ICRNL | IXON);`
`    options.c_oflag = 0;`
`    options.c_lflag = 0;`
`    //设置波特率(输入和输出的波特率),根据传入的参数判断要设置的波特率`
`    if (id == 1)`
`    {`
`        cfsetispeed(&options, B4800);`
`        cfsetospeed(&options, B4800);`
`    }else`
`    {`
`        cfsetispeed(&options, B9600);`
`        cfsetospeed(&options, B9600);`
`    }`
`    tcsetattr(fd, TCSANOW, &options);//激活配置`
`}`
`

3.读取和写入数据:

一旦串口打开且参数配置完成,就可以进行数据的读取和写入。可以使用read()函数从串口设备读取数据,使用write()函数将数据写入串口设备。

直接用read write来操作文件描述符实现串口操作

4.清理并关闭串口:

在使用完串口后,需要进行清理和关闭。可以使用tcsetattr()函数将串口参数恢复到默认值,并使用close()函数关闭串口设备文件。

其他操作:在网关中可以使用select对串口文件描述符进行监控,实现对串口的接收。

相关推荐
笃励16 分钟前
Java面试题二
java·开发语言·python
可涵不会debug22 分钟前
【Linux】信号知识三把斧——信号的产生、保存和处理
linux·运维·信号
jyan_敬言25 分钟前
【Linux】Linux命令与操作详解(一)文件管理(文件命令)、用户与用户组管理(创建、删除用户/组)
linux·运维·服务器·c语言·开发语言·汇编·c++
FL162386312928 分钟前
[C#]C# winform部署yolov11-pose姿态估计onnx模型
开发语言·yolo·c#
笑非不退39 分钟前
C++ 异步编程 并发编程技术
开发语言·c++
钟剑锋-JeffChong1 小时前
智能手表(Smart Watch)项目
stm32·单片机·嵌入式开发·智能手表
unix2linux1 小时前
Parade Series - SHA256
linux·python·mysql·shell
爱写代码的刚子1 小时前
C++知识总结
java·开发语言·c++
martian6651 小时前
QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用
开发语言·qt
冷琴19961 小时前
基于java+springboot的酒店预定网站、酒店客房管理系统
java·开发语言·spring boot