树莓派PicoW串口连接Air724UG-DTU-4G模块
Air724UG-DTU-4G模块
Core-Air724 核心板是由银尔达(yinerda)基于合宙Air724模组推出的低功耗,小体积,高性能嵌入式4G Cat1核心版,支持标准固件AT固件,支持功能电话语音、短信、TCP&UDP、TCP&UDP透传、NTP、HTTP、FTP、MQTT等
配置Air724UG-DTU-4G模块
本次购买的为DTU固件Air724UG-DTU-4G,首先在银尔达DTU官网:http://dtu.yinerda.com/ 注册账号,然后在设备管理中添加设备,添加设备时需要输入设备的IMEI号, IMEI号可以在设备标签上查看。然后配置分组,串口参数选择打开,波特率选择115200
,数据位选择8
位,校验位选择无
,停止位选择1
位,其他都是默认,然后点击保存参数,最后再让设备重启一下即完成配置。
让PicoW串口连接Air724UG-DTU-4G模块
PicoW官方针脚图如下
与此4G模块串口通信仅需4根线即可,线路对应关系如下
PicoW | Air724UG-DTU-4G |
---|---|
VBUS(序号40) | VCC |
GND(序号38) | GND |
UART0 TX(序号1) | RXD |
UART0 RX(序号2) | TXD |
串口测试
编写如下代码,并在PicoW执行,注意UART
配置波特率要与模块配置的一致,否则无法正常通信,切连接针脚要对应。
import time
from machine import UART, Pin
uart = UART(0, baudrate=115200, bits=8, stop=1, parity=None, tx=Pin(0), rx=Pin(1))
def send_cmd(cmd):
print('send_cmd----------------------------------------------------------------------------')
uart.write(cmd + '\r\n')
# 读取命令响应
read_data()
def send_data(cmd):
print('send_data----------------------------------------------------------------------------')
uart.write(cmd)
def read_data():
print('read_data----------------------------------------------------------------------------')
start = False
start_time = time.time()
while True:
a = uart.any()
if a != 0:
start = True
res = uart.readline()
print(res)
elif a == 0 and start:
# 已经开始读取并且后续没有数据了,读取完毕
break
# 超时5秒跳出循环
if time.time() - start_time > 5:
print('read timeout')
break
time.sleep(0.1)
# 发送查询imei命令
send_cmd('config,get,imei')
print('end----------------------------------------------------------------------------')
调试打印日志如下,即发送查询imei命令,返回imei号到串口,串口读取到数据后打印出来。
MPY: soft reboot
send_cmd----------------------------------------------------------------------------
read_data----------------------------------------------------------------------------
b'\r\n'
b'config,imei,ok,861658064076782\r\n'
end----------------------------------------------------------------------------
串口通信传输原理
串口通信是基于二进制的,在串口通信中,数据通过位(bit)来传输,每个位只有两种状态,即0
和1
。 以上案例中我们发送了一个为config,get,imei
的命令,进一步分析如何传输一个c
字符。 在串口通信通常使用一种叫做ASCII
码编码方式,在 ASCII 码中,字符c
对应的十六进制是x63
,二进制表示为01100011
。 在串口通信中,典型的传输方式是每个字符由8
个连续的位(bit)来表示,按照从左至右的顺序,依次传输每一个位。
发送Http请求测试
具体配置参见文档:http://wiki.yinerda.com/index.php/Core-Air724UG ,找到银尔达-DTU固件串口配置命令手册.pdf
下载查看。
GET请求示例
编写如下代码,在PicoW并执行,即绑定串口通道2
,设置为Http模式,设置Http请求地址为www.baidu.com
,端口为80
,请求路径为/s?wd=
,请求方式为GET
。
send_cmd('config,set,http,2,uart,0,www.baidu.com,80,/s?wd=,5,0,0,1,0,0')
send_cmd('config,set,save')
# 等待设备重启结束
time.sleep(10)
send_data("abc")
# 读取响应数据
read_data()
print('end----------------------------------------------------------------------------')
调试打印日志如下
MPY: soft reboot
send_cmd----------------------------------------------------------------------------
read_data----------------------------------------------------------------------------
b'\r\n'
b'config,http,ok\r\n'
send_cmd----------------------------------------------------------------------------
read_data----------------------------------------------------------------------------
b'\r\n'
b'config,save,ok\r\n'
send_data----------------------------------------------------------------------------
read_data----------------------------------------------------------------------------
b'<a href="https://wappass.baidu.com/static/captcha/tuxing.html?&logid=12048830718417878884&ak=c27bbc89afca0463650ac9bde68ebe06&backurl=https%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3Dabc&ext=x9G9QDmMXq%2FNo87gjGO0P2lVgIV%2Bi0DK6z6hWPJSJoxSIPuPx9h9pmFSYtnJpM3ng1T9i%2F9aWxTqDk%2BHyX%'
end----------------------------------------------------------------------------
地址只有首次需要配置并绑定串口,后续只需要发送、接收数据即可,如下注释掉绑定串口代码。
# send_cmd('config,set,http,2,uart,0,www.baidu.com,80,/s?wd=,5,0,0,1,0,0')
# send_cmd('config,set,save')
# 等待设备重启结束
# time.sleep(10)
send_data("abc")
# 读取响应数据
read_data()
print('end----------------------------------------------------------------------------')
踩坑记录
只有命令指令uart.write()
才用追加\r\n
(回车换行),发送数据不需要加,否则会导致请求失败,无法接收到响应数据。
POST请求示例
代码如下,注意IP
,PORT
换成你自己服务的。
send_cmd('config,set,http,1,uart,1,http://IP,PORT,/,5,1,Content-Type=application/octet-stream/0d/0a,0,0,0')
send_cmd('config,set,save')
time.sleep(10)
send_data("body123")
# 读取缓冲区
read_data()
print('end----------------------------------------------------------------------------')
调试打印日志如下
MPY: soft reboot
send_cmd----------------------------------------------------------------------------
read_data----------------------------------------------------------------------------
b'\r\n'
b'config,http,ok\r\n'
send_cmd----------------------------------------------------------------------------
read_data----------------------------------------------------------------------------
b'\r\n'
b'config,save,ok\r\n'
send_data----------------------------------------------------------------------------
read_data----------------------------------------------------------------------------
b'200\r\n'
b'Access-Control-Allow-Origin: *\r\n'
b'Content-Length: 1\r\n'
b'Date: Thu, 07 Dec 2023 13:12:46 GMT\r\n'
b'Content-Type: text/html; charset=utf-8\r\n'
b'Server: Werkzeug/2.0.3 Python/3.6.8\r\n'
b'\r\n'
b'2200\r\n'
b'Access-Control-Allow-Origin: *\r\n'
b'Content-Length: 1\r\n'
b'Date: Thu, 07 Dec 2023 13:12:46 GMT\r\n'
b'Content-Type: text/htm'
end----------------------------------------------------------------------------