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

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满山的猴子我的腚最红

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值