Arduino 使用AT命令操作安信可模块入门

[复制链接]
查看1857 | 回复15 | 2023-10-18 14:34:11 | 显示全部楼层 |阅读模式
本帖最后由 ckdsx.cn 于 2023-10-20 09:26 编辑

Arduino 使用AT命令操作安信可模块入门
本来想以51使用AT命令操作安信可模块,作为本系列的第一篇。但是群里反应,大多是学员还是想简单的先把硬件用起来再说,所以将Arduino操作作为入门第一课。

由于安信可的各种模块大多是3.3V的通讯电平(相关知识请参阅后续章节),所用本次Arduino 所选用的硬件使用合宙的Air001,烧录器使用合宙配套的烧录器。

Arduino的开发软件安装请参考网上的各种教程。
Air001硬件使用请参考:https://wiki.luatos.com/chips/air001/Air001-Arduino.html
能顺利烧录Air001第一个Blink程序后,说明您已经有能力学习接下来的课程。若您未能完成,请参考之前课程及资料或联系大师兄远程指导!

友情提示:国内的Arduino使用的USBTTL芯片是WCH公司的CH340芯片。没有驱动可以去其官网下载CH341驱动,安装即可!

注意事项:
1. 供电电源功率应满足项目整体供电需求!!!
2. 合宙的烧录器可能无法满足为整个项目各个模块供电,建议项目模块请自行供电,各模块间共地即可;
3. 安信可模块默认波特率请参考各个模块手册!

常见问题:
1. 硬件已经连接好但是Arduino串口没有反应?
Arduino的串口通讯是使用的5V通讯电平,安信可的串口大多使用的是3.3V通讯电平,需要增加电平转换;

2. 若串口输出不正常,请调整Air001 的时钟频率进行尝试
Aruino IDE 工具 -> Clock Source and Frequency-> HIS 24MHzHCLK 48MHz


硬件连接:
无标题.png 图片1.jpg

1. 硬件接线应注意电平匹配!
2. 硬件接线还应注意串口通讯协议,无法仅使用TXDRXD两条线进行通讯,需要最少在加上GND形成三线接法,才可以正常通讯。Vcc可以连接也可以不接,设备与模块可以各自单独供电。
3. 当串口电平不匹配时,可以使用如下模块进行转换
TXS0108EPWR是一款8位非反相转换器芯片,具有两个独立的可配置电源轨.A端口设计用于追踪VCCA.VCCA接受1.23.6V电源电压.B端口设计用于追踪VCCB.VCCB接受1.655.5V电源电压.这允许在任何1.21.51.82.53.35V电压节点之间进行低压双向转换.当输出启用(OE)输入为LOW时,所有输出均置于高阻状态.为确保上电或掉电时的高阻状态,OE应通过下拉电阻连接至GND,电阻的最小值由驱动器的电流源能力决定.

图片2.png

无需方向控制信号
60Mbps(推挽)2Mbps(漏极开路)最高数据速率
A端口1.23.6VB端口1.655.5V(VCCA<=VCCB)
无需电源排序-VCCAVCCB可以首先进行斜坡
JESD 78锁定性能超过100mAII
绿色产品,无Sb/Br
软件编程:
我们要使用串口发送和接收AT命令,自然需要初始化串口;
由于Arduino USB串口使用的是默认的TXRX接口,为了不影响烧录和Arduino 与上位机进行通讯,我个人建议使用软串口方式( SoftwareSerial )扩展出另一组串口,用来与安信可模块进行通讯。

软件模拟多串口收发实例:
示例使用 SoftwareSerialExample 代码解释如下:
-----------------------------------------------------------------------------------------------
/*Software serial multple serial test  //软件串行多路串行测试
Receives from the hardware serial, sends to software serial.  //从硬件串行接收,发送到软件串行
Receives from software serial, sends to hardware serial.     //从软件串行接收,发送到硬件串行
The circuit:  //电路
* RX is digital pin 10 (connect to TX of other device)  //*RX是数字引脚10(连接到其他设备的TX
* TX is digital pin 11 (connect to RX of other device)  //*TX是数字引脚11(连接到其他设备的RX
Note: Not all pins on the Mega and Mega 2560 support change interrupts,so only the following can be used for RX:
//注:并非MegaMega 2560上的所有引脚都支持更改中断,因此只有以下内容可以用于RX
10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
//Not all pins on the Leonardo and Micro support change interrupts, so only the following can be used for RX:
//并非LeonardoMicro上的所有引脚都支持更改中断,因此只有以下内容可以用于RX
8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

#include <SoftwareSerial.h>  //使用软件串口需要引入的头文件;
SoftwareSerial mySerial(10, 11); // 设置mySerial 串口的引脚为RX=10 TX=11
void setup() {  //初始化函数
  // Open serial communications and wait for port to open:
//打开串行通信并等待端口打开:
  Serial.begin(57600);   //设置默认的USB串口波特率为57600
  while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
//等待串行端口连接。仅本机USB端口需要
  }
  Serial.println("Goodnight moon!");  //USB串口输出Goodnight moon!并换行; // set the data rate for the SoftwareSerial port 设置软件串行端口的数据速率
mySerial.begin(4800);  //设置mySerial串口的波特率为4800
  mySerial.println("Hello, world?");  //mySerial串口输出Helloworld? 并换行;
}
void loop() { // run over and over  循环运行函数
  if (mySerial.available()) {       //如果串口mySerial 有接收到数据
    Serial.write(mySerial.read());  //USB串口输出mySerial 接收到数据
  }
  if (Serial.available()) {         //如果USB串口有接收到数据
    mySerial.write(Serial.read()); //则串口mySerial 输出 USB接收到数据
  }
}

AT命令测试实例:
-----------------------------------------------------------------------------------------------
/*本程序硬件采用 Air001 ;主要功能是通过Arduino软件模拟的串口发送AT命令,并接收AT命令返回值;
  程序会判断返回值,根据判断结果做出预设处理;两个串口的波特率请自行尝试最优组合;
  若串口持续输出乱码,建议将 Air001 时钟频率设置为 HIS 24MhzHCLK 48MHz ;

使用说明:本程序只会自动执行一遍,若要重复执行,请按 Air001 RST 按钮;

电路连接RX2 = PA0 TX2 = PA1 ;接模块串口,同时连接 Gnd ; RX1 = PA3 TX1 = PA2 ; 接烧录器连接至电脑
*/
#include <SoftwareSerial.h>
SoftwareSerial mySerial(PA0, PA1); // RX2, TX2
void setup() {
  Serial.begin(115200); //usb串口设置波特率
  while (!Serial) {  //本函数在实际应用中可以按需省略
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.println("Air001 AT Command Demo");
  mySerial.begin(9600); //软件模拟串口设置波特率
  int a = AT_send("AT\r\n");  //定义一个整形变量 a AT_send 函数的返回值赋给 a
  Serial.println(a);   //串口打印出 a 并换行
  Serial.println("END");  //串口打印出 END 并换行,用于明确程序运行到哪里
}

char AT_send(char *data){  //根据AT命令,自定义的函数
  String command = "";   //定义一个字符串类型的名为 command 的变量
  mySerial.print(data);  //串口输出命令字符串
  int x = 0;  //定义一个整形变量并初始化为0,用于循环计数        
  while(x<200){  //x小于200时程序一直循环
    while (mySerial.available()) { //当软件模拟串口有数据时循环接收
      command += (char)mySerial.read();  //将接收到的格式化数据为字符后依次存入变量command
    }
    delay(10);  //延时10毫秒
    x++; //计数变量自增1
  }
  Serial.print("DATA:"); //usb串口打印字符串DATA
  Serial.println(command); //打印变量command
  if(String("OK\r\n").equals(command)){  //判断 返回值command 是否全等于OK\r\n
    Serial.println("执行成功");  //等于,打印执行成功 换行
       return (1); //函数返回0
  }
  else {
    Serial.println("执行失败");  //不等于,打印执行失败 换行
    return (0); //函数返回0
  }
  return (2); //函数返回2
}
void loop() { }
-----------------
有图有真相
1607884073.jpg


-----------------------
附:Arduino 相关函数
equalsIgnoreCase()比较两个字符串的相等性。比较不区分大小写,这意味着字符串(“hello”)等于字符串(“HELLO”)。



substring()
获取字符串的子字符串。起始索引是包含的(相应的字符包含在子字符串中),但可选的结束索引是独占的(相应的字符不包含在子字符串中)。如果省略结束索引,则子字符串将继续到字符串的末尾。




回复

使用道具 举报

爱笑 | 2023-10-18 15:20:29 | 显示全部楼层
打卡学习~辛苦老师
用心做好保姆工作
回复 支持 反对

使用道具 举报

cainia | 2023-10-18 15:25:14 | 显示全部楼层
学习
回复

使用道具 举报

ckdsx.cn | 2023-10-18 16:19:43 | 显示全部楼层
爱笑 发表于 2023-10-18 15:20
打卡学习~辛苦老师

主要还是狗哥和妖哥,一起帮忙!愿意一起讨论!
回复 支持 反对

使用道具 举报

妖猊 | 2023-10-18 19:33:38 | 显示全部楼层
学习
回复

使用道具 举报

iiv | 2023-10-18 21:22:10 | 显示全部楼层
点赞
回复

使用道具 举报

jkernet | 2023-10-18 21:49:45 | 显示全部楼层
学习打卡
回复

使用道具 举报

WangChong | 2023-10-18 23:42:40 | 显示全部楼层
应该把AT指令定义成宏,方便调用
回复 支持 反对

使用道具 举报

ckdsx.cn | 2023-10-19 09:10:31 | 显示全部楼层
WangChong 发表于 2023-10-18 23:42
应该把AT指令定义成宏,方便调用

第一步有人还不会,不过你要是觉得可以更快捷的方法完成,期待你的分享帖子!
我这只是带入门,欢迎百家齐放!
回复 支持 反对

使用道具 举报

ckdsx.cn | 2023-10-19 09:11:41 | 显示全部楼层
WangChong 发表于 2023-10-18 23:42
应该把AT指令定义成宏,方便调用

我这就是个砖头,你加油!期待马上看到你的帖子!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则