简介

Air724UG有多个串口,但是用于和外部模块或者单片机进行通信的,只推荐使用UART1或UART3。

UART2 在开机后会自动打印一段log,波特率921600,这段log不能通过修改软件来关闭,所以推荐优先使用UART1 和 UART3。

Air820内部的GPS模块占用了UART3,所以用户只能使用UART1。

串口电平转换

UART1和UART3都是1.8V电平逻辑的,因此和其他串口通信时要做电平转换。

下面是使用分立元件搭建的stm32与Air724串口通信的电平转换电路,实现了3.3V到1.8V串口电平的转换。

串口初始化

-- 带有[]代表带有默认值的可选参数
uart.setup( id, baud, databits, parity, stopbits,[msgmode],[txDoneReport],[flowcontrol] )--例子:
uart.setup( 1, 9600, 8, uart.PAR_NONE, uart.STOP_1,0,0,0)

参数1:id,串口编号。1(UART1),2(UART2),3(UART3),0x81(USB)

参数2:baud,波特率设置。可选1200,2400,4800,9600,10400,14400,19200,28800,38400,57600,115200,230400,460800,921600

参数3: databits,数据位长度,只能填8

参数4:parity,校验方式。uart.PAR_EVEN, 偶校验;uart.PAR_ODD,奇校验;uart.PAR_NONE,无校验

参数5:stopbits,停止位位数。uart.STOP_1,一位停止位;uart.STOP_2,两位停止位;

参数6:msgmode,串口消息接收模式。0:默认值,启用数据接收事件通知机制,当串口收到一包数据时,会产生“receive事件”,系统会自动调用用户注册的事件处理函数。1:关闭数据接收事件通知机制,用户需要使用轮训法来接收串口数据。

参数7:txDoneReport,串口数据发送完成通知开关。0:默认值,关闭数据发送完成事件通知机制。1:开启数据发送完成事件通知机制。当使用uart.write发送一包数据完成后,将产生"sent"事件,系统自动调用用户注册的事件处理函数。

参数8:flowcontrol,硬流控功能。0:关闭(默认),1:打开

串口数据发送

--这是一个变长参数函数
uart.write( id, data1, [data2], …[datan] )--例子:
uart.write(1,"hello world")   --uart1发送字符串
uart.write(1,0x5A)            --uart1发送整数0x5A
uart.write(1,0x5A,"hello")    --uart1发送整数0x5A和字符串

参数1:id,串口编号。1(UART1),2(UART2),3(UART3),0x81(USB)

参数2~n:发送的数据,可以是number或者string类型

串口数据接收

使用uart.read()从底层的接收缓冲区读取数据。那么底层缓冲区有数据后,应用层代码如何收到通知呢?这就需要使用uart.on()来注册。

当uart.setup()的第6个参数msgmode为0时,就启用了数据接收事件通知机制。这种情况下,当串口底层的接收缓冲区从空状态转换为有数据可读状态时,就会触发'receive'接收事件。通使用uart.on()来注册事件处理函数,就可以在串口触发'receive'事件时,调用注册的接收事件处理函数。注意,当缓冲区为空时,收到数据插入缓冲区,然后才产生数据中断消息;如果缓冲区不为空,收到数据时仅仅插入缓冲区,并不会产生数据中断消息。所以在接收事件处理函数中,要循环读取串口数据,直到把缓冲区中的数据读完,这样才能保证下次收到的数据,可以产生中断消息。

同样的道理,串口在发送完成数据后,也会产生一个"sent"事件,如果需要启用这个机制,则art.setup()的第7个参数txDoneReport要设置为1。

uart.on (id, event, callback)--例子:--定义串口1的接收中断函数
local function uart1ReceiveCb()local data=""local temp=""while true dotemp = uart.read(UART_ID_1,10)  --每次尝试读10字节if not temp or string.len(temp) == 0 then   --如果把接收缓冲区读空了breakelsedata = data..temp    --拼接endend--log.info("uart1",#data)   --log打印--处理接收到的报文uart1ProcRecv(data)
end--注册UART1的 "receive" 事件处理函数
uart.on(1,"receive",uart1ReceiveCb)
--函数
--详见:https://doc.openluat.com/wiki/21?wiki_page_id=2250
uart.read( id, format)--如果参数format传递一个数字,则代表从接收缓冲区读取指定长度的数据。下面是读取1024个字节。
--如果缓冲区中没有数据,则返回空字符串,返回值为string类型
--如果缓冲区中的数据长度小于等于要读取的数据长度,则返回缓冲区中的所有数据,返回值为string类型
--如果缓冲区中的数据长度大于要读取的数据长度,则返回要读取的长度的数据,返回值为string类型
--如果对方发送的是10进制字节数据:97,98,99,则此函数返回的是字符串 "abc"
uart.read(1,1024)--从缓冲区读数据,一直读取到换行符\n
--  如果缓冲区中没有数据,则返回空字符串,返回值为string类型
--  如果缓冲区中的数据没有\n,则返回缓冲区中的所有数据,返回值为string类型
--  如果缓冲区中的数据有\n,则返回到\n结束的所有数据(包括\n),返回值为string类型
uart.read(1,"*l")

sent事件

当发送数据比较频繁时,需要保证上一包数据发送完成,才能进行当前一包数据的发送,这个时候可能需要用到sent事件,sent事件可以这样用:

local uart1_tc = true  --发送完成标志--初始化串口1
--启用数据接收事件通知机制
--启用数据发送完成事件通知机制
uart.setup(UART1_ID, 115200, 8, uart.PAR_NONE, uart.STOP_1,0,1,0)--定义sent事件回调函数
local function uart1SentCb()uart1_tc = true
end--注册sent事件回调函数
uart.on(UART1_ID,"sent",uart1SentCb)sys.taskInit(function ()while true dosys.wait(200)--等待发送完成while not uart1_tc do enduart1_tc = false --设置发送完成标志为falseuart.write(UART1_ID,"hello world\n")endend
)

一个完整的例子

使用串口1,波特率115200,间隔1s发送数据。串口1收到的数据则通过LOG打印出来。

--必须在这个位置定义PROJECT和VERSION变量
PROJECT = "TestUART"
VERSION = "1.0.0"require "sys"--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE
--[[
如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
]]
--log.openTrace(true,1,115200)require "net"
--每1分钟查询一次GSM信号强度
--每1分钟查询一次基站信息
net.startQueryAll(60000, 60000)--此处关闭RNDIS网卡功能
--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
ril.request("AT+RNDISCALL=0,1")--========================================================================--定义串口1的接收中断处理函数
local function uart1ReceiveCb()local data=""local temp=""while true dotemp = uart.read(1,10)  --每次尝试读10字节if not temp or string.len(temp) == 0 then   --如果把接收缓冲区读空了breakelsedata = data..temp    --拼接endend--处理接收到的报文log.info("uart1 recv",data)   --log打印收到的数据end--注册串口的数据接收函数,串口收到数据后,会以中断方式,调用uart1ReceiveCb接口读取数据
uart.on(1,"receive",uart1ReceiveCb)
--串口初始化
uart.setup(1,115200,8,uart.PAR_NONE,uart.STOP_1,0,0,0)--开一个任务,间隔1s使用串口1输出字符串
sys.taskInit(function ()while true dosys.wait(1000)uart.write(1,"hello uart1")endend
)--启动系统框架
--这个代码后面不能再有其他代码
sys.init(0, 0)
sys.run()

Air724UG之串口通信相关推荐

  1. python第三方库之学习pyserial库--串口通信

    pyserial串口通信库 1.安装pyserial库 2.填写串口参数的注意事项 3.简单封装一下 4.碰到的bug 1.安装pyserial库 pip install pyserial versi ...

  2. VC串口通信编程-2

    VC串口通信编程 (2009-07-08 13:48:40) 转载▼ Win32串口编程(转:韩耀旭) 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信 ...

  3. Linux ROS与嵌入式的串口通信

    1.根据ros wiki的官方教程 学习即可,并且有许多例子可供学习 http://wiki.ros.org/rosserial_arduino/Tutorials 2.用ASIO读写设备串行口 AS ...

  4. 投影串口测试程序_【原创】串口通信测试程序

    源代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

  5. labVIEW与单片机实现串口通信的设计过程

    1.概述 在现代测控系统中,我们经常会采用上位机和下位机的开发控制模式.下位机主要是用来采集数据,可以通过嵌入式控制器.单片机控制器.PLC等来实现.上位机主要是图形界面,用来实时显示采集数据,并进行 ...

  6. chord协议模拟实现_C#.NET和单片机串口通信实现监控单片机数字量输入继电器输出模拟量输入模拟量输出...

    一.必备软件和硬件: 1.C#.NET: 2.单片机开发板: 3.通信电缆. 二.通信参数: 1.数据位:8位 2.校验方式:无校验 3.停止位:1位 4.波特率:9600bps 5.通信协议:自定义 ...

  7. java串口通信DataRecive_串口通信之DataReceive事件触发时机

    环境:Windows PC.本机虚拟COM2连接COM3.串口调试助手COM2发数据 图1 1> ReceivedBytesThreshold为默认值1:2> 一次发送41个字节:3> ...

  8. 读取串口数据_自定义串口通信的相关问题整理

    串口通信是常见的通信方式,串口接口是大部分工控器件标配的通信接口.在项目开发的过程中,也经常遇到进行串口通信的处理.这里就串口通信的部分问题分享给大家. 1.TTL.RS232.RS422.RS458 ...

  9. [python] 3 、基于串口通信的嵌入式设备上位机自动测试程序框架(简陋框架)...

    星期一, 20. 八月 2018 01:53上午 - beautifulzzzz 1.前言 做类似zigbee.ble mesh...无线网络节点性能测试的时候,手动操作然后看表象往往很难找出真正的原 ...

最新文章

  1. 数据加密之MD5加密
  2. 8-1日复习 模板函数 模板类
  3. 导出全部记录到excel
  4. java中log4j的详解(转)
  5. Check_mk 主机状态为 down 但是主机下其他服务有数据且正常 解决方法
  6. sigprocmask 阻塞进程
  7. 实现MFC扩展DLL中导出类和对话框
  8. java web 模糊匹配查询_Javaweb模糊查询详解
  9. 塑料周转筐生的材料配方详解
  10. 被动语态 动词的过去分词
  11. ORA-00932: 数据类型不一致: 应为 CHAR, 但却获得 NUMBER
  12. 大方无隅,大器晚成,大音希声,大象无形
  13. 算法导论 之 红黑树 - 添加[C语言]
  14. Linux: vi 编辑器
  15. Excel分组最大级别为8(outlineLevel最大为7)
  16. linux命令:xxd读取二进制文件
  17. IDEA怎么查看现在的项目使用的JDK版本?
  18. 什么是容器编排及容器编排是怎么工作的?
  19. strust2-学习(一)框架搭建和简单示例
  20. 如何选择socks5免费代理地址呢?

热门文章

  1. linux i386 amd64,i386下载与amd64的区别?
  2. cassandra java_Cassandra安装与Java操作
  3. windows10快捷键(windows10常用快捷键大全)
  4. Kerberos常见问题
  5. 关于非现场审计软件的一些介绍(ACL、IEDA、Teammate)
  6. marketch 导出html,Sketch设计稿标注必装神器Marketch
  7. 理发店收银系统php,理发店收银系统提升门店管理效率
  8. 上海大学计算机专业考研好不好考,上海大学计算机考研难不难
  9. JVM虚拟机的一些参数设置
  10. 泰达机器人董事长_2017深圳机器人年度评选颁奖盛典