串口编程 一


        

串口开发主要有三个方面介绍:

1、  串口概述

2、  串口设置

3、  串口的使用详解

一、串口的概述:常见的串口数据通信方式:并行通信和串行通信;

串行通信是计算机通信常见数据接口,如:RS-232-C,该标准规定采用一个DB25芯连接器和DB9芯连接器。简单的介绍一下DB25和DB9,这里主要用到了其中的三个引脚,一个发送数据(TXD),一个接受数据(RXD),一个接地(GND)。只要去控制这三个引脚就可以。    

芯片内部含有UART控制器,其工作方式主要有中断模式(Interrupt)和直接内存访问(DMA)两种工作方式;还有一种是查询方式,这种工作模式我到目前在工作过程中还没有遇到过。串口驱动的编程实质上就是对UART控制器的操作实现。

UART操作主要包括以下几个部分:

1,  数据发送;

2,  数据接收;

3,  产生中断;

4,  产生波特率;

5,  红外模式;

6,  Loopback模式;

7,  自动流控制模式;

串口参数的配置主要包括:波特率,数据位,校验位,停止位,流控协议。

Linux下串口设备存放的位置是/dev文件或是说Linux的操作的设备基本都存放在该目录下;

有多个串口设备时对应的设备名分别是:/dev/ttyS0、/dev/ttyS1、/dev/ttyS2依次增加,在Linux下操作串口和操作文件是相同的,也就是需要open,write,read,close等函数对串口进行打开,读写,关闭的操作;

 

二、串口的详细配置

        在使用串口时必须对其进行相关的配置:如波特率,数据位,校验位,停止位等;

串口的设置具体由下面的数据结构体实现:

  Struct termios
   {

unsigned shortc_iflag; /* 输入模式标志*/
      unsigned shortc_oflag; /* 
输出模式标志*/
      unsigned shortc_cflag; /* 
控制模式标志*/
      unsigned shortc_lflag; /*
区域模式标志或本地模式标志或局部模式*/
      unsigned charc_line; /*
行控制linediscipline */

      unsignedchar c_cc[NCC];/* 控制字符特性*/
     };

该结构体中最重要的就是c_cflag标志;它可以设置波特率,检验位,停止位,数据位等,在设置波特率时要在前面加上“B”,如B9600B15200。使用其要通过“&”“|”,等操作方式。

其次是输入标志c_iflag成员控制端口接收字符处理;termios 结构中这两个成员都有很多的操作标志宏:

c_cflag                              c_iflag

       CCTS_OFLOW;输出的CTS流控制;  BRKINT;接到BREAK时产生SIGINT

       CIGNORS; 忽略控制标志;                       ICRNL;将输入的CR转化为NL

       CLOCAL; 忽略解制-解调器状态行;       IGNBRK;忽略BREAK条件

       CREAD; 启用接收装置                            IGNBCR;忽略CR

CRTS_IFLOW; 输入RTS流控制            IGNPAR;忽略奇偶错字符

       CSIZE; 字符大小屏蔽                             IMAXBEL;在输入列空时振铃;

       CSTOPB;设置两个停止位,否则为1 INLCR;将输入的NL转化为CR

       HUPCL;最后关闭时断开                          INPCK;打开输入奇偶校验;

       MDMBUF;经载波的流控制输出

       PARENB;进行奇偶校验

       PARODD;奇校验,否则为偶校验

 

接下来就是串口的控制函数:

Tcgetattr;获取属性;

Tcsetattr:设置属性;

cfgetispeed;获取输入速度

cfgetospeed;获取输出速度;

cfsetispeed设置输入速度;

cfsetospeed;设置输出速度;

Tcdrain等待所有输出被传输;

tcflow挂起传输或接收;

tcflush刷清未决输入和/或输出;

TcsendbreakBREAK字符;

tcgetpgrp;获取前台进程组ID

tcsetpgrp;设置前台进程组ID

       

串口的配置流程:

1. 保存原先串口配置使用tcgetattrfd&oldtio)函数

struct termios  newtio oldtio

tcgetattrfd&oldtio);

2. 激活选项有CLOCALCREAD,用于本地连接和接收使能;    

newtio,c_cflag  |=  CLOCAL | CREAD;

3.   设置波特率,使用cfsetispeedcfsetospeed

       cfsetispeed&newtioB115200;

cfsetospeed&newtio, B115200;

4.   设置数据位,需要使用掩码设置;

       newtio.c_cflag&= ~CSIZE

       newtio.c_cflag|= CS8

 

5.    设置奇偶校验,使用c_cflagc_iflag设置奇偶校验;

       设置奇校验:

newtio.c_cflag  |=  PARENB;

newtio.c_cflag  |=  PARODD;

newtio.c_iflag  |=  (INPCK| ISTRIP);

       设置偶校验:

newtio.c_iflag  |=  (INPCK| ISTRIP);

newtio.c_cflag  |=  PARENB;

newtio.c_cflag  |=  PARODD;

newtio.c_cflag  &= ~PARENB;

       6.    设置停止位。通过激活c_cflag中的CSTOPB实现。若停止位为1位,则清除CSTOPB,若停止位为2,则激活CSTOPB

                     newtio.c_cflag & = ~CSTOPB;

       7.    设置最少字符和等待时间,对于接收字符和等待时间一般没有特别要求,全都设置为0

                     newtio.c_c[VMIN] = 0;

                     newtio.c_c[VTIME] = 0;

       8.   处理要写入的引用对象

tcflush函数刷清输入缓存或输出缓存;

函数原型:int tcflushint filedesint queue

Queue数应该是下列三个常数之一:

·TCIFLUSH刷清输入队列;

          ·TCOFLUSH刷清输出队列;

              ·TCIOFLUSH刷清输入输出队列;

9激活配置。在完成配置后,需要激活配置使其生效,使用tsettattr()函数。原型:

       int tcgetattrint filedes, struct termiso *termptr;

       int  tcsetattr(int filedes,  int opt, conststruct  termios *termptr);

 到此串口的基本配置就完成了,接下来就是根据上述所说实现串口设备的访问。详见串口编程二

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值