linux busybox 操作串口,busybox分析--10.串口的设置

本文详细介绍了如何使用Linux Busybox操作串口,包括8N1的设置和代码示例,展示了如何配置串口的控制位、输入位、输出位和本地位,以及如何进行串口通信的波特率设置。同时,文章还解释了struct termios结构体及其各个成员的作用,帮助理解串口通信的底层原理。
摘要由CSDN通过智能技术生成

1. 8N1

8:表明8位数据位

N: 表明NO,既无奇偶校验

1:表明一位停止位

2. 代码中关于串口的设置

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char*argv[])

{

struct termios termOptions;

int ret,i;

char c = 1 ;

char recv_buf[1024];

int fd=open("/dev/ttyUSB0", O_RDWR);           //usb转串口

//获取当前的串口配置

tcgetattr(fd, &termOptions);

//配置控制位: Set8bit data,No parity,stop 1 bit(8N1)

termOptions.c_cflag &= ~PARENB;     //设为没有奇偶校验: no parity

termOptions.c_cflag &= ~CSTOPB; //设为1个停止位:1 stop bit

termOptions.c_cflag &= ~CSIZE;                //设置字符长度之前,先清字符长度位

termOptions.c_cflag |= CS8 | CLOCAL | CREAD;  //设为8个数据位, 本地连接, 可以接收字符

termOptions.c_cflag &= ~CRTSCTS;              //不启用硬件流控制

//配置输入位

termOptions.c_iflag &= ~(INLCR | ICRNL | IXON | IXOFF | IXANY);  //禁止(INLCR将NL换行转为CR回车 ICRNL将回车转为换行)

//配置输出位

termOptions.c_oflag &= ~OPOST;                                   //禁止 (处理后输出)

//配置local

termOptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //禁止 (ICANON使用标准输入模式, ECHO显示输入字符)

tcflush(fd,TCIFLUSH); //刷清未决输入和输出

termOptions.c_cc[VTIME] = 10; /* inter-character timer unused, wait 1s, if no data, return */

termOptions.c_cc[VMIN] = 0; /* blocking read until 0 character arrives */

printf("c_lflag=%x,c_iflag=%x,c_oflag=%x\n",termOptions.c_lflag,termOptions.c_iflag, termOptions.c_oflag);

//cfsetospeed(&termOptions, B115200);

//cfsetispeed(&termOptions, B115200);

cfsetispeed(&termOptions, B19200);   //设置输入波特率

cfsetospeed(&termOptions, B19200);       //设置输出波特率

tcsetattr(fd, TCSANOW, &termOptions);

while(1)

{

ret = write(fd, &c, 1);

if(ret < 0)

printf("write error\n");

memset(recv_buf, 0, sizeof(recv_buf));

ret = read(fd, recv_buf, sizeof(recv_buf));

if(ret < 0)

printf("read error\n");

printf("%s", recv_buf);

sleep(1);

}

return 0;

}

2.1 代码

f5eb4426879d9c4b4b2deb15679e0746.png9uart.rar (下载后改名为9uart.tar.gz)

2.2 关于struct termios

/usr/include/x86_64-linux-gnu/bits/termios.h

typedef unsigned char cc_t;

typedef unsigned int speed_t;

typedef unsigned int tcflag_t;

#define NCCS 32

struct termios

{

tcflag_t c_iflag; //input mode flags: 输入设置

tcflag_t c_oflag; //output mode flags:输出设置

tcflag_t c_cflag; //control mode flags: 控制设置

tcflag_t c_lflag; // local mode flags

cc_t c_line; // line discipline

cc_t c_cc[NCCS]; // control characters

speed_t c_ispeed; // input speed

speed_t c_ospeed; // output speed

}

注意: 各个flags的宏定义都是8进制的,例如:

/* c_iflag bits */

#define INLCR   0000100     --> 16进制: 0x40

#define IGNCR   0000200

#define ICRNL   0000400     --> 16进制:0x100

#define IUCLC   0001000

#define IXON    0002000     --> 16进制: 0x80

二.非标准输入处理

2.1 不输入回车也可以收到一个个字符

cong@msi:/work/test/busytest/10uart$ cat serial.c

#include

#include

#include

int main()

{

int c = 0;

FILE * in;

struct termios oldtm,newtm;

in = fopen("/dev/tty","r");

tcgetattr(fileno(in),&oldtm);

newtm=oldtm;

newtm.c_lflag &= ~ICANON;          //不使用标准行处理模式,这样不输入回车也可以接收到一个个的字符了

// newtm.c_lflag &= ~ECHO;             //不回显,输入的字符不显示出来

// newtm.c_cc[VMIN] = 1;

// newtm.c_cc[VTIME] = 0;

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值