本帖最后由 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使用的USB转TTL芯片是WCH公司的CH340芯片。没有驱动可以去其官网下载CH341驱动,安装即可!
注意事项:1. 供电电源功率应满足项目整体供电需求!!! 2. 合宙的烧录器可能无法满足为整个项目各个模块供电,建议项目模块请自行供电,各模块间共地即可; 3. 安信可模块默认波特率请参考各个模块手册!
常见问题:1. 硬件已经连接好但是Arduino串口没有反应? Arduino的串口通讯是使用的5V通讯电平,安信可的串口大多使用的是3.3V通讯电平,需要增加电平转换;
2. 若串口输出不正常,请调整Air001 的时钟频率进行尝试 Aruino IDE 工具 -> Clock Source and Frequency:-> HIS 24MHz,HCLK 48MHz
硬件连接:
1. 硬件接线应注意电平匹配! 2. 硬件接线还应注意串口通讯协议,无法仅使用TXD和RXD两条线进行通讯,需要最少在加上GND形成三线接法,才可以正常通讯。Vcc可以连接也可以不接,设备与模块可以各自单独供电。 3. 当串口电平不匹配时,可以使用如下模块进行转换 TXS0108EPWR是一款8位非反相转换器芯片,具有两个独立的可配置电源轨.A端口设计用于追踪VCCA.VCCA接受1.2至3.6V电源电压.B端口设计用于追踪VCCB.VCCB接受1.65至5.5V电源电压.这允许在任何1.2,1.5,1.8,2.5,3.3与5V电压节点之间进行低压双向转换.当输出启用(OE)输入为LOW时,所有输出均置于高阻状态.为确保上电或掉电时的高阻状态,OE应通过下拉电阻连接至GND,电阻的最小值由驱动器的电流源能力决定.
无需方向控制信号
60Mbps(推挽)与2Mbps(漏极开路)最高数据速率
A端口1.2至3.6V,B端口1.65至5.5V(VCCA<=VCCB)
无需电源排序-VCCA或VCCB可以首先进行斜坡
每JESD 78锁定性能超过100mA,II级
绿色产品,无Sb/Br
软件编程:我们要使用串口发送和接收AT命令,自然需要初始化串口; 由于Arduino 的USB串口使用的是默认的TX和RX接口,为了不影响烧录和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: //注:并非Mega和Mega 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: //并非Leonardo和Micro上的所有引脚都支持更改中断,因此只有以下内容可以用于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串口输出Hello,world? 并换行; } 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 24Mhz,HCLK 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() { } -----------------
有图有真相
-----------------------
附:Arduino 相关函数
equalsIgnoreCase()比较两个字符串的相等性。比较不区分大小写,这意味着字符串(“hello”)等于字符串(“HELLO”)。
substring()
获取字符串的子字符串。起始索引是包含的(相应的字符包含在子字符串中),但可选的结束索引是独占的(相应的字符不包含在子字符串中)。如果省略结束索引,则子字符串将继续到字符串的末尾。
|