编程点滴:AVR的UART数据收发测试程序

发布者:心想的45号最新更新时间:2016-10-21 来源: eefocus关键字:AVR  UART  数据收发 手机看文章 扫描二维码
随时随地手机看文章
本程序实现UART中断方式发送和接收数据功能,将接收到的数据立即发出,形成回环。

由测试程序,相关头文件,UART数据处理程序组成。



/* ************************************************
* File name: main.c
* Function: AVR的UART数据收发测试程序
* Description: 实现将RXD端口收到的数据转发至TXD端口
* 收发工作由UART中断自动完成
* Author & Date: Joshua Chan, 2012/03/28
* ************************************************/
#include
#include
#include
#include
#include
#include "uart_test.h"

/* 测试程序: 将串口接收的数据原样送出 */
void main(void)
{
unsigned char data;

fifo_pos_init(); /* 重置位置记录 */
uart_init(B9600); /* 初始化UART */
_SEI();
while (1) {
if ((data = rx_byte()) != NONE_DATA)
tx_byte(data);
_WDR(); /* 喂狗 */
}
}




/* ************************************************
* File name: uart_test.h
* Function: AVR的UART数据收发测试程序
* Description: 实现将RXD端口收到的数据转发至TXD端口
* 收发工作由UART中断自动完成
* Author & Date: Joshua Chan, 2012/03/28
* ************************************************/
#ifndef _UART_TEST_H
#define _UART_TEST_H

/* 定义FOSC=16.0MHz时的UBRR值 */
__flash enum baudrate {
B2400 = 416,
B4800 = 207,
B9600 = 103,
B14400 = 68,
B19200 = 51,
B28800 = 34,
B38400 = 25,
B57600 = 16,
B76800 = 12,
B115200 = 8,
B230400 = 3,
};

#define NONE_DATA '\4' /* 无新数据标志 */
#define RX_BUF_SIZE 32 /* 接收缓冲区大小 */
#define TX_BUF_SIZE 32 /* 发送缓冲区大小 */

/* 重置位置记录 */
extern void fifo_pos_init(void);

/* UART初始化 */
extern void uart_init(unsigned int baud);

/* 从接收缓冲区中读1字节 */
extern unsigned char rx_byte(void);

/* 将1字节数据送入发送缓冲区, 同时使能数据寄存器空中断 */
extern void tx_byte(unsigned char data);

#endif



/* ************************************************
 * File name: uart_test.c
 * Function:  AVR的UART数据收发测试程序
 * Description: 实现将RXD端口收到的数据转发至TXD端口
 *              收发工作由UART中断自动完成
 * Author & Date: Joshua Chan, 2012/03/28
 * ************************************************/
#include 
#include 
#include 
#include 
#include 
#include "uart_test.h"

unsigned char rx_fifo[RX_BUF_SIZE]; /* 接收缓冲区 */
unsigned char tx_fifo[TX_BUF_SIZE]; /* 发送缓冲区 */
unsigned char rx_pos;      /* 缓冲区中最后接收数据的位置 */
unsigned char read_pos;    /* 缓冲区中最后读出数据的位置 */
unsigned char tx_pos;      /* 缓冲区中最后发送数据的位置 */
unsigned char write_pos;   /* 缓冲区中最后写入数据的位置 */

/* UART初始化 */
void uart_init(unsigned int baud)
{
    /* 先禁用USART功能 */
    UCSR0B = 0x00;
    /* 设置baudrate */
    UBRR0H = (unsigned char)(baud>>8);
    UBRR0L = (unsigned char)baud;
    /* 设置帧格式: 8个数据位, 1个停止位 */
    UCSR0C = 3 << UCSZ00;
    /* 使能: 接收结束中断, 接收, 发送 */
    UCSR0B = (1<
 
关键字:AVR  UART  数据收发 引用地址:编程点滴:AVR的UART数据收发测试程序

上一篇:编程点滴:16位AVR定时器比较匹配中断测试程序
下一篇:编程点滴:8位AVR定时器比较匹配中断测试程序

推荐阅读最新更新时间:2024-03-16 15:16

C8051F310设计的UART扩展实现
   UART数据发送协议作为一种简单的数据发送协议,被大量的使用在当前各种数字外设的数据传输上。但是现在的PC机存在无UART接口或接口较少的问题,当需要利用PC机对于多个数字设备同时处理问题时,就需要在PC机上进行UART扩展,这类问题在笔记本PC上尤为突出。 通常这种问题的解决方法有以下几种方法: (1)利用USB接口通过相应的转换设备进行转换。 (2)利用PCI总线转换卡获得多个UART接口的扩展。前者优点在于实现简单设备,成本低。后者优点在于可以实现多个接口扩展且功能完善。但在实际使用中发现两者都存在一个共同的问题,即利用扩展获得UART接口其工作性能不够稳定,且存在不能完全实现多个UART接口的实时通讯。   为解
[单片机]
C8051F310设计的<font color='red'>UART</font>扩展实现
AVR串口通信
用M8做了一个485通信,调试时发现,PC端接收数据不正常,而另一个同样的板子接收的数据时正常。 测量了PC端串口接收数据的管脚波形,正常,但是接收数据不对,奇怪! 此时发送板的M8工作电压为3.3V,使用内部晶振。 将发送版的M8的工作电压改为5V后,PC端接收数据正常了。 接收数据的正确与否和M8的工作电压有关系,而工作电压的大小会影响什么呢? 有两个地方: 1、IO口的电平 难道IO口的电平会影响数据的正确与否,这个问题可以排除,原因如下: 1)、MAX485是5V供电的,但是它可以和3.3V电平匹配。 2)、接收端的波形是对的,说明数据发出去是对的。 2、影响内部晶振 内部晶振受工作电压影响很大,进而影响
[单片机]
IAR 下 AVR 的外部中断操作
芯片 : ATMega16 晶振 : 7.3728 MHz 外部中断0 ,下降沿触发。 关于硬件:要想稳定的使用外部中断,最好要在管脚处上拉一个电阻(一般上拉10K,当然上拉还是下拉也要看你的触发条件),如果是按键的话应该再并一个电容(一般为104),这样效果会比较好,有效的防止抖动。 代码: #include iom16.h #include intrinsics.h #include comp_a90.h void int0_init() { _CLI(); //disable all interrupts //关总中断 MCUCR = 0x02; //下降沿触发 外部中断0 GICR
[单片机]
S3C2440裸机程序【2】串口uart程序
学习ARM7芯片stm32时,裸机程序开发可以很方便的根据库函数在工程模板上进行开发,而ARM9主要是移植Linux开发,很少有裸机程序开发,因此在玩S3C2440希望最终形成一个keil环境下的模板。用的淘宝上的JZ2440v2板子,因为是裸机程序开发其他板子都一样。 S3C2440.s是keil自动生成的启动文件,其他都是按stm32库函数模板写的,技术很差,自学娱乐,若有需求可自行改动。 main.c文件: #include S3C2440Reg.h #include S3C2440Init.h #include led.h #include uart.h void delay(int t) {
[单片机]
S3C2440裸机程序【2】串口<font color='red'>uart</font>程序
STM32CubeMX:UART操作
UART共有三种操作方式,轮询方式、中断方式以及DMA方式。 芯片:STM32F103C8T6 应用管脚: 输出:PA0、PA1 USART1 配置界面 添加中断配置 添加DMA配置 代码应用 1.实现printf函数 /* USER CODE BEGIN 0 */ #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTO
[单片机]
STM32CubeMX:<font color='red'>UART</font>操作
HT46RU232 UART串口通信的使用
HT46RU232拥有1个全双工的异步串行通信口。下面就简单介绍一下232串口的使用。 其操作时序如下: (1).设置串口工作波特率、时钟、以及数据位数,起始位、停止位、错误检测等。 (2).准备等待发送/接收响应。 (3).当检测到发送/接收标志的时候,进行发送/接收数据。 程序范例:(中断法接收数据) #pragma vector Uart_ISR @0x10 //串口中断入口申明 void Uart_init() { _ucr1=0x80; //设置BNO,PRT,PREN,STOP位 _ucr2=0xe4; //使能TXEN、RXEN _brg
[单片机]
AVR Studio 快速入门教程实例
AVR Studio 软件下载及安装方法请参考:AVR开发软件的选择与安装。 软件安装好后,你就能在电脑上看到如下的功能菜单: 功能一:编写、编译汇编工程项目。 (不推荐使用) 操作方法:在菜单 Project -- New Project 打开如下界面。输入项目名按Fishish后出现汇编代码的编辑窗口。 注意:由于本功能仅适合于汇编语言。我们不推荐使用汇编开发AVR,故不推荐大家使用这个功能。我们这里也不加描述。详细原因请参考我们网站的文章:为何开发AVR使用C而不是使用汇编? 功能二: 使用STK500、 JTAG 或JTAG mkII 下载 Connect 与 Auto Connect 的区别,是每次都会提示
[单片机]
<font color='red'>AVR</font> Studio 快速入门教程实例
通过用UART与若干器件进行通讯的电路设计
  在各种外围的设备中,使用了通用的异步接收和发送(UART)接口。例如,一个基于微控制的系统有四个这样的外围设备。理想状态是,在低成本嵌入式应用中,您希望将若干个外围设备与单个的UART进行连接,然而由于UARTs中没有芯片选择信号,这样的工作变得复杂起来 。   这是一种常见的设计问题,目前有一些传统的方法来解决。最常见的方法是使用一种具有您需要的硬件UART模块的单片机。您很难找到一个紧凑形式的经济型MCU有四个硬件UART模块,因此,即使所有的UARTs不能同时使用,您也可以使用一个高引脚计数的更高性能的单片机。但是在实际应用中使用一个大单片机可能没有必要,而且可能也不能更有效地解决成本问题。   如果在应用中所有的U
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved