上一篇中介绍了UART的收发数据操作,那些操作都是基于外设库的,而不是采用Harmony的动态驱动,也没有采用状态机的机制。本篇就来介绍一下如何使用Harmony的动态驱动和状态机来编写程序。其实状态机是挺简单的,就是事先定义好可能发生的哪些状态,然后主循环里根据不同的状态进行不同的处理,这个在项目中也是比较常用的方法。
注意Dynamic的驱动对象都需要有一个Open动作来创建一个Handle,后续所有操作都是用Handle来代表这个驱动对象。所有动态驱动的中断都是采用注册回调函数的方式来使用,无需到system_init中添加,也无需自己清除中断标识,驱动已经自己完成了。
另外要注意的一点是,串口接收一个字节后进入了中断,如果不使用Read接收一下,那么后续就再也无法进入中断,就会出现仅中断一次的现象,因此,也不要在中断中进行耗时操作,避免没有及时接收数据,导致数据残缺不全。
先在app.h文件中定义状态机和UART要使用的相关变量结构体,使用结构体也是满方便的。
在app.c中编写应用程序,包含头文件之后,初始化函数编写,这里的初始化不是底层的初始化,而是初始化UART的相关变量,并创建句柄。第一步要initial(open一个客户端),然后判断创建的客户端时候有效,有效的话,就创建中断回调函数,中断程序的内容直接在回调函数里编写就可以了。
编写中断回调函数内容程序,收到一个数据后存储到数据缓冲区,并置位接收完成标志位
发送数据的函数,发送采用查询方式
编写Uart_Task()函数,状态里就在这里处理,初始化状态时进行初始化,然后进入接收数据状态,接收到数据后回发,并在OLED上显示接收到的字节数。
在APP_Tasks()中循环调用Uart_Task(),以处理接收到的数据。
编译,下载程序到开发板,打开串口软件测试
OLED显示效果
-
状态机
+关注
关注
2文章
492浏览量
27538
发布评论请先 登录
相关推荐
评论