AVR单片机教程——串口发送

2019-12-31来源: elecfans关键字:AVR  单片机  串口发送

到目前为止,我们的开发板只能处理很小量的数据:读取几个引脚电平,输出几个LED,顶多用数码管显示一个两位数字。至于输入一个指令、输出一条调试信息,甚至用scanf和printf来输入输出,在已经接触过的这些器件上是难以想象的。而本讲“串口发送”与下一讲“串口接收”,将打开这一扇大门。

硬件

本讲的主题是UART(Universal Asynchronous Receiver-Transmitter,通用异步收发器),俗称串口。实际上串口是串行接口的统称,在单片机领域通常指UART。“串行”的意思是每次传输一个bit,而一个字节的数据被拆成8个bit传输;相比之下并行总线可以一次传输一个或多个字节(这并不意味着并行总线一定优于串行总线)。


AVR单片机提供的硬件组件不是UART,而是USART(S代表Synchronous,同步的),相比UART额外支持同步通信。所谓“同步”是指收发双方通过时钟同步,“异步”是指没有时钟来同步,但实际上双方还是由一些特殊信号同步的。


数据在UART总线上以“帧(frame)”为单位发送,如下图所示,带有方括号的位是可选的。

一帧包含一个起始位、5~9个数据位(常用8位;很多设备不支持9位)、可选的一个校验位(偶校验或奇校验,即所有数据位与0或1的异或结果)与1或2个终止位。起始位与终止位统称为同步位,用于在异步总线上起到同步的作用,这样接收方才能知道一帧何时开始。


波特率的定义是信息在通信信道上传输的速率。假如信号线上的波形允许1秒有9600个方框(方框表示高电平或低电平,实际电平是其中一个),那么波特率就是9600。常用的波特率有9600与115200(打开Serial Port Utility或类似软件,可选的波特率都是常用的)。


在开始通信之前,收发双方必须约定好波特率与帧格式。uart_init函数的配置是波特率38400,8数据位,偶校验,1停止位。相应地在电脑的串口调试软件中也要这样配置。


开发板的TX引脚发送数据,RX引脚接收数据。为了使开发板与电脑能通过UART通信,电脑上需要插一个USB转串口的工具。用杜邦线把开发板与工具的TX与RX引脚交叉连接。本讲只涉及串口发送,所以只连接开发板的TX与串口工具的RX就可以了。在串口调试软件中打开端口,就可以通信了。

软件

由于printf是变参函数,不是很安全(如果格式串和参数对应错,程序可能直接跑飞),我倾向于使用类型安全的函数,即函数通过C的句法知道实参类型(写错就编译错误,而不是通过编译器无法检测的格式串)。不过,avr-gcc的中还是提供了printf等函数,你可以了解一下。


库中提供的发送函数都是同步阻塞的,即等待硬件组件把数据全部发送完,函数才返回。这里的“同步”与刚才的“异步总线”所指是不同的。关于“同步”与“异步”、“阻塞”与“非阻塞”的概念,可以参考:怎样理解阻塞非阻塞与同步异步的区别?

不难计算,总线发送一个字节的时间是几千个CPU周期,CPU会浪费大量时间在无用的等待上。这个问题直到我们讲到中断才会解决(也许我会把它封装起来放进库)。

实例

我们来写一个用串口发送按键与拨动开关信息的程序。如果你会相关的C#编程,就可以让电脑响应按键事件。


#include

#include

#include

#include


int main(void)

{

    button_init(PIN_6, PIN_7);

    switch_init(PIN_4, PIN_5);

    uart_init(UART_TX);

    uart_print_string("startn");

    while (1)

    {

        for (uint8_t i = 0; i != BUTTON_COUNT; ++i)

            if (button_pressed(i))

            {

                uart_print_string("button ");

                uart_print_int(i);

                uart_print_string("n");

            }

        for (uint8_t i = 0; i != SWITCH_COUNT; ++i)

            if (switch_changed(i))

            {

                uart_print_string("switch ");

                uart_print_int(i);

                uart_print_string(switch_status(i) ? " onn" : " offn");

            }

        delay(1);

    }

}


程序首先将UART初始化为发送模式(UART_TX),然后打印"start"。在间隔一毫秒的循环中(实际上串口发送的时间远长于一毫秒,因为是阻塞的),程序检测每一个按键与开关的动作,如果有则发送相应数据。


用printf一行就能解决的操作这里需要三行才能完成,这就是权衡吧。

关键字:AVR  单片机  串口发送 编辑:什么鱼 引用地址:http://news.nvwayi.com/mcu/ic484240.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR单片机教程——EasyElectronics Library v1.0手册
下一篇:AVR单片机教程——旋转编码器

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR第11课:如何对待我们的单片机
大家学习MCS51单片机和AVR单片机,又或者是PIC单片机,又或者是MSP430单片机之后,是否感觉自己可以成为一名工程师了呢?我在这里来说说我的看法吧。我们学习这些单片机的时候,先学习了理论知识,这个一般是书本上的理论知识,比如介绍单片机的发展、单片机的应用领域、单片机的原理等等。然后呢找一块开发板,对着视频教程学习,边看视屏边做实验,学习完之后呢,去做那么一两个小项目,比如“基于LabView和PWM的霍尔测速和控速的直流电机系统”,这个项目呢,相对来说综合要求能力比较高,如果一个人能够坐下来的话,你的能力就算不错了,相当不错了。从设计电路图、焊接电路板、写程序、调试等等下来,会有很大的提高。如果仅仅做了实验,我可以告诉
发表于 2020-07-25
解决“检测到 #include 错误
配置好VSCode的Arduino环境后可能会在编写代码时出现以下错误检测到 #include 错误。请更新 includePath。已为此翻译单元(E:abc.ino)禁用波形曲线。C/C++(1696)无法打开 源 文件 "avr/pgmspace.h" (dependency of "C:Program Files (x86)ArduinohardwarearduinoavrcoresarduinoArduino.h")C/C++(1696)这个问题是由于VSCode找不到对应的文件导致的,解决方法是,进入项目文件夹中的.vscode文件夹(用VSCode打开项目文件夹会自动新建
发表于 2020-07-25
解决“检测到 #include 错误
AVR446_Linear speed control of stepper motor步进电机曲线分析
           1.1.  单片机代码处理// 定义定时器预分频,定时器实际时钟频率为:72MHz/(STEPMOTOR_TIMx_PRESCALER+1)#define STEPMOTOR_TIM_PRESCALER          3  // 步进电机驱动器细分设置为:   32  细// 定义定时器周期,输出比较模式周期设置为0xFFFF#define STEPMOTOR_
发表于 2020-07-25
<font color='red'>AVR</font>446_Linear speed control of stepper motor步进电机曲线分析
LCD1602液晶显示模块深入详解之软件篇(AVR)
On/Off Control):其实就是c.1(打开显示)(4)进入模式设置(Entry Mode set):其实就是d(5)前面就是初始化,后面就是写显示数据了///////////////////////////////////////////////////////////////////////////////////////////////////////////////////下面是Atmega AVR驱动LCD1602液晶显示模块代码,第一行显示“LCD1602 DEMO”,第二行显示“--CNBLOGS--”,这里没有读状态指令的使用,实际使用时,在写指令或数据时加一些延时即可注意:分了三个文件,main.c是入口
发表于 2020-07-25
LCD1602液晶显示模块深入详解之软件篇(<font color='red'>AVR</font>)
旧文备份:AVR读写EEPROM分析
由于AVR的EEPROM写周期比较长(一般为毫秒级),因此在编程使用过程中要特别注意.对于读EEPROM没什么好说的,读一个字节的数据要耗费4个时钟周期,可以忍受,写就比较麻烦了,虽然放在EEPROM的数据都不是频繁访问的;虽然可以用读-比较-写的机制降低EEPROM的写操作频度,但在写入过程中,过长的写入周期还是会造成一些问题,下面就分析一下几种方式的EEPROM写操作.循环查询式将地址和数据写入EEPROM相关的寄存器,置写标志后就循环不断查询写完成标志,直到写完成,退出循环,顺序执行其他程序.在置写入标志到写完成的这段时间,程序除了不断查询写完成标志和响应硬件中断之外什么也不干,这段时间就这么浪费了,如果是个实时性要求比较
发表于 2020-07-25
通过底层AVR方法实现SPI数据传输
主机端: 1 /********************************* 2 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 3 创作时间:2016*10*17 4 使用资源: 5     更低阶的 aTmega(AVR) 库 6     SPI三个寄存器SPCR(控制寄存器),SPCR(状态寄存器),SPDR(数据的暂存器) 7         SPCR(SPI Control Register暂存寄存器) 8 
发表于 2020-07-25
小广播
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 nvwayi.com, Inc. All rights reserved
送彩金的真人娱乐 网上送彩金的网站 送彩金500的网站大白菜不看id 鼎盛赛车机器人 送彩金的彩票网 首存送彩金低打码 彩票大赢家 有什么下载送彩金的网站啊 彩票大赢家 那个时时彩平台送彩金