|
本帖最后由 huarui2219 于 2020-2-22 23:27 编辑
没玩过,arduino,打算试着琢磨下
以下是我查官网api 搞定的注释版本
[pre]//导入头文件
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
//创建可以发送和接收UDP消息的WiFi UDP类的命名实例。在基于AVR的板上,当前外发UDP数据包的大小限制为72个字节。对于非AVR板,限制为1446字节。
WiFiUDP Udp;
//定义一个IP地址对象
IPAddress maddr;
const char *serverip = "192.168.10.1";
//定义服务端端口
const int serverport = 8889;
//本地端口
const int localport = 1518;
//WIFI 用户名密码
const char *ssid = "TELLO-A99CC2";
const char *password = "";
char incomingPacket[255];
//定义一组指令字符串,2维数组,但只初始化了一维,第二维为15个空
// 不太懂这个 无人机指令,试着猜一下, takeoff: 起飞, up 50 :上升50公分?,down 50: 下降 50CM,flip b :翻转 啥是b呀,land : 着陆
const char movelist[][15] = {"takeoff", "up 50", "down 50", /*"cw 360","ccw 360","left 50","right 100","left 50","forward 50","back 100","forward 50",*/ "flip b", "land"};
//定义功能函数远程写入无人机指令,这里看起来是一个遥控器的代码
void udpWriteCmd(const char *cmd)
{
//启动连接以将UDP数据写入远程连接,这里是准备阶段
Udp.beginPacket(maddr, serverport);
//这一行才是写入命令
Udp.write(cmd, strlen(cmd));
//关闭连接
Udp.endPacket();
}
// 执行下一个动作
void doNextMove()
{
//定义静态变量,只会初始化一次,建议将此变量放到函数外部
static unsigned int idx = 0;
//判断指令集合是否为空
if (idx < sizeof(movelist) / sizeof(*movelist))
//根据顺序执行当前指令,并增加指令数组的索引号,下次进来将会执行下一个指令,注意一共定义了15个指令
udpWriteCmd(movelist[idx++]);
}
void setup()
{
//设定波特率
Serial.begin(115200);
//打印日志
Serial.println(F("Init"));
// put your setup code here, to run once:
//设定wifi模式,客户端
WiFi.mode(WIFI_STA);
//连接WIFI
WiFi.begin(ssid, password);
//循环检测连接状态,每500毫秒
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(F("."));
}
//输出连接成功
Serial.println(F(" connected"));
//在本地端口启动UDP广播
Udp.begin(localport);
//从字符串转换一个IP,并初始化 maddr 变量
maddr.fromString(serverip);
//写入指令 command
udpWriteCmd("command");
//等待100毫秒
delay(100);
//此时应 发送指令 takeoff
doNextMove();
}
//全局变量,用于保存上一次执行时间
unsigned long lasttick = 0;
//该方法循环执行
void loop()
{
// put your main code here, to run repeatedly:
//它开始处理下一个可用的传入数据包,检查UDP数据包的存在,并报告大小。在使用UDP.read()读取缓冲区之前,必须调用parsePacket()。
int packetSize = Udp.parsePacket();
//数据包的大小(以字节为单位)
// 如果没有数据包可用 : 0
if (packetSize)
{
//串口输出,用于PC端接收调试信息调试或是其他设备
Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
//UDP 接收数据,最多255字符
int len = Udp.read(incomingPacket, 255);
//判断是否收到
if (len > 0)
{
//如果收到,则将第一个位置写入0,C++ 字符串以0开头
incomingPacket[len] = 0;
}
//向串口输出日志
Serial.printf("UDP packet contents: %s\n", incomingPacket);
}
//此函数用于返回的Arduino板开始运行当前程序时的毫秒数
unsigned long thistick = millis();
//当前时间-(上一次执行时间+2秒)小于 4278190080 毫秒
if (thistick - (lasttick + 2000) < 0xff000000)
{
//执行下一个指令
doNextMove();
//更新上次执行时间为本次执行时间
lasttick = thistick;
}
}[/pre] |
|