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对串口文件描述符进行监控,实现对串口的接收。

相关推荐
龙鸣丿1 小时前
Linux基础学习笔记
linux·笔记·学习
一点媛艺2 小时前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风2 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
耶啵奶膘2 小时前
uniapp-是否删除
linux·前端·uni-app
奋斗的小花生3 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功3 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨3 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
2401_850410833 小时前
文件系统和日志管理
linux·运维·服务器
老猿讲编程3 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
XMYX-04 小时前
使用 SSH 蜜罐提升安全性和记录攻击活动
linux·ssh