tag 标签: 串口

相关博文
  • 热度 11
    2023-3-29 12:01
    2350 次阅读|
    2 个评论
    以前使用 VB 做串口上位机,现在试用 QT 来做,顺便学习一下,入个门。看看有多大区别。 QT 上编程用的是 C++ ,所以 Class (类)的概念(公有、私有、继承、多态、构造、析构、重载这些名词)一定要搞明白。 QT 专有的信号和槽的概念。 开发用的是开源的 QT Creator ,具体下载,安装方法可以上 B 站看看大牛们的讲解。界面和使用方法,新建一个工程的方法,同样也可以看 B 站。 串口编程在 VB 中使用 comm 控件。在现在的这个 QT 版本中没有这个 comm 控件。不过可以使用两个类来完成同样的工作。 #include #include 在 MainWindow 的类定义中,私有成员增加 QSerialPort * serial ; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_pbConnect_clicked(); void readData(); private: Ui::MainWindow *ui; QSerialPort *serial; // 私有QSerialPort成员 }; 记得一定要在 MainWindow 的构造函数中对 serial 进行实例化。也就是需要让 serial 指向的一个实体,用于操作。 serial = new QSerialPort ; //new 的作用相当于 malloc ,分配一个实体 QSerialPort 需要的内存。 严格的说,在析构函数中应该 delete serial ; 以释放内存。 第一次编程时,没有实例化 serial ,空指针操作 serial ,结果程序一运行就崩溃退出。 MainWindow :: MainWindow ( QWidget * parent ) : QMainWindow ( parent ) , ui ( new Ui :: MainWindow ) { ui setupUi ( this ); const auto infos = QSerialPortInfo :: availablePorts (); for ( const QSerialPortInfo & info : infos ){ ui cbCom addItem ( info . portName ()); } serial = new QSerialPort ; // 实例化 serial connect ( serial , & QSerialPort :: readyRead , this , & MainWindow :: readData ); } 在连接用的按键点击可以打开或关闭串口了。方法是判断按键上的文字。神奇的是,经常用的 strcmp 不存在,不过可以这样用: if ( ui pbConnect text () == QString ( " 连接 " )) 直接判断字符串相等,不比 strcmp 香么?判断字符串相等肯定还是得一个字节一个字节比较。我想这个 QString 类一定把 “ == ” 做了重载(新定义了 == 作为字符串比较的运算符)。 void MainWindow :: on_pbConnect_clicked () { if ( ui pbConnect text () == QString ( " 连接 " )){ serial setPortName ( ui cbCom currentText ()); serial setBaudRate ( QSerialPort :: Baud115200 ); serial setDataBits ( QSerialPort :: Data8 ); serial setStopBits ( QSerialPort :: OneStop ); serial setParity ( QSerialPort :: NoParity ); if (! serial open ( QIODevice :: ReadWrite )){ QMessageBox :: information ( this , " 错误提示 " , " 不能打开串口 " , QMessageBox :: Ok ); } else { ui cbCom setEnabled ( false ); ui pbConnect setText ( " 关闭 " ); } } else { serial close (); ui cbCom setEnabled ( true ); ui pbConnect setText ( " 连接 " ); } } 关于串口号的获取,在用 VB 时,用的是穷举法,捕获错误,非法的 COM 号会产生错误剔除 , 获得合法串口号。在 QT 里可以用 QSerialPortInfo 类,获取可用串口。这个 for 循环也很有意思。不是常规的 ;; 结构,感觉像是使用 : 对集合里的元素做一个遍历。可以在窗口构造函数中,或者其它地方把可用串口号送到 combox 里,方便选取。 const auto infos = QSerialPortInfo :: availablePorts (); for ( const QSerialPortInfo & info : infos ){ ui cbCom addItem ( info . portName ()); } 为了从串口获取数据,需要连接一个串口取数的槽函数。 connect ( serial , & QSerialPort :: readyRead , this , & MainWindow :: readData ); 当串口产生 readyRead 信号时,调用 readData 函数处理。而 readData ,当然需要定义到 private slots 里面。 class MainWindow : public QMainWindow { Q_OBJECT public : MainWindow ( QWidget * parent = nullptr ); ~ MainWindow (); private slots : void on_pbConnect_clicked (); void readData (); private : Ui :: MainWindow * ui ; QSerialPort * serial ; }; 每产生一次 readyRead , readData 就被执行,程序中直接把所有接收到的内容存放到 QString data 里面。对于格式化数据,先前可以用 sscanf 读取分别放到数据或字符串里。 QT 里面没有 sscanf , 感觉不爽是吧。 QStringList datlist = data . split ( "," , QString :: SkipEmptyParts ); 这个 split 一下就把字符串分好了,直接使用 datlist ); ui lcdNumber2 display ( datlist ); } 程序运行,结果满意。效率又提升了。 So easy! 好文赏现金!2023面包板社区原创奖励活动进行中: https://mbb.eet-china.com/forum/topic/125238_1_1.html
  • 热度 3
    2022-5-19 20:31
    4767 次阅读|
    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
    2891 次阅读|
    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
    2486 次阅读|
    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过程中
  • 热度 19
    2019-8-26 22:00
    2324 次阅读|
    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
相关资源
  • 所需E币: 3
    时间: 2024-3-16 22:10
    大小: 422.38KB
    上传者: 电子阔少
    STC15F104E单片机之定时器T0模拟串口.pdf
  • 所需E币: 0
    时间: 2024-2-27 15:17
    大小: 2.5KB
    一、为什么选择C#C#是一种新式、创新、开放源代码、跨平台,面向对象的编程语言,是GitHub上排在前列的5种编程语言之一。是否拥有JavaScript、Java或C++开发经验?你会立即发现C#用起来十分熟悉,并会乐于看到推出不断变化的功能,包括类型安全、泛型、模式匹配、异步、记录等。我们希望你从按下第一个按键起,便爱上C#。二、版本VisualStudio适用于Windows和Mac。VisualStudioforMac的许多功能与VisualStudioforWindows相同,并针对开发跨平台应用和移动应用进行了优化。本文重点介绍VisualStudio的Windows版本。VisualStudio有三个版本:社区版、专业版和企业版。请参阅比较VisualStudio版本,了解各个版本支持的功能。三、C#可以开发哪些类型的应用程序c#可以用于开发各种类型的应用程序,包括但不限于以下几种:桌面应用程序:使用C#和.NETFramework,你可以开发Windows桌面应用程序。这些应用程序可以提供丰富的用户界面和交互功能,适用于各种领域,如办公软件、图像处理工具、游戏等。Web应用程序:C#可以与ASP.NET和ASP.NETCore等Web开发框架结合使用,用于构建Web应用程序。你可以创建动态网站、电子商务平台、后台管理系统等,并通过浏览器访问。移动应用程序:通过使用Xamarin或Unity等跨平台开发工具,你可以使用C#开发移动应用程序,包括iOS、Android和WindowsPhone。这使得开发人员可以在多个平台上共享代码,加快开发速度。云和分布式应用程序:使用C#和相关技术,例如ASP.NETCore、Azure等,你可以构建云应用程序和分布式系统。这包括构建基于云平台的Web应用程序、微服务架构、消息队列和分布式数据库等。游戏开发:C#在游戏开发中非常受欢迎,特别是在使用Unity游戏引擎的情况下。你可以使用C#编写游戏逻辑、控制脚本和用户界面,开发各种类型的游戏,包括2D和3D游戏。数据库应用程序:C#与各种数据库系统(如SQLServer、MySQL)紧密集成,可以用于开发数据库应用程序。通过ADO.NET和EntityFramework等技术,你可以连接到数据库、执行查询、处理数据和构建数据驱动的应用程序。四、程序结构C#中的关键组织结构概念包括程序、命名空间、类型、成员和程序集。程序声明类型,而类型则包含成员,并被整理到命名空间中。类型示例包括类、结构和接口。成员示例包括字段、方法、属性和事件。编译完的C#程序实际上会打包到程序集中。程序集的文件扩展名通常为.exe或.dll,具体视其分别实现的是应用程序还是库_***而定。五、代码实战将以下代码粘贴到Main()方法主体中。//someWordsisastringarray.string[]someWords={  "the",  "quick",  "brown",  "fox",  "jumps"};string[]moreWords={  "over",  "the",  "lazy",  "dog"};//Alphabeticallysortthewords.IEnumerable<string>query=fromwordinsomeWords              orderbyword              selectword;若要使用IntelliSense文字自动完成插入单词query的剩余部分,请按Tab。完成后,代码块如以下代码所示。你可以通过输入cw,然后按Tab两次来生成Console.WriteLine语句,从而进一步练习代码片段。foreach(stringstrinquery){  Console.WriteLine(str);}六、总结: 抛开商业的角度,无论是简洁性,还是上手的容易程度来说,c#都是不错的一个愿意。大家没有必要带有成见去看待c#这样的语言,只要快速开发出软件,保质保量满足客户的需求,这就是好语言,没必要从底层到上层、事事亲力亲为,做好自己擅长的领域,掌握核心模块的开发竞争力其实就可以了。
  • 所需E币: 0
    时间: 2023-11-10 16:17
    大小: 1018KB
    上传者: Argent
    第19讲串口实验
  • 所需E币: 1
    时间: 2023-11-10 11:48
    大小: 28.35KB
    上传者: Argent
    第24讲Linux串口实验_笔记
  • 所需E币: 5
    时间: 2023-11-6 12:01
    大小: 513.93KB
    上传者: 物联创客
    本资源内容概要:这是基于51单片机的ADC0809八路电压巡检串口输出设计,包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开)、元件清单(excel表格打开)。本资源适合人群:单片机爱好者、电子类专业学生、电子diy爱好者。本资源能学到什么:可以通过查看电路学习电路设计原理,查看代码学习代码编写原理。本资源使用建议:建议使用者需要具备一定电子技术基础,掌握一些常用元器件原理,例如三极管、二极管、数码管、电容、稳压器等。了解C语言基础设计原理,能看懂基础的电路图,具备一定的电路图软件使用能力。
  • 所需E币: 5
    时间: 2023-7-22 09:43
    大小: 454.67KB
    上传者: 物联创客
    本资源内容概要:这是基于51单片机的hs1101湿度检测DS18B20温度检测1602液晶显示串口输出设计,包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开)。本资源适合人群:单片机爱好者、电子类专业学生、电子diy爱好者。本资源能学到什么:可以通过查看电路学习电路设计原理,查看代码学习代码编写原理。本资源使用建议:建议使用者需要具备一定电子技术基础,掌握一些常用元器件原理,例如三极管、二极管、数码管、电容、稳压器等。了解C语言基础设计原理,能看懂基础的电路图,具备一定的电路图软件使用能力。
  • 所需E币: 1
    时间: 2023-7-11 17:38
    大小: 270.42KB
    上传者: 张红川
    day08-Qt数据库数据模型和串口开发.pdf
  • 所需E币: 1
    时间: 2023-7-11 17:39
    大小: 551.15KB
    上传者: 张红川
    day09-串口类和项目.pdf
  • 所需E币: 1
    时间: 2023-6-28 11:31
    大小: 63.01KB
    上传者: 张红川
    串口键盘.pdf。。。。。
  • 所需E币: 1
    时间: 2023-6-28 11:31
    大小: 143.09KB
    上传者: 张红川
    单片机IO口模拟串口.pdf
  • 所需E币: 1
    时间: 2023-6-28 11:29
    大小: 337KB
    上传者: 张红川
    RCC串口通讯协议1.doc
  • 所需E币: 1
    时间: 2023-6-28 11:29
    大小: 422KB
    上传者: 张红川
    RCC串口通讯协议.doc
  • 所需E币: 1
    时间: 2023-6-28 11:22
    大小: 122.28KB
    上传者: 张红川
    95串口.pdf。。。
  • 所需E币: 1
    时间: 2023-6-28 11:12
    大小: 1.34MB
    上传者: 张红川
    CH340USB转串口IC中文资料.pdf
  • 所需E币: 2
    时间: 2023-5-11 16:22
    大小: 10.58KB
    上传者: 木头1233
    基于51单片机的串口发送1602显示例程源代码
  • 所需E币: 2
    时间: 2023-5-11 16:22
    大小: 3.51KB
    上传者: 木头1233
    基于51单片机的串口发送1602液晶显示例程源代码
  • 所需E币: 2
    时间: 2023-5-4 14:06
    大小: 2.12MB
    上传者: 木头1233
    基于ATmega8单片机模拟采集串口发送程序Proteus仿真源程序
  • 所需E币: 2
    时间: 2023-5-4 13:56
    大小: 897.89KB
    上传者: 木头1233
    基于AT89C51单片机甲机通过串口控制乙机LED闪烁仿真及代码
  • 所需E币: 1
    时间: 2023-4-26 19:09
    大小: 262.23KB
    上传者: 张红川
    基于串口方式一的pc机与单片机的多机通信.pdf
  • 所需E币: 1
    时间: 2023-4-25 14:41
    大小: 544.63KB
    上传者: 张红川
    基于多串口的单片机群控系统管理调度技术.pdf