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