tag 标签: 串口

相关帖子
相关博文
  • 热度 3
    2022-5-19 20:31
    518 次阅读|
    0 个评论
    因为种种原因开始接触Arduino和LabVIEW,科班出身有些基础,一开始感觉LabVIEW相较于文本编程来说也太麻烦了,但是直到这几天接触了《Arduino与LabVIEW开发实战》这本书,感觉LabVIEW还是不错的,从2022.5.19开始记录学习 《Arduino与LabVIEW开发实战》的过程,会把学习的过程记录下来,分享学习中的一些心得和写的程序。如果有啥问题,欢迎联系交流。 一、 准备工作 器材:开发板一块(型号以 Arduino Uno 为例)、 LabVIEW2017 安装包、破解工具 NI License Activator 。 获取方法: Arduino 开发板可以自己打板焊元件也可以直接淘宝购买(国产的几十块钱,意大利原装的需要一两百); LabVIEW2017 安装包在( Index of /evaluation/labview/ekit/other/downloader (ni.com) )网址获得(可以通过浏览器搜索功能,快捷键 ctrl+F ,搜索 2017LV-WinChn.exe ,点击即可下载);破解工具 NI License Activator 可通过百度网盘获取(链接: https://pan.baidu.com/s/1dwsyMuX8IQRYNWeB_cZoGQ 提取码: hx2v ,如果链接失效,可以网上搜索)。 软件安装(以 LabVIEW2018 为例,其他版本类似): ( 1 )双击 ,进入解压软件界面,如图 1-1 。 图 1-1 【解压 LabVIEW2018 】 ( 2 )解压完成(如图 1-2 )后,自动启动 setup.exe ,如果未启动,请到第一步的解压路径中手动双击 setup.exe 。前面的安装过程直接选择下一步即可. 图 1-2 【解压完成】 ( 3 )这步不需要填入序列号,直接下一步,如图 1-3 。 图 1-3 【无须填入序列号】 ( 4 )选择合适路径安装,安装内容默认即可,如图 1-4 。 图 1-4 【安装路径和安装内容】 ( 5 )取消产品通知,接受许可,然后等待安装完成,如图 1-5 。 图 1-5 【无须通知,接受许可】 ( 6 )等待安装过程中,会询问如图 1-6 所示的问题,选择不需要支持即可,最后可以看到安装完成的通知。 图 1-6 【安装问题和安装完成】 ( 7 )安装完成后,先不着急运行软件,双击 ,将所有的模块都右击 -Activate , Activate 成功的软件或者工具包前面的方框将显示绿色,否则显示白色,如图 1-7 。 图 1-7 【激活软件】 至此, LabVIEW2018 中文版就安装完成,可以正常使用。 二、 连接 LabVIEW 和 Arduino 本节将详细地介绍 Arduino 与 LabVIEW 的连接方式,主要包括 LabVIEW Interface for Arduino 方式、串口控制方式、无线串口方式和 Ethernet 方式,并给出详细的实验示例,包含实现原理和具体代码其实,从本质上来说,前三种方式都是通过 串口 实现 Arduino 与 LabVIEW 的连接的,而且需要使用 VISA 插件实现 LabVIEW 串口编程,但是三者各有特点: ( 1 ) LabVIEW Interface for Arduino 方式,只需要将给定的 Arduino 程序烧写进 Arduino 控制器,然后完成 LabVIEW 部分的编程即可,由于不涉及 Arduino 程序设计,只使用官方给出的 Arduino 函数库, Arduino 的传感器选用上有很大的局限性,可扩展性较差。 ( 2 )串口控制方式,需要完成 Arduino 与 LabVIEW 两部分的编程,使用 USB to Serial 电缆连接, Arduino 部分有着很好的可扩展性,两者需要制定合适的通信协议。 ( 3 )无线串口方式,使用串口无线数传模块替代串口连接电缆线,实现了 Arduino 与 LabVIEW 的无线连接,扩展了 Arduino 与 LabVIEW 的应用范围,而且可以通过选择不同类型和不同功率的无线传输模块,以实现近距离、中距离和远距离的无线数据传输。 与前三种方式使用串口来实现 Arduino 与 LabVIEW 的连接不同, Ethernet 方式采用网络编程来实现二者的连接。 Arduino 端需要采用 网络扩展板 ,并连接至路由器上,而不是仅仅通过串口; LabVIEW 端需要使用 TCP 协议函数库 来完成程序设计,而不是使用 VISA 插件来实现串口编程的。与其他三种连接方式相比, Ethernet 方式将 Arduino 与 LabVIEW 都接入了网络中,极大地扩展了应用范围;由于互联网无处不在,若将二者都接入互联网中,则可以通过互联网来构建基于 Arduino 与 LabVIEW 的远程测控系统。 三、LabVIEW Interface for Arduino 方式 LabVIEW Interface for Arduino Toolkit ( LIAT )是 NI 公司(美国国家仪器公司)为 Arduino 开发的接口工具包,借助于这个工具包,可以很方便地使用 LabVIEW 软件与 Arduino 控制器实现联合开发。 目前, LIAT 支持 LabVIEW2010 及更高版本,提供的函数库中传感器有热敏电阻、光敏电阻、 8 段数码管、 RGB 灯、舵机等。在 LabVIEW 中使用打开、读写、关闭等库函数,就可以实现对 Arduino 控制器的数字、模拟、 PWM 、 I2C 、 SPI 信号的读取与控制。但是, LIAT 仅支持 Arduino Uno 、 Arduino2009 和 Mega2560 控制板,而且库函数的数量有限,传感器类型较为单一,存在一定的局限性,极大地限制了对 Arduino 的开发使用。当使用的传感器不是官方函数库中已有函数的传感器时,就无法使用 LabVIEW 对 Arduino 进行交互控制。 由于 LabVIEW Interface for Arduino 只需要对 LabVIEW 编程,而不需要对 Arduino 编程,甚至不需要底层硬件知识,适合了解 LabVIEW 编程而不懂 Arduino 编程的玩家或入门爱好者,由于其简单、易操作,所以也不失为新手入门的一个路径。 下面介绍该方法的操作方式 ( 1 ) LIAT 的下载与安装。想要利用 LIAT 函数库来实现 LabVIEW 软件与 Arduino 控制器的交互需要安装三个软件: 1 ) 2010 及以上版本的 LabVIEW 软件; 2 )与 LabVIEW 软件配套的 VI Packge Manager ; 3 ) LabVIEW Interface for Arduino Toolkit 。 LabVIEW2017 版本及之后的版本都已经将 VI Packge Manager 集成进去,不需要额外安装,所以只需要打开 VI Packge Manager 搜索 Arduino找到LabVIEW Interface for Arduino 即可完成安装。 ( 2 ) LIAT 函数库及使用。当 LabVIEW 安装 LabVIEW Interface for Arduino 工具包之后,在前面板和程序框图中的函数栏目中就会出现 Arduino 控件和操作函数库。 Arduino 控件包含模拟 I/O 、数字 I/O 、 Pin Mode 、 Board Type 和连接方式等,如图 3-6 所示;操作函数库包含有 Arduino INIT 、 Arduino CLOSE 、 Low Level 、 Sensors 、 Examples 等,如图 3-7 所示。其中, Arduino INIT 和 Arduino CLOSE 是每个程序必备的,即与 Arduino 控制器建立连接,完成对 Arduino 预先设定的操作之后,断开与 Arduino 控制器的连接,释放 Arduino 控制器的串口资源。 12.2.2 串口控制方式 本节将采用有线串口连接的方式实现 Arduino 与 LabVIEW 的连接,并介绍 LabVIEW VISA 串口编程。 VISA 的下载地址是( 下载 NI-VISA - NI ),下载版本选择最低的 5.4 即可 。 VISA 是虚拟仪器软件体系结构( Virtual Instruments Software Architecture )的缩写,实质上是一个 I/O 口软件库及其规范的总称。 VISA 是应用于仪器编程的标准 I/O 应用程序接口,是工业界通用的仪器驱动器标准 API (应用程序接口),采用面向对象编程,具有很好的兼容性、扩展性和独立性。用户可用一个 API 控制包括 VXI 、 GPIB 及串口仪器在内的不同种类的仪器。它还支持多平台工作、多接口控制,是一个多类型的函数库。 在 LabVIEW 中利用 VISA 节点进行串行通信编程。为了方便用户使用, LabVIEW 将这些 VISA 节点单独组成一个子模块,共包含 8 个节点,分别实现初始化串口、串口写、串口读、中断以及关闭串口等功能。安装 VISA 之后,在程序框图界面上右击鼠标,依次选择“函数”→“仪器 I/O ”→“串口”,即会出现如图 3-80 所示的串口函数。 在 LabVIEW 中,普通串口通信的基本步骤分为 3 步: ( 1 )串口初始化,利用 VISA Configure SerialPort 节点设定串口的端口号、波特率、停止位、校验位、数据位。 ( 2 )读写串口,利用 VISA Read 节点和 VISA Write 节点对串口进行读写。 ( 3 )关闭串口,停止所有读写操作,释放串口资源。 按照串口编程的 3 个基本步骤,图 3-85 给出了典型的串口读写程序框图。首先,对所选择的串口进行配置(初始化),然后将需要发送的数据写入串口,等待合适的时间,接着判断出串口中数据的字节数并从串口中读取数据,最后关闭串口,释放串口资源。 实验: Arduino 与 LabVIEW 串口通信的实现 实验分为两个部分: 1 ) LabVIEW 控制 Arduino 板载 LED : LabVIEW 发送开关命令, Arduino 接收开关命令,并控制板载 LED 灯的亮灭; 2 )虚拟电压表: Arduino 测量电压并通过串口发送, LabVIEW 接收电压值并显示在前面板的仪表板上。 今天先完成实验的第一部分: LabVIEW 控制 Arduino 板载 LED ( 1 )实验目的 通过 LabVIEW 前面板上的开关按钮实现对 Arduino Uno 控制板上 13 号管脚上 LED 灯开关控制,实现 LabVIEW 与 Arduino 单向数据传输(由 LabVIEW 向 Arduino 控制板发送数据)。 ( 2 )硬件连接 本实验只需要使用 USB 电缆将 Arduino Uno 控制板连接至电脑 USB 端口即可。 ( 3 ) Arduino 程序设计 Arduino Uno 控制器通过串口获取 LabVIEW 上位机发来的命令码,判断接收到的命令是为“打开”命令还是“关闭”命令,并执行“打开”或“关闭”命令。程序代码如下: byte comdata; // 定义变量,用于存放串口读取的数据 int LED = 13; // 定义数字口13为LED的控制引脚 void setup() { // put your setup code here, to run once: Serial.begin(9600); // 初始化串口波特率为9600 pinMode(LED, OUTPUT); // 将LED控制引脚设置为输出 } void loop() { // put your main code here, to run repeatedly: 0) // 不断检测串口缓冲区是否有数据 { comdata =Serial.read(); // 从串口缓冲区读取一个字节的数据 if(comdata == 0x01) // 判断是否为关灯命令 { digitalWrite(LED, LOW); // 关闭LED灯 } if(comdata ==0x02 ) // 判断是否为开灯命令 { digitalWrite(LED,HIGH); // 打开LED灯 } } } 由以上程序,可以知道 Arduino 程序的基本框架由 setup() 和 loop() 两部分组成。在 Arduino 控制器中程序运行时将首先执行 setup() 函数,然后执行 loop() 函数,并且不断循环执行 loop() 函数。每次 Arduino 上电或重启后,都会首先执行 setup() 函数,而且 setup() 函数只运行一次。 setup() 函数用于设置引脚的输入 / 输出类型、配置串口、引入类库文件、外围器件使用前的初始化等。 loop() 函数在程序运行过程中不断地循环,根据所编写的程序,完成指定的输入 / 输出功能。 ( 4 ) LabVIEW 程序设计 LabVIEW 通过事件结构来响应“打开”和“关闭”的指令,分别发送不同的指令,并通过串口电缆发送至 Arduino Uno 控制板, Arduino Uno 控制板通过读取串口缓冲区中的数据,然后分析数据并执行“打开”或“关闭”的动作。 LabVIEW 软件的前面板如图 3-86 所示。 LabVIEW 程序框图如图 3-87 和图 3-88 所示。 分析一下这个 LabVIEW 的程序框图程序,该程序由函数选板 “编程” “结构”中的 分割成三个部分,这三个部分也就对应上面介绍的串口通信的三个步骤:( 1 ) VISA 配置串口 ,完成串口初始化, LED 灯初始化为关闭状态;( 2 ) While 循环结构中放置了一个事件结构,该事件结构中有两个分支,一个是打开按钮值改变时控制 LED 灯亮起,一个是关闭按钮值改变时控制 LED 灯关闭。这个控制由 VISA 写入 将“ 2 ”和“ 1 ”分别发送给 Arduino ;( 3 )最后一部分就是用 VISA 关闭 将串口连接关闭。简易错误处理器 显示错误信息。“ 2 ”和“ 1 ”的转换操作可以通过 LabVIEW 提供的即时帮助和 LabVIEW 帮助手册观察一下 VISA 写入 所需要的输入,就可以理解“ 2 ”和“ 1 ”的转换操作是怎么一回事了。 找了很久也没找到 《Arduino与LabVIEW开发实战》中这里的配套程序,想想还是自己敲了。之前学了不少编程语言,编程语言基本要素差不多一样,不想再学一遍LabVIEW的了,就连蒙带猜地观察 图 3-87 和图 3-88,把程序给捣鼓了出来,明天和实验的第二部分一起上传到百度网盘吧,和小伙伴们分享一下。敲完这个程序终于让我有种恍然大悟的感觉,LabVIEW是可以用的。但是对比起文本编程还是感觉勉勉强强,各有各的好吧,针对人群不一样,而且LabVIEW这是把上位机编程也完成了,而且是可视化的那种,和普通的串口调试助手还不一样。
  • 热度 3
    2021-4-17 18:09
    1284 次阅读|
    1 个评论
    用两张图,详解FreeModbus在单片机串口上的数据收发过程-FreeModbus从站设计(9)
    FreeModbus从站设计(9)-详解FreeModbus在单片机串口上的数据收发过程 关键词:FreeModbus STM32F103 CubeMX HAL库 串口 1.引言 在上一篇文章中,主要阐述了vMBPortSerialEnable()这个函数如何基于HAL库调度单片机串口的收发,感觉还是不是很清晰,因此,孔丙火(微信公众号:孔丙火)在这一篇文章中,重点捋一下串口的收发函数调用关系,以求有有一个清晰的脉络。 2.函数调用的基本框架 直接上图,更清晰,接收过程如图1所示,发送过程如图2所示。 图1 接收过程起源于vMBPortSerialEnable()函数的调用,此时,该函数将串口设置位接收状态,即使能接收中断,禁止发送中断。从图中可以清晰的看出,需要修改的地方就是接收中断的回调函数和portserial.c和porttimer.c中的几个函数。至于何时调用vMBPortSerialEnable()函数,孔丙火(微信公众号:孔丙火)认为,我们是不需要关心的,只要按照之前的文章,把FreeModbus的代码添加到keil工程中,FreeModbus协议栈会进行调度。接收过程是一个字节一个字节进行接收的,当协议栈检测到定时器超时,则认为一个完整的数据帧接收完毕,开始进入数据处理的阶段,数据处理完成后,则进行回复数据的发送。 图2 发送过程同样起源于vMBPortSerialEnable()函数的调用,此时,该函数将串口设置位发送状态,即使能发送中断,禁止接收中断。从图中可以清晰的看出,需要修改的地方就是发送中断的回调函数和portserial.c中的几个函数。至于何时调用vMBPortSerialEnable()函数,孔丙火(微信公众号:孔丙火)认为,我们是不需要关心的,只要按照之前的文章,把FreeModbus的代码添加到keil工程中,FreeModbus协议栈会进行调度。发送过程同样是一个字节一个字节进行的,在xMBRTUTransmitFSM()函数中,会检测是否还有需要发送的数据,若没有数据需要发送了,则会调用vMBPortSerialEnable()函数,再次将串口设置为接收状态。作为Modbus从站,串口大部分时间是处于接收状态的。 3.总结 在这篇文章中,孔丙火(微信公众号:孔丙火)接着上一篇文章的思路,用两张图把FreeModbus在单片机串口上数据收发流程进行了梳理,脉络更加清晰。有了这样一个思路,可以更好地理解,移植FreeModbus的时候,为什么需要修改portserial.c和porttimer.c中的函数,和为什么需要修改串口中断的回调函数。从这篇文章中,也可以看出,采用HAL库是比较简单的,像是中断处理这些内容库函数都已经处理好了,很方便,可以提高开发效率。 文章在公众号( 孔丙火 )同步推出,欢迎查看更多系列文章。 单片机、ARM、现场总线、PLC、嵌入式软硬件的设计经验分享,秉承“点点滴滴皆智慧”的理念,以实际项目为单元阐述知识点,一起分享,共同交流。
  • 热度 4
    2020-6-21 07:56
    1420 次阅读|
    0 个评论
    部分特性说明: NOISE ERROR FLAG(NF,START位噪音探测标志):仅在START位时进行判断,RX下降沿启动检测,在START位的中间位置检测到1时则置位该标志,然后丢弃当前START位,等待下一个START开始条件 FRAMING ERROR FLAG(帧错误):当收到一个BREAK字符、大量噪音或者数据非同步(波特率错误),会被认为是帧错误,置位该位 OVERRUN FLAG(溢出错误):当RXNE标志置位时,又收到新字符。此时新收到的字符会被丢弃,RX寄存器中数据不会被覆盖。该位为1说明至少漏掉了1个字符数据。如果该位为1时,RXNE为0,表明数据丢弃正好发生在读取上一个数据的过程中 IDLE字符:RX一次下降沿后收到全1值(TE位关闭到开启也会在TX线上产生一个IDLE字符) BREAK字符:RX一次下降沿后收到全0值(发送器会在BREAK帧后插入2个停止位) 发送中断包括:传输完成、CTS、发送寄存器空、帧错误 接收中断包括:IDLE线天策、溢出错误、接收寄存器非空、极性校验错误、噪音错误、帧错误、字符匹配等 UART低功耗模式使用注意: 1. 为了能够支持STOP模式下唤醒串口,UART时钟必须为HSI或者LSE 对于HSI作为串口时钟:STOP模式下,RX上的下降沿触发HSI启动。根据唤醒配置(开始条件、地址匹配以及RXNE置位),满足条件则唤醒Core,否则HSI被关闭。 对于LSE作为串口时钟:类似HSI的情况,区别在于RX下降沿会开通LSE作为串口时钟,满足唤醒条件时则唤醒Core,否则断开LSE(为了达到9600波特率,CR3:UCESM必须置位) 2. 如果使用RXNE中断作为唤醒条件,则进入STOP模式前RXNEIE位必须被置位(即必须允许RX非空中断) 3. CR1:UECM在进入STOP模式前必须置位 4. 探测到唤醒事件时,WUF标志被硬件置位(无论当前Core处于STOP模式还是运行模式),如果WUFIE置位的话,也会产生一个wakeup中断(仅在STOP模式时产生中断,运行模式不会) 5. RX下降沿将置位BUSY标志(有效开始位置位,接收完成时复位),但BUSY标志不能保证Core不会进入STOP模式 6. 发送数据时必须判断TC=1时(发送结束),才能进入STOP模式 CR3:UCESM: 该位可使STOP模式下串口时钟一直开启(即不会断开LSE或不会关闭HSI) CR1:UESM: STM32建议在进入STOP模式前置位,在退出STOP模式后复位(该位复位后,WUF标志也会被清除) 进入STOP模式前注意点: 1. BUSY标志应该为0,该位为1时说明串口正在接收数据 2. 用户自定义的接收缓冲区为空。缓冲区有数据的话,应该处理完再进入STOP模式。 3. 如果使用了RS485-RTU模式,要确保超时定时器未工作。如果定期器在工作,表明正在的等待T3.5过程中
  • 热度 10
    2019-8-26 22:00
    1475 次阅读|
    0 个评论
    前面两期让UFUN开发板有了“嘴”,有了表达交流的元素工具——可显示的字符。接下来是什么呢?当然是让UFUN开发板交流起来。交流就是我问你答,我们的每一次表达都能得到适当的回应,这样就具备智能的潜质。就像微软的小兵、阿里的天猫精灵、小米的小爱,搭配了语音识别和语音合成后,已经开始具备了机器人部分特性。那就让UFUN交流起来吧,通过OLED屏幕响应PC通过USB转串口模块传送的信息。预想的效果是每次PC端发送一个ASC码字符,UFUN会通过OLED告诉我们收到了什么字符,此字符的ASC码是多少。 主程序很简单,就是初始化后显示一个等待PC端发送ASC码字符的界面。 int main(void) { extern unsigned char R_str ;// 全局字符串变量R_str ,用于串口接收数据传送 extern uint8_t ucTemp; uint8_t send_flag=0; //发送标志位 USART_Config(); //串口配置 NVIC_Config(); //中断配置 DelayInit(); I2C_Configuration(); OLED_Init(); OLED_Fill(0x00);//清屏 while(1) { OLED_ShowStr(0,0,"UFUN_PC Talk:",1);// 标题测试6*8字符 ",1);// 标题测试6*8字符 DelayS(1); } 参考了UFUN的串口通讯例程,在主程序里设置了一个全局字符串变量R_str ,用于传送串口接收中断子程序接收的ASC码。就是在这一步差点把人逼疯,出现很多难以想象异常现象:接收到的回送数值无缘无故就变成一个很大的值,比如0xFE、0xE0,在OLED上只能显示一个乱码,如果在串口接收中断子程序和主程序同时回送时子程序回送的数值是对的,那就直接在中断子程序完成回送和显示吧,其结果又是照错不误。 串口发送0x77,回送的数值莫名其妙地变成0xF7,反反复复的修改都试了,就是这么个结果。不多说了,把串口接收中断子程序贴上,希望能得到大牛们指导性的回应。 void USART1_IRQHandler() //串口接收中断 { if (USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) { ucTemp = USART_ReceiveData( USART1 ); Usart_SendByte(USART1,ucTemp);//回送 R_str = ucTemp; //传送接收数据到main.c R_str = 0; OLED_Fill(0x00);//清屏 OLED_ShowStr(0,0,"UFUN_PC Talk:",1);// 标题测试6*8字符 ",1);// 标题测试6*8字符 OLED_ShowStr(10,2,R_str,1);// 显示接收字符 OLED_ShowStr(0,4,"> 4]; hex = chHex ) & 0xf]; hex = ' '; } hex = '\0'; return len * 3; } 最后附上一个没有达到预期效果的程序运行效果图片,这是一个失败的编程经历,到现在也没弄清问题到底出在哪里,留待以后经验丰富了回头分析。 附件: 对话UFUN(串口通讯待修改)源程序 https://mbb.eet-china.com/download/20409.html
  • 热度 5
    2019-6-2 14:55
    4925 次阅读|
    2 个评论
    NUCLEO-F411RE串口输出趣味图像
    一, 概述 拿到 NUCLEO-F411RE 也有两个周了,第一周完成了一篇开箱评测,还没来得及进行深入研究。这周抽个周末摸一下这块入门级高性能芯片的性能。 本篇评测的主要内容为串口输出图像。在有些论坛,经常看到有看到一些有趣的图像,说图片其实也不准确,应该是利用文字的排版完成了一副图像的输出。比那些直接的图像显得更加有趣好玩。本文就利用 NUCLEO-F411 板载的 STM32F411RET6 输出类似的图像。下图是我输出的部分文字,炯炯有神的眼睛,猜猜我是谁 ~~~ 二, 开发平台搭建 现在貌似 Cube 比较流行,只要点几下配置配置源代码就生成了。但是本人不爱学习新东西,至今还没摸过这玩意,所以还是以我熟悉的标准库来进行开发。开发工具用的是 IAR , IAR 简洁大方,就是输入提示功能实在是有点跟不上节奏,要能做到 VS 的提示输入功能,那真是要好用到飞起了。打开标准库中模板 \en.stm32f4_dsp_stdperiph_lib\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Templates\EWARM\Project.eww 工程。打开后如下图,图中的 MCU 选择应该选择板卡对应的 STM32F411xE 。编译下载能够运行的断点能够跳到 Main 函数,基本就算运行环境OK。 三, LED 灯驱动 开发环境建立完成,首先操作毫无疑问就是进行 LED 常规电灯操作。 根据板卡电路图 LED 的配置到了两个引脚 PA5 和 PB13 ,一开始没有仔细看,配置到了 PB13 ,发生了什么情况你们懂得。点灯程序比较简单,直接贴图就好 四, 串口驱动 对于玩 MCU 的来说点灯是第一步, Hello word 的串口输出是和点灯同样重要的完美搭档。废话不多说。先查看原理图,串口的配置在 PA2 和 PA3 上,查看 Datasheet ,其配置为串口 2 。串口也是比较简单的,贴代码就 OK 了。 五, 串口输出趣味图像 本人桌面是这个 Nike 的标语。受其启发,本实例也是做得简化版的此种效果。先看看单片机版的 Just do it 吧。下面我以输出文字为例子,详细给出制作这种效果的方法。 1. 制作需要输出的图片 打开电脑自带的图片编辑器。在上面调整背景大小,我图中的背景为 104*32 。在图上打上 JUST DO IT 的文字。然后另存为 BMP 图片格式,注意图片的格式为单色位图。 然后我们就要处理这个图片了。找到 ImageLcd 这个软件 。 打开软件输出图片设置图片转换格式。这里有好多输出的样式,可以实现镜像、负片等效果。这个后面读者可以自行尝试。本文对正常的文本进行处理。然后保存成 .h 或 .c 文件。到此部,数据的基本处理已经 OK 了。后面就要去程序中处理了。 2. 数据进行输出 输出的文件格式为一个数组。每个字节代表横向的 8 个像素的值,这个和扫描方向有关系。例如本实例中,第一个字节内容为 0x00 ,则分解成二进制 00000000 的 BIN 格式, bit 为 0 表示没有黑色像素落到此区域,所以串口输出空格,如果 bit 为 1 ,则输出实体的表示字符。本例中用‘ ’表示为无,‘ A ’表示为有像素值。 图片输出程序其实特别简单,如下图的图片所示。 3. 图像输出 其实拓展到其他图片都是一样的,如下图。这个其实就是本文一开始那对囧囧有神的眼睛。 经过上述步骤的操作处理后,输出的图像如下 六, 总结 本文简单的描述了如何用串口输出一个二值的图像。希望本文的抛砖引玉能够使得爱折腾的你能够发现更多的奇妙玩法。在此也要感谢面包板社区提供的 NUCLEO-F411RE 开发版,后面有时间还会就其处理器性能进行进一步评估。 文章中涉及的附件在下列帖子: https://forum.mianbaoban.cn/topic/71366_1_1.html
相关资源