精华内容
下载资源
问答
  • 串行口初始化的步骤
    千次阅读
    2012-03-20 20:42:00

      串行口工作之前首先应对其进行初始化,主要是设置产生波特率的定时器1,、串行口控制和中断控制。具体步骤如下:

    1.确定T1的工作方式(编程TMOD寄存器);

    2.计算T1的初值,装载TH1,TL1;

    3.启动T1(编程TCON中的TR1位);

    4.确定串行口控制(编程SCON寄存器);

    串行口在中断方式工作时,要进行中断设置(编程IE,IP寄存器)

    转载于:https://www.cnblogs.com/steararre/archive/2012/03/20/2408517.html

    更多相关内容
  • 在具体操作串口之前需要对单片机的一些与串口有关的特殊功能寄存器进行初始化设置,主要是设置产生波特率的定时器1、串行口控制和中断控制。
  • 80C51串行口通信

    2020-08-10 20:03:21
    TXD 是80C51单片机的P3.1,RXD 是80C51单片机的P3.0,T1 溢出率 是定时器1 的溢出率 SMOD 是发送速率倍频的 16分频 T1每溢出一次发送一位,里面复杂咱们不管,每次发送完后TI 申请中断,就是串口每次发送完一个...
  • 学习串行口时,感觉挺复杂得 ,但是进入代码之后感觉还行,所以说还是得多练习实践。 2.80c51的串行口结构 2.1、内部结构介绍 AT89S51单片机串行口的内部结构如下图所示。它有两个物理上独立的接收、发送缓冲器...

    学习串行口时,感觉挺复杂得 ,但是进入代码之后感觉还行,所以说还是得多练习实践。

    2.80c51的串行口结构

    2.1、内部结构介绍

    AT89S51单片机串行口的内部结构如下图所示。它有两个物理上独立的接收、发送缓冲器SBUF(属于特殊功能寄存器),可同时发送、接收数据发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入,两个缓冲器共用一个特殊功能寄存器字节地址(99H)。

    TXD(P3.0)发送数据 Transmit(tx) Data 简写形式 

    RXD(P3.1)接受数据 Receive(rx) Data 简写形式 

    1. 串行口的控制寄存器共有两个:特殊功能寄存器SCON和PCON。下面介绍这两个特殊功能寄存器各位的功能。

    2.1.1、串行口控制寄存器SCON

    串行口控制寄存器SCON,字节地址98H,可位寻址,位地址为98H~9FH。SCON时一个特殊功能寄存器,用以设定串行口的工作方式,接收发送控制以设置状态标志,格式如下图所示。(不用的话 设置0,一般默认是0)

    下面介绍SCON中各位的功能。

    (1) SM0、SMl:串行口4种工作方式选择位。

    SM0、SM1两位的编码所对应的4种工作方式见下表。

    表 串行口的4种工作方式

    注:方式1最常用,以此为例!

    (2)SM2:多机通信控制位。

     

    因为多机通信是在方式2和方式3下进行的,因此SM2位主要用于方式2或方式3中。当串行口以方式2或方式3接收时,

    如果SM2=1,则只有当接收到的第9位数据(RB8)为1时,才使RI置l,产生中断请求,并将接收到的前8位数据送人SBUF;当接收到的第9位数据(RB8)为0时,则将接收到的前8位数据丢弃。

    而当SM2=0时,则不论第9位数据是l还是0,都将前8位数据送入SBUF中,并使RI置1,产生中断请求。(RB8不具有激活RI的功能)

    在方式1时,如果SM2=1,则只有收到有效的停止位时才会激活RI(接受控制器)。

    在方式0时,SM2必须为0。

    (3)REN:允许串行接收位

    由软件置1或清0。

    REN=1,允许串行口接收数据。

    REN=O,禁止串行口接收数据。

    (4)TB8:发送的第9位数据。

    方式2和方式3时,TB8是要发送的第9位数据,其值由软件置l或清O。在双机串行通信时,TB8一般作为奇偶校验位使用;在多机串行通信中用来表示主机发送的是地址帧还是数据帧,TB8=1为地址帧,TB8=0为数据帧

    在方式0和1中,该位未用(0)

    (5) RB8:接收的第9位数据。

    工作在方式2和方式3时,RB8存放接收到的第9位数据。在方式1,如果SM2=0,RB8是接收到的停止位。在方式0,不使用RB8。

    (6)TI:发送中断标志位

    串行口工作在方式0时,串行发送的第8位数据结束时TI由硬件置1,在其他工作方式中,串行口发送停止位的开始时置TI为1。TI=1,表示一帧数据发送结束。TI位的状态可供软件查询,也可申请中断。CPU响应中断后,在中断服务程序中向SBUF写入要发送的下一帧数据。TI必须由软件清0

    (7) RI:接收中断标志位

    串行口工作在方式0时,接收完第8位数据时,RI由硬件置1。在其他工作方式中,串行接收到停止位时,该位置l。RI=1,表示一帧数据接收完毕,并申请中断,要求CPU从接收SBUF取走数据。该位的状态也可供软件查询。RI必须由软件清0。

    SCON的所有位都可进行位操作清0或置1。

    2.1.2、特殊功能寄存器PCON

    特殊功能寄存器PCON字节地址为87H,不能位寻址。PCON的格式如下图所示。

    其中,仅仅是最高位SMOD与串行口有关。

    SMOD位:波特率选择位。

    当SMOD=1时,要比SMOD=O时的波特率加倍,所以也称SMOD位为波特率倍增位。

    2.2、80c51的串行口工作方式

    由SM0、SM1两位的编码决定有4种方式!

    2.2.1、方式1、

    只介绍方式1。

    传送一帧数据的格式如图所示,其中:

    TXD为发送端引脚,RXD为接收端引脚。一帧为10位,1位起始位、8位数据位(先低后高)、1位停止位。波特率由T1或T2的溢出率确定。

    在发送或接收到一帧数据后,硬件置TI=1或RI=1,向CPU申请中断;但必须用软件清除中断标志(置0),否则,下一帧数据无法发送或接收。

    (1)发送:

    CPU执行一条写SBUF指令,启动了串行口发送,同时将1写入输出移位寄存器的第9位。发送起始位后,在每个移位脉冲的作用下,输出移位寄存器右移一位,左边移入0,在数据最高位移到输出位时,原写入的第9位1的左边全是0,检测电路检测到这一条件后,使控制电路作最后一次移位,/SEND和DATA无效,发送停止位,一帧结束,置TI=1。

     

    (2)接收:

    REN=1后,允许接收。接收器以所选波特率的16倍速率采样RXD

    端电平,当检测到一个负跳变时,启动接收器,同时把1FFH写入输入移位寄存器(9位)。由于接、发双方时钟频率有少许误差,为此接收控制器把一位传送时间16等分采样RXD,以其中7、8、9三次采样中至少2次相同的值为接收值。接收位从移位寄存器右边进入,1左移出,当最左边是起始位0时,说明已接收8位数据,再作最后一次移位,接收停止位。将接收到的9位数据前8位装入SBUF,第九位进入RB8并置RI=1,向CPU请求中断

    2.2.2、波特率计算

    在串行通信中,收发双方对发送或接受数据的速率要有约定。通过软件可对单片机串行口编程为四种方式。

    方式0和2波特率固定,

    方式1和3波特率可变,由定时器的溢出率来决定。

    各种方式的波特率计算公式;

    1)方式0的波特率=fosc/12

    2)方式2的波特率=2^smod*fosc/64

    3)方式1、3的波特率=2^smod*fosc/32

    由T1或T2的溢出率和SMOD位确定

    定时器的溢出率由定时器中的TH1计数值决定。

    T1定时器溢出率= fosc /[12*(256-TH1)]

    在单片机中,最常用的晶振频率为12MHZ和11.0592MHZ,所以选择用的波特率也相对稳定,常用的波特率以及各参数的关系表

    1)用T1:

    波特率=2^smod*T1定时器的溢出率/32,T1为方式2(这个指的是计时器工作方式,自动重装8位)//T1定时器的溢出率由TH1

    T1定时器溢出率= fosc /[12*(256-TH1)]

    例:已知fosc=6MHz,SMOD=0,设置波特率为2400,求T1的计数初值TH1。

    波特率=1/((12/fosc)*(256-X))/32=fosc/12*32(256-X)

    (256-X)=fosc/2400/384=6M/2400/384;256-X~=6.5104

    TH1~=250=FAH 只能近似计算。

    若fosc=11.0592MHz, 则256-X=11.0592M/2400/384=4068/384=12 TH1=F4H;可精确算出,对其它常用的标准波特率也是能正确算出。所以这个晶振频率是最常用的。

    如果SMOD=1,则同样的X初值得出的波特率加倍。

    2)用T2:

    在52型单片机中,串口方式1、3的波特率发生器选择由TCLK、RCLK位

    确定是T1还是T2。若TCLK=1,则发送器波特率来自T2,否则来自T1。若RCLK=1,则接收器波特率来自T2,否则来自T1。

    由T2产生的波特率与SMOD无关。T2定时的最小单元=2/fosc。T2的溢出脉冲16分频后作为串口的发送或接收脉冲。

    波特率=(1/((2/fosc)(65536-X)))/16=fosc/(32(65536-X))

    例:已知fosc=11.0592MHz,求波特率=2400时的X

    2400=11059200/(32(65536-X)) 65536-X=144 X=65392=FF70H

    2.2.3、串口使用之前的初始化

    主要设置产生波特率的定时器1串行口控制中断控制。具体步骤如下:

    1、确定T1的工作方式(编程TMOD的寄存器)

    2、计算T1 的初值,装TH1.TL1

    3、启动T1(编程中TCON中的TR1位)

    4、确定串行口控制(编程SCON寄存器,这个寄存器可以位寻址即:0x??,也可以直接操作如:SM1=?,SM0=?

    5、串行口在中断方式工作时,要进行中断设置编程IE.IP寄存器

    展开全文
  • 51单片机的串行口是一个可编程全双工的通信接口,具有UART(通用异步收发器)的全部功能,能同时进行数据的发送和接收,也可以作为同步移位寄存器使用。
  • 初始化定时器

    千次阅读 2021-07-27 14:46:48
    初始化定时器具体步骤初始化定时器 编写定时器服务函数 开启定时器 删除定时器 初始化定时器 void init_timer(struct timer_list *timer) 修改定时器值 int mod_timer(struct timer_list *timer, unsigned long...

    初始化定时器具体步骤:

    1. 初始化定时器
    2. 编写定时器服务函数
    3. 开启定时器
    4. 删除定时器
    初始化定时器 void init_timer(struct timer_list *timer)
    修改定时器值 int mod_timer(struct timer_list *timer, unsigned long expires)
    添加定时器 void add_timer(struct timer_list *timer)
    删除定时器 int del_timer(struct timer_list * timer)
    多核处理器删除定时器 int del_timer_sync(struct timer_list *timer)
    
    展开全文
  • 串口通信初始化

    千次阅读 2019-10-29 10:37:18
    linux下串口通信主要有下面几个步骤 串口通信流程图 下面我会一一介绍这几个步骤。 1.打开串口 代码(串口为ttyUSB0) [java] view plain copy //打开串口 intopen_port(void) { ...

    转载地址:http://blog.csdn.net/specialshoot/article/details/50707965

    linux下串口通信主要有下面几个步骤

    Linux串口通信流程

    串口通信流程图

    下面我会一一介绍这几个步骤。

    1.打开串口

    代码(串口为ttyUSB0)

    [java] view plain copy

    1. //打开串口  
    2. int open_port(void)  
    3. {  
    4.     int fd;  
    5.           
    6.     fd=open("/dev/ttyUSB0",O_RDWR | O_NOCTTY | O_NONBLOCK);//O_NONBLOCK设置为非阻塞模式,在read时不会阻塞住,在读的时候将read放在while循环中,下一节篇文档将详细讲解阻塞和非阻塞  
    7. //  printf("fd=%d\n",fd);  
    8.       
    9.     if(fd==-1)  
    10.     {  
    11.         perror("Can't Open SerialPort");  
    12.     }  
    13.       
    14.     return fd;  
    15. }  

    打开串口时也可以多加一些内容,比如判断串口为阻塞状态、测试是否为终端设备等,这些是必要的,所以较上面的基本的打开串口的代码,更加完整健壮一些的代码流程如下所示:

    打开串口较完整流程图

    代码:

    [cpp] view plain copy

    1. /** 
    2.  * open port 
    3.  * @param  fd 
    4.  * @param  comport 想要打开的串口号 
    5.  * @return  返回-1为打开失败 
    6.  */  
    7. int open_port(int fd,int comport)   
    8. {   
    9.     char *dev[]={"/dev/ttyUSB0","/dev/ttyS1","/dev/ttyS2"};  
    10.   
    11.     if (comport==1)//串口1   
    12.     {  
    13.         fd = open( "/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NDELAY);   
    14.         if (-1 == fd)  
    15.         {   
    16.             perror("Can't Open Serial Port");   
    17.             return(-1);   
    18.         }   
    19.      }   
    20.      else if(comport==2)//串口2   
    21.      {       
    22.         fd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY); //没有设置<span style="font-family: Arial, Helvetica, sans-serif;">O_NONBLOCK非阻塞模式,也可以设置为非阻塞模式,两个模式在下一篇博客中具体说明</span>  
    23.   
    24.         if (-1 == fd)  
    25.         {   
    26.             perror("Can't Open Serial Port");   
    27.             return(-1);   
    28.         }   
    29.      }   
    30.      else if (comport==3)//串口3   
    31.      {   
    32.         fd = open( "/dev/ttyS2", O_RDWR|O_NOCTTY|O_NDELAY);   
    33.         if (-1 == fd)  
    34.         {   
    35.             perror("Can't Open Serial Port");   
    36.             return(-1);   
    37.         }   
    38.      }   
    39.      /*恢复串口为阻塞状态*/   
    40.      if(fcntl(fd, F_SETFL, 0)<0)   
    41.             printf("fcntl failed!\n");   
    42.      else   
    43.         printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));   
    44.      /*测试是否为终端设备*/   
    45.      if(isatty(STDIN_FILENO)==0)   
    46.         printf("standard input is not a terminal device\n");   
    47.      else   
    48.         printf("isatty success!\n");   
    49.      printf("fd-open=%d\n",fd);   
    50.      return fd;   
    51. }  

    关键函数解释:

    open

    功能描述:用于打开或创建文件,成功则返回文件描述符,否则返回-1,open返回的文件描述符一定是最小的未被使用的描述符

    [cpp] view plain copy

    1. #include<fcntl.h>  
    2. int open(const char *pathname, int oflag, ... );  

    参数解释:

    pathname:文件路径名,串口在Linux中被看做是一个文件

    oflag:一些文件模式选择,有如下几个参数可以设置

    • O_RDONLY只读模式
    • O_WRONLY只写模式
    • O_RDWR读写模式

    上面三个参数在设置的时候必须选择其中一个!!!下面的是可选的

    • O_APPEND每次写操作都写入文件的末尾
    • O_CREAT如果指定文件不存在,则创建这个文件
    • O_EXCL如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
    • O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
    • O_NOCTTY如果路径名指向终端设备,不要把这个设备用作控制终端。
    • O_NONBLOCK如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)

    下面三个常量同样是选用的,他们用于同步输入输出

    • O_DSYNC等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
    • O_RSYNC读(read)等待所有写入同一区域的写操作完成后再进行
    • O_SYNC等待物理 I/O 结束后再 write,包括更新文件属性的 I/O

    对于串口的打开操作,必须使用O_NOCTTY参数,它表示打开的是一个终端设备,程序不会成为该端口的控制终端。如果不使用此标志,任务的一个输入(比如键盘终止信号等)都会影响进程。

    O_NDELAY表示不关心DCD信号所处的状态(端口的另一端是否激活或者停止)。

    fcntl

    功能描述:根据文件描述词来操作文件的特性,返回-1代表出错

    [cpp] view plain copy

    1. #include<unistd.h>  
    2. #include<fcntl.h>  
    3. int fcntl(int fd,int cmd);  
    4. int fcntl(int fd,int cmd,long arg);  
    5. int fcntl(int fd,int cmd,struct flock *lock);  

    参数说明:

    • fd:文件描述符
    • cmd:命令参数

    fcntl函数有5种功能: 
    1. 复制一个现有的描述符(cmd=F_DUPFD). 
    2. 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD). 
    3. 获得/设置文件状态标记(cmd=F_GETFL或F_SETFL). 
    4. 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN). 
    5. 获得/设置记录锁(cmd=F_GETLK , F_SETLK或F_SETLKW).

    具体使用见http://www.cnblogs.com/lonelycatcher/archive/2011/12/22/2297349.html

    isatty

    函数功能,实现只使用了一个终端专用的函数tcgetattr(如果成功之星,它不改变任何东西),并取其返回值。若为终端设备返回1,否则返回0。详情见http://blog.csdn.net/wangjingyu00711/article/details/41693155

    2.串口的初始化

    串口初始化工作需要做以下工作:

    1. 设置波特率
    2. 设置数据流控制
    3. 设置帧的格式(即数据位个数,停止位,校验位)

    串口初始化

    串口初始化

    代码:

    [cpp] view plain copy

    1. int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)   
    2. {   
    3.      struct termios newtio,oldtio;   
    4. /*保存测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息*/   
    5.      if  ( tcgetattr( fd,&oldtio)  !=  0) {    
    6.       perror("SetupSerial 1");  
    7.     printf("tcgetattr( fd,&oldtio) -> %d\n",tcgetattr( fd,&oldtio));   
    8.       return -1;   
    9.      }   
    10.      bzero( &newtio, sizeof( newtio ) );   
    11. /*步骤一,设置字符大小*/   
    12.      newtio.c_cflag  |=  CLOCAL | CREAD;    
    13.      newtio.c_cflag &= ~CSIZE;    
    14. /*设置停止位*/   
    15.      switch( nBits )   
    16.      {   
    17.      case 7:   
    18.       newtio.c_cflag |= CS7;   
    19.       break;   
    20.      case 8:   
    21.       newtio.c_cflag |= CS8;   
    22.       break;   
    23.      }   
    24. /*设置奇偶校验位*/   
    25.      switch( nEvent )   
    26.      {   
    27.      case 'o':  
    28.      case 'O': //奇数   
    29.       newtio.c_cflag |= PARENB;   
    30.       newtio.c_cflag |= PARODD;   
    31.       newtio.c_iflag |= (INPCK | ISTRIP);   
    32.       break;   
    33.      case 'e':  
    34.      case 'E': //偶数   
    35.       newtio.c_iflag |= (INPCK | ISTRIP);   
    36.       newtio.c_cflag |= PARENB;   
    37.       newtio.c_cflag &= ~PARODD;   
    38.       break;  
    39.      case 'n':  
    40.      case 'N':  //无奇偶校验位   
    41.       newtio.c_cflag &= ~PARENB;   
    42.       break;  
    43.      default:  
    44.       break;  
    45.      }   
    46.      /*设置波特率*/   
    47. switch( nSpeed )   
    48.      {   
    49.      case 2400:   
    50.       cfsetispeed(&newtio, B2400);   
    51.       cfsetospeed(&newtio, B2400);   
    52.       break;   
    53.      case 4800:   
    54.       cfsetispeed(&newtio, B4800);   
    55.       cfsetospeed(&newtio, B4800);   
    56.       break;   
    57.      case 9600:   
    58.       cfsetispeed(&newtio, B9600);   
    59.       cfsetospeed(&newtio, B9600);   
    60.       break;   
    61.      case 115200:   
    62.       cfsetispeed(&newtio, B115200);   
    63.       cfsetospeed(&newtio, B115200);   
    64.       break;   
    65.      case 460800:   
    66.       cfsetispeed(&newtio, B460800);   
    67.       cfsetospeed(&newtio, B460800);   
    68.       break;   
    69.      default:   
    70.       cfsetispeed(&newtio, B9600);   
    71.       cfsetospeed(&newtio, B9600);   
    72.      break;   
    73.      }   
    74. /*设置停止位*/   
    75.      if( nStop == 1 )   
    76.       newtio.c_cflag &=  ~CSTOPB;   
    77.      else if ( nStop == 2 )   
    78.       newtio.c_cflag |=  CSTOPB;   
    79. /*设置等待时间和最小接收字符*/   
    80.      newtio.c_cc[VTIME]  = 0;   
    81.      newtio.c_cc[VMIN] = 0;   
    82. /*处理未接收字符*/   
    83.      tcflush(fd,TCIFLUSH);   
    84. /*激活新配置*/   
    85. if((tcsetattr(fd,TCSANOW,&newtio))!=0)   
    86.      {   
    87.       perror("com set error");   
    88.       return -1;   
    89.      }   
    90.      printf("set done!\n");   
    91.      return 0;   
    92. }   

    讲解这片代码之前,我们要先研究一下termios的数据结构。最小的termios结构的典型定义如下:[cpp] view plain copy

    1. struct termios  
    2. {  
    3.            tcflag_t c_iflag;  
    4.            tcflag_t c_oflag;  
    5.            tcflag_t c_cflag;  
    6.            tcflag_t c_lflag;  
    7.            cc_t           c_cc[NCCS];  
    8. };  

    上面五个结构成员名称分别代表:

    • c_iflag:输入模式
    • c_oflag:输出模式
    • c_cflag:控制模式
    • c_lflag:本地模式
    • c_cc[NCCS]:特殊控制模式

    五种模式的参数说明见博客http://blog.csdn.net/querdaizhi/article/details/7436722
    tcgetattr可以初始化一个终端对应的termios结构,tcgetattr函数原型如下:[cpp] view plain copy

    1. #include<termios.h>    
    2. int tcgetattr(int fd, struct termios *termios_p);   

    这个函数调用把低昂前终端接口变量的值写入termios_p参数指向的结构。如果这些值其后被修改了,可以通过调用函数tcsetattr来重新配置。tcsetattr函数原型如下:[cpp] view plain copy

    1. #include<termios.h>    
    2. int tcsetattr(int fd , int actions , const struct termios *termios_h);    

    参数actions控制修改方式,共有三种修改方式,如下所示:

    1. TCSANOW:立刻对值进行修改
    2. TCSADRAIN:等当前的输出完成后再对值进行修改
    3. TCSAFLUSH:等当前的输出完成之后,再对值进行修改,但丢弃还未从read调用返回的当前的可用的任何输入。

    在我们的代码中,我们设置为NOW立即对值进行修改。tcflush用于清空中端为完成的输入/输出请求及数据,它的函数原型如下:[cpp] view plain copy

    1. int tcflush(int fd, int queue_selector);  

    其中queue_selector时控制tcflush的操作,取值可以为如下参数中的一个:TCIFLUSH清楚正收到的数据,且不会读出来;TCOFLUSH清楚正写入的数据,且不会发送至终端;TCIOFLUSH清除所有正在发送的I/O数据。再看我们的代码,我们修改字符大小的代码为[cpp] view plain copy

    1. newtio.c_cflag  |=  CLOCAL | CREAD;    
    2. newtio.c_cflag &= ~CSIZE;    

    c_cflag代表控制模式

    • CLOCAL含义为忽略所有调制解调器的状态行,这个目的是为了保证程序不会占用串口。
    • CREAD代表启用字符接收器,目的是是的能够从串口中读取输入的数据。
    • CS5/6/7/8表示发送或接收字符时使用5/6/7/8比特。
    • CSTOPB表示每个字符使用两位停止位。
    • HUPCL表示关闭时挂断调制解调器。
    • PARENB:启用奇偶校验码的生成和检测功能。
    • PARODD:只使用奇校验而不使用偶校验。

    c_iflag代表输入模式

     

    • BRKINT:当在输入行中检测到一个终止状态时,产生一个中断。
    • TGNBRK:忽略输入行中的终止状态。
    • TCRNL:将接受到的回车符转换为新行符。
    • TGNCR:忽略接受到的新行符。
    • INLCR:将接受到的新行符转换为回车符。
    • IGNPAR:忽略奇偶校检错误的字符。
    • INPCK:对接收到的字符执行奇偶校检。
    • PARMRK:对奇偶校检错误作出标记。
    • ISTRIP:将所有接收的字符裁减为7比特。
    • IXOFF:对输入启用软件流控。
    • IXON:对输出启用软件流控。

    c_cc特殊的控制字符

     

    标准模式和非标准模式下,c_cc数组的下标有不同的值:

    标准模式:

     

    • VEOF:EOF字符
    • VEOL:EOF字符
    • VERASE:ERASE字符
    • VINTR:INTR字符
    • VKILL:KILL字符
    • VQUIT:QUIT字符
    • VSTART:START字符 
    • VSTOP:STOP字符

    非标准模式:

     

    • VINTR:INTR字符
    • VMIN:MIN值
    • VQUIT:QUIT字符
    • VSUSP:SUSP字符
    • VTIME:TIME值
    • VSTART:START字符 
    • VSTOP:STOP字符

    cfsetispeed和cfsetospeed用来设置输入输出的波特率,函数模型如下:

     

    [cpp] view plain copy

    1. int cfsetispeed(struct termios *termptr, speed_t speed);  
    2. int cfsetospeed(struct termios *termptr, speed_t speed);  

    参数说明:

     

    • struct termios *termptr:指向termios结构的指针
    • speed_t speed:需要设置的波特率
    • 返回值:成功返回0,否则返回-1

    这样,所有的初始化操作我们就完成了。

    下一篇文章我会记录串口的读写及关闭操作的详细步骤。并且会把源代码链接给出供大家参考!

    展开全文
  • 单片机串行口的应用.ppt该文档详细且完整,值得借鉴下载使用,欢迎下载使用,有问题可以第一时间联系作者~
  • 单片机—串行口

    2020-12-28 10:58:35
    目录前言一、串行口结构与相关寄存器1、串行口结构2、相关SFR二、串行口的工作方式三、串行口初始化 前言 串行口知识简单整理 一、串行口结构与相关寄存器 1、串行口结构 (1)8051系列单片机片上有UART(通用...
  • 串口初始化

    2020-02-17 13:34:19
    串口初始化: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> ...
  • 串行口通信(一)

    千次阅读 2021-01-06 13:59:07
    串行口通信就被发明出来,下面来了解串行口通信(uart)。 几个概念 为了能更好理解串行口通信,在介绍它之前,先来看看几个概念,补充知识,方便深入明白uart工作原理。 通信方式 通信方式 通信方式有两种,...
  • 串口通信的前期讲解

    2022-03-11 19:32:13
    文章目录串口通信(电脑与外设的一种通讯)前言一、对串口通信介绍硬件设置软件设置二、步骤1.tongxin_init的初始化函数2.mian.c函数的写法学习方法 前言 可以想象我们的电脑和使用设备的一种谈话,其中含有同步...
  • 串行通信有单工通信、半双工通信和全双工通信3种方式。 单工通信:数据只能单方向地从一端向另一端传送。例如,目前的有线电视节目,只能单方向传送。 半双工通信:数据可以双向传送,但任一时刻只能向一个方向...
  • //SPI口初始化 //这里针是对SPI1的初始化 void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; /* SPI的IO口和SPI外设打开时钟 */ RCC_APB2PeriphClockCmd(RCC_...
  • STM32-USART串口初始化配置

    千次阅读 2020-07-14 07:12:12
    一、串行通信的基本概念 1.同步通信和异步通信 通信,最少要两个对象,一个收,一个发 同步通信:通信双方根据同步信号进行通信的方式。 异步通信:数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定...
  • 串行口扩展并行输出口 一、实验目的 二、实验内容 三、实验步骤 四、C代码如下 五、实验结果 六、实验体会 一、实验目的 掌握AT89C52串行口方式0的工作方式和编程 掌握利用串行口和移位寄存器扩展并行...
  • 基于FPGA OV7670摄像头初始化配置

    千次阅读 2020-09-25 17:33:46
    所用模块如图: 主要引出的信号引脚如下: SCL:SCCB时钟 SDA:SCCB数据 VSYNC:场同步(帧同步)信号 HREF:行同步信号 PCLK:像素时钟 XCLK:系统时钟输入 D0-D7:数据位 RESET:初始化所有寄存器到默认值 ...
  • 了解微机系统串行口RS-232C的内部结构、工作原理; 掌握Ins 8250的初始化编程方法,学会串行通信程序的设计。 二、实验内容 实验内容1:完成硬件测试环境,编写程序对微机系统的串口进行查询方式自发自收外环测试...
  • 51单片机串口通信初始化

    千次阅读 2020-10-23 20:15:35
    主机的P3,1(TXD)连接到从机的P3,0(RXD),利用开关对主机的P1赋值,将P1的数据存到主机SBUF,在通过串口传动到从机的SBUF,从机将接收到的数据从机的P1体现。 说明:主机和从机代码分开。 //主机程序 (汇编) ...
  • 串行口中断 4.1串行口中断通信 代码示范 4.2串行口中断通信分析 4.2.1 80C51串行口的结构 4.2.2 使用到的新寄存器 4.2.3 波特率的设置 4.3串口如何使用 5.参考资料 1.中断系统的概念 1.1中断的概念 CPU在处理某一...
  • VB 提供了MSComm 串行端口控件来为应用程序提供串行通讯,该控件屏蔽了通信过程中的底层操作,程序员应用时只需设置、监视 MSComm 控件的属性和事件即可完成对串行口初始化和数据的输入输出工作,...
  • 串口配置一般步骤 1.串口时钟使能, ...4.串口参数初始化:USART_Init(); 5.开启中断并且初始化NVIC NVIC_Init();USART_ITConfig(); 6.使能串口:USART_Cmd(); 7.编写中断处理函数:USARTx_IRQHandler(); 8.串口数
  • STM32串口初始化与使用详解(基于HAL库编程)

    千次阅读 多人点赞 2020-07-22 16:58:55
    STM32串口初始化与使用详解串口简介串口初始化具体步骤串口收发理论代码执行 串口简介 USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步串行接收发送器 即串口。是一个高度灵活的收发...
  • UART串行口简介

    2013-07-16 10:14:47
    UART串行口简介,端口,相关寄存器的详细介绍等
  • 串行口 一 串口基础知识 串口概念 串行接口(Serial port)"同步/异步串行接收/发送器。"又称“串口”USART,也称串行通信接口(通常指COM接口),是采用串行通信方式的扩展接口。 2、USART的用处 基于ARM ...
  • 2.根据要求计算定时/计数器的计数值,在求得计数初值,写入初始化寄存器 。 3.根据需求,开放定时/计数器中断选项 4.设置 TCON,通过 TR0 置 1 来让定时器开始计数。 5.等待定时时间到,如果查询处理编写查询程序...
  • Stm32 iic初始化介绍

    千次阅读 2018-05-27 12:40:22
    2018/5/271.iic介绍:iic (Inter_Integrated Circuit)集成...:iic的初始化按照对GPIO的设置来配置iic相关的端口(这里以Stm32F103rc为例)注:可以使用定义的方法先定义相应端口//IO方向设置 #define SDA_IN() {G...
  • C51单片机————串行接口

    千次阅读 多人点赞 2018-07-15 14:37:55
    C51单片机————串行接口 定时(定时控制、测量、延时。。。)和计数(对外部事件统计数目)。 Created with Raphaël 2.1.2张三张三李四李四嘿,四哥, 定时器和计数器有哪几种实现哦?想了想主要有三种方法那...
  • 实验名称: 测试微机系统串行口(实验教程P109 实验6.10,可参考课本341页例9.3) 实验环境:PC系列机,汇编语言开发工具TASM5.0或 未来汇编 实验目的: 学习汇编语言程序设计的方法;掌握8250异步串行接口芯片的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,365
精华内容 3,346
关键字:

串行口初始化的步骤