历史上的今天
返回首页

历史上的今天

今天是:2024年12月31日(星期二)

正在发生

2019年12月31日 | AVR单片机教程——串口发送

2019-12-31 来源:elecfans

到目前为止,我们的开发板只能处理很小量的数据:读取几个引脚电平,输出几个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一行就能解决的操作这里需要三行才能完成,这就是权衡吧。

推荐阅读

史海拾趣

博众电气(BOZHONG ELECTRIC)公司的发展小趣事

随着企业实力的不断增强和产品质量的不断提升,博众电气开始积极寻求市场扩张的机会。公司凭借优质的产品和服务,成功开拓了多个国内外市场,并与众多知名企业建立了长期稳定的合作关系。

同时,博众电气还注重品牌建设和推广。公司积极参与各类行业展会和论坛,展示公司的最新产品和技术成果;还通过广告宣传、社交媒体等多种渠道提升品牌知名度和影响力。这些举措使得博众电气的品牌形象和市场地位得到了进一步提升。

以上只是博众电气在电子行业发展的几个可能的关键阶段和事实的概括性描述。实际上,博众电气的发展历程可能远比这复杂和丰富。作为一家在电子行业中崭露头角的企业,博众电气未来的发展值得期待。

Eurosil Electronics Ltd公司的发展小趣事

随着全球对环保问题的日益关注,Eurosil也积极响应这一趋势。公司注重环保和可持续发展,在生产过程中采取了一系列环保措施,如减少废弃物排放、提高能源利用效率等。同时,Eurosil还积极研发环保型电子产品,为客户提供更加绿色、健康的产品选择。

Benchmarq Microelectronics Inc公司的发展小趣事

Benchmarq Microelectronics Inc的创立源于几位工程师对半导体技术的深刻理解和市场需求的敏锐洞察。他们看到在快速发展的电子行业中,高性能、低功耗的半导体产品具有巨大的市场潜力。于是,他们决定共同创立Benchmarq Microelectronics Inc,致力于研发和生产先进的半导体产品。在创立初期,公司面临着资金短缺、技术挑战和市场竞争等多重困难。然而,通过团队的努力和合作,公司逐渐攻克了技术难关,推出了一系列受到市场欢迎的半导体产品,初步实现了盈利。

Carroll & Meynell Transformers Ltd公司的发展小趣事

随着国内市场的饱和,Carroll & Meynell Transformers Ltd公司开始将目光投向国际市场。公司积极参与国际电子行业的交流与合作,学习借鉴国际先进经验和技术。同时,公司还加大了对海外市场的拓展力度,通过参加国际展览、建立海外销售网络等方式,将产品推向全球。这一国际化战略不仅为公司带来了更广阔的市场空间,也提升了公司的国际影响力。

Hi-G Relays公司的发展小趣事

在电子行业的初期,Carroll & Meynell Transformers Ltd公司以其卓越的技术创新能力脱颖而出。公司研发团队不断突破传统变压器的设计局限,推出了一系列高效、稳定的变压器产品。这些产品不仅满足了当时市场对电力传输和分配的基本需求,还以其卓越的性能赢得了客户的广泛认可。随着市场需求的不断增长,公司逐渐扩大了生产规模,成为了电子行业中的佼佼者。

Formosa MS公司的发展小趣事

在环保意识日益增强的今天,Carroll & Meynell Transformers Ltd公司积极响应国家绿色发展的号召,致力于研发和生产绿色环保的变压器产品。公司采用环保材料和节能技术,减少生产过程中的能源消耗和环境污染。同时,公司还加强了对废旧产品的回收和处理工作,实现了资源的循环利用。这种绿色环保的发展理念不仅为公司赢得了良好的社会声誉,也为公司的可持续发展奠定了坚实基础。

问答坊 | AI 解惑

DIY1616点阵显示屏

原理图和源程序都在这里 http://hi.baidu.com/springvirus/blog/item/b878f761fbb6f54cebf8f888.html 欢迎交流切磋啊…

查看全部问答>

电子密码锁设计

1.实验任务   根据设定好的密码,采用二个按键实现密码的输入功能,当密码输入正确之后,锁就打开,如果输入的三次的密码不正确,就锁定按键3秒钟,同时发现报警声,直到没有按键按下3种后,才打开按键锁定功能;否则在3秒钟内仍有按键按下,就 ...…

查看全部问答>

vc2005调试应用程序时弹出"unable to start debugging"怎么办?

active sync没问题,deploy也成功了,就是一按F5就弹出“unable to start debugging”,郁闷,请问各位有什么好办法吗?谢谢。 …

查看全部问答>

中立认识对嵌入式linux的评价!各位欲使用嵌入linux的注意了!

这是我转摘得文章。各位欲使用嵌入linux的注意了!这里的linux是指嵌入式的不要混淆了! 2008-05-09 上周,Green Hills Software(GHS)就嵌入式Linux撰写了一则措辞严厉的观点,下面就是它的开场白:“Embedded Linux是迄今为止最夸大其词的嵌入式 ...…

查看全部问答>

wince作图,请教高手

ExtSelectClipRgn,ExtSelectClipRgn, CreatePolygonRgn,EnumChildWindows, CopyImage,SetMapMode这些函数是在VC里的 但我现在WINCE中用不了啊,不知道能用什么函数替换它们,或者要加什么头文件?…

查看全部问答>

刚学vxworks 请教一个很菜的问题

刚接触vxworks 想请问一下在哪里可以找到结构体的定义?比如: struct sockaddr_in  serverAddr; 我想知道sockaddr_in的具体定义,在哪里能查到,越具体越好,谢谢!!…

查看全部问答>

请问7805输出端电压和输入端电压有限制么???

我在网上看到有人说输出端应该小于输入端,是这样么???…

查看全部问答>

谁有ZLG的EASYARM8962的开发板

想学习TI 的LM系列CORTEX-M3,但是不想买新的开发板,用完后又没什么用,求个二手的 价格实惠点,有想出让的朋友联系我 E-MAIL:JINWEN.LU@DELTAWW.COM.CN,谢谢! 不知道大家的开发板都是在哪里买的,请多多指教!…

查看全部问答>

*.jic下载失败

Cyclone 3的芯片,在下载*.sof下载成功,但是*.jic总是下载失败,显示错误是Flash Loader IP not loaded on device 1大家有没有碰到过呢?…

查看全部问答>

我为EE提建议--关于登录主页的图片快捷导航

关于登录主页的图片快捷导航 主页面图片的快捷导航,有利于短时间吸引读者的兴趣,及时让优秀的帖子得到更多的访问,及时解决问题。 所以希望版主能够增加导航页面的数目,目前页面是三个,希望增加到6个左右,可能会有打开网页比较慢的问题,希 ...…

查看全部问答>