Linux串口serial编程参数设置

一、简介

1.1 Linux串口编程主要是设置structtermios结构体的个成员值。Termios是在POSIX规范中定义的标准接口,表示终端设备(包括虚拟终端丶串口等),串口是一种终端设备,一般通过终端编程接口对其进行配置和控制。

串口的配置最重要的是以下结构体定义中标明红色的条目,配置方法如下:

  某几位清0:struct_name.flag&=  ~(MASK1 | MASK 2….)

  某几位置1:struc_name.flag|=    (MASK1 | MASK2…)

1.2例如:设置115200的波特率:

        Structtermios new_cfg;

        New_cfg.c_cflag|= B115200

1.3本文写作目的旨在方便查阅串口设置结构体的组成,方便开发

二、结构体定义

#include<termios.h>

Struct termios{

Unsigned short c_iflag;            //输入模式标志

Unsigned short c_oflag;          //输出模式标志

Unsigned short c_cflag;           //控制模式标志

Unsigned short c_lflag;          //本地模式标志

Unsigned char c_line;           //线路规程

Unsigned char c_cc[NCC];       //控制特性

Speed_t c_ispeed;              //输入速度

Speed_t c_ospreed;            //输出速度

}

  2.1 输入模式标志(c_iflag:16bit)

  

INPCK

奇偶校验使能

IGNPAR

忽略奇偶校验错误

PARMRK

奇偶校验错误掩码

ISTRIP

裁剪掉第8比特

IXON

启动输出软件控制流

IXOF

启动输入软件控制流

IXANY

输入任意字符可以重新启动输入(默:起始字符)

IGNBRK

忽略输入终止条件

BRKINT

当检测到输入终止条件时发送SIGINT信号

INLCR

当收到NL(换行符)转换CR(回车符)

IGNCR

忽略收到的CR

ICRNL

当收到CR转换为NL

IUCLC

讲接收到的大写字符映射为小写字符

IMAXBEL

当输入队列满时响铃

2.2输出模式标志(c_oflag :16bit)

OPOST

启动输出处理功能,如果不设置,其他位忽略

OLCUC

将输出中的大写字符转换成小写字符

ONLCR

将输出中的换行符(‘\n’)转换成回车符(‘\r’)

ONOCR

如果当前列号为0,则不输出回车字符

OCRNL

将输出中的回车符转换成换行

ONLRET

不输出回车符

OFILL

发送填充字符以提供延时

OFDEL

如果设置该标志,则表示填充字符为DEL字符,否则为NUL

NLDLY

换行延时掩码

CRDLY

回车延时掩码

TABDLY

制表符延时掩码

BSDLY

水平退格符延时掩码

VTDLY

垂直退格符延时掩码

FFLDY

换页符延时掩码

2.3控制模式标志(c_cflag:16bit)

CBAUD

波特率的位掩码

B0

0波特率(放弃DTR)

B1800

1800的波特率

B2400

2400的波特率

B4800

4800的波特率

B9600

9600的波特率

B19200

19200的波特率

B38400

38400的波特率

B57600

57600的波特率

B115200

115200的波特率

EXTA

外部时钟率

EXTB

外部时钟率

CSIZE

数据位的位掩码

CS5

5个数据位

CS6

6个数据位

CS7

7个数据位

CS8

8个数据位

CSTOPB

2个停止位(不设置则是一个)

GREAD

接收使能

PARENB

PARODD

校验使能位

使用奇校验而不是偶校验

HUPCL

最后关闭时挂线(放弃DTR)

CLOCAL

本地连接(不改变端口所有者)

CRTSCTS

硬件流控

 

 

2.4本地模式标志(c_lflag:16bit)

ISIG

若收到信号字符(INTR,QUIT等)则会产生相应的信号

ICANON

启动规范模式

ECHO

启动本地回显功能

ECHOE

若设置ICANON则允许退格操作

ECHOK

若设置ICANON,则KILL字符会删除当前行

ECHONL

若设置ICANON,则允许回显换行符

ECHOCTL

若设置ECHO,则控制字符会显示成^x,其中x的ASCII码等于给相应的控制字符的ASCII码加上0x40.

ECHOPRT

若设置ICANON和IECHO,则删除字符和被删除的字符都会被显示

ECHOKE

若设置ICANON,则允许回显在ECHOE和ECHOPRT中设定的KILL字符

NOFLASH

在通常情况下,当接收到INTR,QUIT,SUSP控制字符时,会清空输入和输出队列。如果设置改标志,则所有的队列不会被清空

TOSTOP

若一个后台进程师徒向他的控制终端进行写操作,则系统向改后台进程的进程组发送SIGTTOU信号。该信号通常终止进程的执行

IEXTEN

启动输入处理功能

2.5控制特性(c_cc[])

VINTR

中断控制字符,对应的键位ctrl+c

VQUIT

退出操作符,对应的键为ctrl+z

VERASE

删除操作符,对应Backspace

VKILL

删除行符,对应的键为ctrl+u

VEOF

文件结尾符,对应的键为ctrl+d

VEOL

附加行结尾符,对应的键为carriage return

VEOL2

第二行结尾符,对应的键为line feed

VMIN

指定最少读取的字符数

VTIME

指定读取的每个字符之间的超时时间

三、串口配置基本流程

3.1保存串口配置

  int tcgetattr(int fd, struct termios *termios_p);

3.2激活选项

 CLOCAL和CREAD分别用于本地连接和接收使能,因此要先通过位掩码的方式激活这两个选项:

newtio.c_cflag |=CLOCAL |CREAD;

3.3设置波特率

   波特率的设置不能直接通过掩码来设定,有提供设置函数:

 cfsetispeed(&new_cfg,B115200);

cfsetospeed(&new_cfg,B115200);

3.4设置数据位

首先去掉数据位中的位掩码,再重新按要求设置:

New_cfg.c_cflag &=~CSIZE;

New_cfg.c_cflag |=CS8;

3.5设置奇偶校验位

 New_cfg.c_cflag|=(PARODD | PARENB)     //激活校验位使能

New_cfg.c_iflag                         //激活对输入数据的奇偶校验使能

3.6设置停止位

New_cfg.c_cflag  &= ~CSTOPB            //讲奇偶校验位设置一个比特

New_cfg.c_cflag |=CSTOPB                //讲奇偶校验位设置两个比特

3.7设置最少字符和等待时间

New_cfg.c_cc[VTIME]=0;

New_cfg.c_cc[VMIN]=0;

3.8清除串口缓存

由于串口在重新设置之后,需要对当前的串口设备进行适当的处理,这时就可以调用在<termios.h>中声明的tcdrain(),tcflow(),tcflush()等函数来处理目前串口缓冲中的数据,格式如下:

int tcdrain(int fd)  //使程序阻塞,直到输出缓冲区的数据全部发送完毕

int tcflow(int fd,int action)    //用于暂停或者重新开始输出

int tcflush(int fd,int queue_selector)  //用于清空输入输出缓冲区

3.9激活配置

tcsetattr(int fd,int option_action,conststruct terios *termrios_p)

Param :

Optional_options:

               TCSCANOW:配置的修改立即生效

                                TCSADRAIN:配置的修改在所有写入fd的输出都传输完毕之后生效

               TCSAFLUSH:所有已接受但未读入的输出都将在修改生效之前被丢弃

Return:

   0:成功

  -1:失败

3.10使用串口

串口配置完成后就可以像文件一样读写数据,使用read(),write()函数

四、串口配置实例(通用函数封装)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <pthread.h>
#include <string.h>
#include<stdbool.h>
#include <termios.h>

/*@ Fn uartOpen

   @param     uartDevicePath      设备文件

   @param     speed                       波特率,默认115200

   @param     dataWidth                数据位宽,默认8bit

   @param     stopBit                      停止位,true:2bit;    false:1bit;

 

   @return       fd                               打开文件描述符

*/ 

int uartOpen(char *uartDevicePath,int speed,int dataWidth,bool stopBit)
{
 //Info
int fd=-1;
struct termios new_cfg,old_cfg; 
printf("uart path=%s\n",uartDevicePath);  


 //open device
fd=open(uartDevicePath,O_RDWR | O_NOCTTY );
if(fd==-1)
printf("open failed!\n");


//preserve the old configuration
if(tcgetattr(fd,&old_cfg)!=0)
  printf("Old config preserve failed!\n");


//set mode
new_cfg.c_cflag |=CLOCAL |CREAD;


//set baudrate
switch(speed){
  case 1800:{
   cfsetispeed(&new_cfg,B1800);
   cfsetospeed(&new_cfg,B1800);
}break;
  case 2400:{
   cfsetispeed(&new_cfg,B2400);
   cfsetospeed(&new_cfg,B2400);
}break;
  case 4800:{
   cfsetispeed(&new_cfg,B4800);
   cfsetospeed(&new_cfg,B4800);
}break;
  case 9600:{
   cfsetispeed(&new_cfg,B9600);
   cfsetospeed(&new_cfg,B9600);
}break;
  case 19200:{
   cfsetispeed(&new_cfg,B19200);
   cfsetospeed(&new_cfg,B19200);
  }break;
  case 38400:{
   cfsetispeed(&new_cfg,B38400);
   cfsetospeed(&new_cfg,B38400);
}break;
  case 57600:{
   cfsetispeed(&new_cfg,B57600);
   cfsetospeed(&new_cfg,B57600);
}break;
  case 115200:{
   cfsetispeed(&new_cfg,B115200);
   cfsetospeed(&new_cfg,B115200);
}break;
  default:{
  cfsetispeed(&new_cfg,B115200);
  cfsetospeed(&new_cfg,B115200);
  }break;
}
//set size of data
new_cfg.c_cflag &=~CSIZE;
switch(dataWidth){
case 5:{
new_cfg.c_cflag |=CS5;
}break;
case 6:{
new_cfg.c_cflag |=CS6;
}break;
case 7:{
new_cfg.c_cflag |=CS7;
}break;
case 8:{
new_cfg.c_cflag |=CS8;
}break;
default :{
new_cfg.c_cflag |=CS8;
}break;
}
//set stopbit:true 2 stopbit,false 1 stopbit
if(stopBit)
new_cfg.c_cflag |=(CSTOPB);
else
new_cfg.c_cflag &=~(CSTOPB);
//set others
new_cfg.c_cc[VTIME]=0;
new_cfg.c_cc[VMIN]=0;
//start
if(-1==tcsetattr(fd,TCSANOW,&new_cfg))
printf("Uart setting failed!\n");


return fd;
}
void main()
{
int fd=uartOpen("/dev/ttyUSB0",115200,8,true);


while(1){
;
//handle here
}
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Serial Debug Assistant是一款用于串口调试的工具软件。它可以帮助开发人员在开发过程中进行串口通信的测试和调试工作,以确保串口通信的稳定和准确性。 使用Serial Debug Assistant可以实现以下功能: 1. 监控串口数据:开发人员可以通过该软件监控串口的数据流,包括发送和接收的数据。这样可以及时发现串口通信中的问题,并进行调试分析。 2. 发送数据:开发人员可以通过该软件向串口发送数据,用于测试设备的接收功能是否正常。可以发送不同类型的数据,并且可以自定义数据格式和发送频率。 3. 接收数据:软件可以将串口接收到的数据显示出来,包括数据的十六进制和ASCII码表示。这样开发人员可以查看设备发送的数据是否符合预期,并进行分析和处理。 4. 数据记录:Serial Debug Assistant可以将串口通信的数据记录下来,以便后续分析和查看。记录的数据可以保存为文件,方便分享和复查。 5. 数据分析:软件还提供数据分析的功能,可以统计串口通信的数据发送和接收情况,包括发送和接收的字节数、传输速率等。这样可以帮助开发人员了解串口通信的性能和稳定性。 总之,Serial Debug Assistant是一款功能强大的串口调试工具,可以帮助开发人员简化串口调试工作,提高开发效率。无论是调试嵌入式设备还是与外部设备进行通信,该软件都能够提供有效的支持和辅助。 ### 回答2: Serial Debug Assistant是一款用于串口调试的工具,可以帮助开发人员快速进行串口通信的调试工作。该软件提供了简单易用的界面和功能,能够与串口设备进行数据的发送和接收,并可以对数据进行显示和分析,方便用户进行开发和调试。 首先,用户可以通过Serial Debug Assistant软件连接串口设备,选择正确的串口号和波特率,以实现与串口设备的通信。用户可以随时发送数据给串口设备,也可以接收串口设备发送的数据。这对于开发人员来说非常重要,可以方便地观察和分析设备的数据传输情况,从而定位问题和调试代码。 此外,Serial Debug Assistant还提供了实时数据的显示和记录功能。用户可以通过软件界面实时查看串口设备发送和接收的数据,并可以以文件的形式保存下来,以便将来查看和分析。这大大提高了开发人员的工作效率,同时也方便了团队协作和问题的追踪。 Serial Debug Assistant还支持数据的格式转换和校验功能。用户可以选择不同的数据显示格式,如ASCII或Hex,以便更好地理解和分析数据。此外,软件还提供了校验和功能,可以验证接收到的数据是否正确,防止数据传输错误。 总之,Serial Debug Assistant是一款功能强大且易于使用的串口调试工具,通过它,开发人员能更加高效地进行串口通信的调试和开发工作,提高工作效率。无论是初学者还是经验丰富的开发人员,都可以通过该软件轻松地完成串口调试任务。 ### 回答3: Serial Debug Assistant是一个串口调试助手软件,可以帮助开发人员在调试串口设备时进行数据的监控和分析。 首先,Serial Debug Assistant提供了简单易用的界面,使得用户可以通过图形化界面方便地进行串口设置。用户可以选择串口的波特率、数据位、校验位和停止位等参数,以及选择要监听的串口设备。这些设置可以帮助开发人员在调试过程中确保串口和设备之间的通信设置正确。 其次,Serial Debug Assistant可以实时显示串口收发的数据以及相应的时间戳。用户可以通过软件界面来监控串口设备的数据流,方便地查看数据的发送和接收情况。这对于调试串口设备时定位问题非常有帮助。 此外,Serial Debug Assistant还提供了数据分析和统计功能。用户可以对收到的串口数据进行解析和分析,比如将十六进制数据转化为ASCII码显示。同时,软件还可以统计发送和接收的数据量,帮助开发人员评估串口的性能和稳定性。 最后,Serial Debug Assistant支持保存数据和设置保存路径。用户可以将串口数据保存到文件中,方便后续的数据分析和调试。此外,软件还可以自动识别设备插拔并刷新串口列表,提高了用户的使用体验。 总之,Serial Debug Assistant是一款功能强大、易用性高的串口调试助手软件,对于开发人员在调试串口设备时具有重要的帮助作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值