UART(Universal Asynchronous Receiver Transmitter:通用异步收发器)

本文主要是介绍UART(Universal Asynchronous Receiver Transmitter:通用异步收发器),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UART(Universal Asynchronous Receiver Transmitter:通用异步收发器)

UART协议虽然速率较低,但协议简单,实现起来很便捷。

 

    UART有4个pin(VCC, GND, RX, TX), 用的TTL电平,  低电平为0(0V),高电平为1(3.3V或以上)。

                                                                        

     COM口是我们台式机上面常用的口(下图),9个pin, 用的RS232电平,  它是负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平                                          

如果与电脑连接,因为电脑是串口电平不同的单片机电平,   须要用到MAX232  进行电平转换 

IO口对外,一般有     推拉方式    开漏式

串口,所谓串口就是一个移位寄存器。           数据-------》  缓冲器 ---》移位寄存器      移位寄存器-----》缓冲器

 

 

需要了解UART协议的几个参数,解释如下:

波特率:即每秒可以传输的码元个数

起始位:先发出一个逻辑”0”的信号,表示传输数据的开始。 

数据位:可以选择的值有5,6,7,8这四个值,可以传输这么多个值为0或者1的bit位。这个参数最好为8,因为如果此值为其他的值时当你传输的是ASCII值时一般解析肯定会出问题。理由很简单,一个ASCII字符值为8位,如果一帧的数据位为7,那么还有一位就是不确定的值,这样就会出错。 

校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。就比如传输“A”(01000001)为例。 
1、当为奇数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为1才能满足1的个数为奇数(奇校验)。
2、当为偶数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为0才能满足1的个数为偶数(偶校验)。 
此位还可以去除,即不需要奇偶校验位。 

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率也就越慢。

空闲位:没有数据传输时线路上的电平状态。为逻辑1。 

传输方向:即数据是从高位(MSB)开始传输还是从低位(LSB)开始传输。

这里配置以下:波特率115200,数据位8位,停止位1,无校验位

因为波特率为115200,因此码元宽度为1s/115200=8.68us

 

凌通MUC
UART  工作在主机模式下   void Usart_Init(void)
{SCON	= 0x50;			//Set UART as mode1 and enable reception.TMOD   |= 0x20;			//Initialize Timer1 as mode2.PCON	= T1ovDiv2;TL1		= 0x75;TH1		= 0x75;			//Set Baud rate as 115200 bps	   0x8AES		= 0;			//Disable Uart Interrupt(Optional)TR1		= 1;			//Start Timer1 Counter
}void usart_transmit(unsigned char dat)
{SBUF	= dat;			//Send 0xaa to TX.while(~TI);				//Wait uart finishs transfer dataTI=0;
}void printf_uart(unsigned char *cstring)
{while((*cstring)!='\0'){usart_transmit(*cstring);cstring++;}
}8051f93XX--------------------------------------------------------------------
void UART0_Init (void)
{SCON0 = 0x10;                       // SCON0: 8-bit variable bit rate//        level of STOP bit is ignored//        RX enabled//        ninth bits are zeros//        clear RI0 and TI0 bits
-------------------------#if (SYSCLK/BAUDRATE/2/256 < 1) TH1 = -(SYSCLK/BAUDRATE/2);CKCON &= ~0x0B;                  // T1M = 1; SCA1:0 = xxCKCON |=  0x08;#elif (SYSCLK/BAUDRATE/2/256 < 4) TH1 = -(SYSCLK/BAUDRATE/2/4);CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01CKCON |=  0x01;#elif (SYSCLK/BAUDRATE/2/256 < 12) TH1 = -(SYSCLK/BAUDRATE/2/12);CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00#else TH1 = -(SYSCLK/BAUDRATE/2/48);CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10CKCON |=  0x02;#endif
-------------------------TL1 = TH1;                          // Init Timer1TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit autoreloadTMOD |=  0x20;TR1 = 1;                            // START Timer1TI0 = 1;                            // Indicate TX0 ready
}//中断模式,一般中断模式都是作从机
//-----------------------------------------------------------------------------
// UART0_Interrupt
//-----------------------------------------------------------------------------
//
// This routine is invoked whenever a character is entered or displayed on the
// Hyperterminal.
//
//-----------------------------------------------------------------------------INTERRUPT(UART0_ISR, INTERRUPT_UART0)
{if (RI0 == 1){if( UART_Buffer_Size == 0)  {      // If new word is enteredUART_Input_First = 0;    }RI0 = 0;                           // Clear interrupt flagByte = SBUF0;                      // Read a character from UARTif (UART_Buffer_Size < UART_BUFFERSIZE){UART_Buffer[UART_Input_First] = Byte; // Store in arrayUART_Buffer_Size++;             // Update array's sizeUART_Input_First++;             // Update counter}}if (TI0 == 1)                   // Check if transmit flag is set{TI0 = 0;                           // Clear interrupt flagif (UART_Buffer_Size != 1)         // If buffer not empty{// If a new word is being outputif ( UART_Buffer_Size == UART_Input_First ) {UART_Output_First = 0;  }// Store a character in the variable byteByte = UART_Buffer[UART_Output_First];if ((Byte >= 0x61) && (Byte <= 0x7A)) { // If upper case letterByte -= 32; }SBUF0 = Byte;                   // Transmit to HyperterminalUART_Output_First++;            // Update counterUART_Buffer_Size--;             // Decrease array size}else{UART_Buffer_Size = 0;            // Set the array size to 0TX_Ready = 1;                    // Indicate transmission complete}}
}//-----------------------------------------------------------------------------
// putchar
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : character to send to UART
//
// This function outputs a character to the UART.
//-----------------------------------------------------------------------------
void putchar (char c)
{if (c == '\n'){while (!TI0);TI0 = 0;SBUF0 = 0x0d;}while (!TI0);TI0 = 0;SBUF0 = c;
}//-----------------------------------------------------------------------------
// getchar
//-----------------------------------------------------------------------------
//
// Return Value : character received from UART
// Parameters   : None
//
// This function returns a character from the UART.
//-----------------------------------------------------------------------------
char getchar (void)
{char c;while (!RI0);c = SBUF0;RI0 = 0;return c;
}

 

这篇关于UART(Universal Asynchronous Receiver Transmitter:通用异步收发器)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/387045

相关文章

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

j2EE通用jar包的作用

原文:http://blog.sina.com.cn/s/blog_610901710101kx37.html IKIKAnalyzer3.2.8.jar // 分词器 ant-junit4.jar // ant junit antlr-2.7.6.jar // 没有此包,hibernate不会执行hql语句。并且会报NoClassDefFoundError: antlr

AsyncTask 异步任务解析

1:构建AsyncTask 子类的回调方法: A:doInBackground:   必须重写,所有的耗时操作都在这个里面进行; B: onPreExecute:     用户操作数据前的调用; 例如:显示一个进度条 等 ; C: onPostExecute:    当doInBackground 执行完成后;会自动把数据传给onPostExecute方法;也就是说:这个方法是处理返回的数据的方法

通用内存快照裁剪压缩库Tailor介绍及源码分析(一)

背景 我们知道内存快照是治理 OOM 问题及其他类型的内存问题的重要数据源,内存快照中保存了进程虚拟机的完整的堆内存数据,很多时候也是调查其他类型异常的重要参考。但是dump出来的堆转储文件.hprof往往很大,以 LargeHeap 应用为例,其 OOM 时的内存快照大小通常在512M左右,要有效的存储和获取都是一个问题。 线下拿到hprof文件相对容易,也可以预防OOM,但覆盖的场景十分有

SpringBoot中利用EasyExcel+aop实现一个通用Excel导出功能

一、结果展示 主要功能:可以根据前端传递的参数,导出指定列、指定行 1.1 案例一 前端页面 传递参数 {"excelName": "导出用户信息1725738666946","sheetName": "导出用户信息","fieldList": [{"fieldName": "userId","fieldDesc": "用户id"},{"fieldName": "age","fieldDe

使用Node-API进行异步任务开发

一、Node-API异步任务机制概述         Node-API异步任务开发主要用于执行耗时操作的场景中使用,以避免阻塞主线程,确保应用程序的性能和响应效率。         1、应用场景: 文件操作:读取大型文件或执行复杂的文件操作时,可以使用异步工作项来避免阻塞主线程。网络请求:当需要进行网络请求并等待响应时,可以使用异步工作项来避免阻塞主线程,从而提高应用程序的响应性能。数据库操

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

【JavaScript】异步操作:Promise对象

文章目录 1 概述2 Promise 对象的状态3 Promise 构造函数4 Promise.prototype.then()5 then() 用法辨析6 微任务 1 概述 Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口。它起到代理作用,充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口。 Promise 的设计思想是,

数据结构(邓俊辉)学习笔记】排序 5——选取:通用算法

文章目录 1. 尝试2. quickSelect3.linearSelect:算法4. linearSelect:性能分析5. linearSelect:性能分析B6. linearSelect:性能分析C 1. 尝试 在讨论过众数以及特殊情况下中位数的计算方法以后,接下来针对一般性的选取问题,介绍优化的通用算法。 既然选取问题的查找目标就是在整个数据集中按大小次序秩为 k

线程池创建线程实现异步执行

创建线程池 private final ThreadPoolExecutor executorService = new ThreadPoolExecutor(10, 100, 1L, TimeUnit.MINUTES, new ArrayBlockingQueue<>(100)); Runnable runnable = () -> { //线程体 }; //执行线程 executorSer