https://www.cnblogs.com/yangfengwu/p/7533845.html

应该是LUA介绍8266的最后一篇,,,,,,下回是直接用SDK,,然后再列个12345.......不过要等一两个星期,先忙完朋友的事情

前面几篇

用AT指令版本的

一,  http://www.cnblogs.com/yangfengwu/p/5205570.html    发AT指令,,其实AT指令就是事先用SDK内部写好了

二,  http://www.cnblogs.com/yangfengwu/p/5295632.html    这个呢是配合路由器实现远程,,其实可以买个域名,或者用云端

三,  http://www.cnblogs.com/yangfengwu/p/5220919.html   这是做了一个用手机控制的WIFI小车

四,  http://www.cnblogs.com/yangfengwu/p/5212570.html    Android TCP客户端

五,  http://www.cnblogs.com/yangfengwu/p/5294921.html    Android TCP服务器

用LUA语言的,更灵活,功能更强

一   http://www.cnblogs.com/yangfengwu/p/7514336.html      下载自己选择功能的固件,刷固件,写LUA的软件

二   http://www.cnblogs.com/yangfengwu/p/7520260.html     GPIO,串口,注意事项,空闲中断

三    http://www.cnblogs.com/yangfengwu/p/7524297.html      SPI通信介绍,,STM32 SPI 从机

四    http://www.cnblogs.com/yangfengwu/p/7524326.html      TCP服务器,单个连接

五    http://www.cnblogs.com/yangfengwu/p/7531730.html      TCP服务器,多个客户端连接,CRC校验

六    http://www.cnblogs.com/yangfengwu/p/7533302.html       TCP Client 断开自动重连,AD采集

七    http://www.cnblogs.com/yangfengwu/p/7533845.html      UDP支持一路默认,3路动态连接,ssid 与 pwd 的读取

还缺一样....这篇...保存数据...这样的话就可以随意修改启动时工作在哪一种模式,哪一种通信,以及其余需要保存在模块内部的信息

就实现上位机软件的第一个功能,,修改启动模式

自己的上位机按钮事件

private void button2_Click(object sender, EventArgs e)
{
byte[] sendbyte = new byte[];
sendbyte[] = (byte)'+';//2B
sendbyte[] = (byte)'+';
sendbyte[] = (byte)'M';//4D
sendbyte[] = (byte)'D';//
sendbyte[] = (byte)'';// if (radioButton5.Checked)
{
sendbyte[] = (byte)'';
}
else if (radioButton6.Checked)
{
sendbyte[] = (byte)'';
}
else if (radioButton7.Checked)
{
sendbyte[] = (byte)'';
}
if (radioButtonNetCon.Checked)
{
TcpSendDataMethod(sendbyte);
}
else if (radioButtonSerialCon.Checked)
{
SerialSend(sendbyte);
}
}

++MD00                 AP模式

++MD01                Station模式

++MD00                AP+Station模式

其实最后还有CRC16校验码

看文件操作

if  file.open("mode.lua", "w+") then
file.writeline(string.sub(data,,))--MODE
print("MODE="..string.sub(data,,))
file.close()
else
print("open mode.lua faild")
end

注意

if  file.open("mode.lua", "w+") then
file.writeline("")
file.flush()//连续写最好加上
file.writeline("")
file.flush()
file.writeline("")
file.close()
else
print("open mode.lua faild")
end

像是这样  mode.lua文件里面会是这样

那么读的时候

file.open("mode.lua", "r") then
s1= file.readline()
s2= file.readline()
s3= file.readline()
file.close()
end

s1 ="123\r"

s2 ="456\r"

s3 ="789\r"

所以写进去一行3个但是读出来会多加一个换行符

if  file.open("mode.lua", "r") then
local Mode = file.readline()
if Mode == nil then
Mode=""
end
if Mode:byte() == then
print("Wifi MODE: SOFTAP")
wifi.setmode(wifi.SOFTAP)
elseif Mode:byte() == then
print("Wifi MODE: STATION")
wifi.setmode(wifi.STATION)
else
print("Wifi MODE: STATIONAP")
wifi.setmode(wifi.STATIONAP)
end
file.close()
end

直接上源码吧

init.lua

gpio.mode(,gpio.OUTPUT)
gpio.mode(,gpio.OUTPUT)
gpio.write(,) if adc.force_init_mode(adc.INIT_ADC) then
node.restart()
return
end tmr.alarm(, , , function()
gpio.write(,-gpio.read())
end) tmr.alarm(, , , function()
dofile("file.lua")
dofile("UDP.lua")
end)

UDP.lua

if  file.open("mode.lua", "r") then
local Mode = file.readline()
if Mode == nil then
Mode=""
end
if Mode:byte() == then
print("Wifi MODE: SOFTAP")
wifi.setmode(wifi.SOFTAP)
elseif Mode:byte() == then
print("Wifi MODE: STATION")
wifi.setmode(wifi.STATION)
else
print("Wifi MODE: STATIONAP")
wifi.setmode(wifi.STATIONAP)
end
file.close()
end cfg={}
cfg = wifi.ap.getconfig(true)
if cfg.ssid == nil then
cfg.ssid="Hellow8266"
cfg.pwd=""
end print("APssid: "..cfg.ssid)
if cfg.pwd == nil then
print("APpwd: nil")
else
print("APpwd: "..cfg.pwd)
end
cfg.save=true
wifi.ap.config(cfg) apcfg={}
apcfg = wifi.sta.getconfig(true) if apcfg.ssid == nil then
apcfg.ssid="qqqqq"
apcfg.pwd=""
end print("APssid: "..apcfg.ssid)
if apcfg.pwd == nil then
print("Stationpwd: nil")
else
print("Stationpwd: "..apcfg.pwd)
end apcfg.save=true
wifi.sta.config(apcfg)
wifi.sta.autoconnect() ConnectIP = "192.168.1.103"
ConnectPort = UdpSocket = net.createUDPSocket()
UdpSocket:listen(ConnectPort) UdpSocketTable={}
UdpIPTable={}
UdpPortTable={}
UdpConnectCnt =
UdpCanConnect = UdpSocket:on("receive", function(socket, data, port, ip)
UdpCanConnect =
for i=, do
if UdpIPTable[i] == ip and UdpPortTable[i] == port then
UdpCanConnect =
end
end if ip == ConnectIP and port == ConnectPort then
UdpCanConnect =
end if UdpCanConnect == then
UdpSocketTable[UdpConnectCnt] = socket
UdpIPTable[UdpConnectCnt] = ip
UdpPortTable[UdpConnectCnt] = port
print("\r\n"..UdpConnectCnt.."-Connect")
UdpConnectCnt = UdpConnectCnt +
end if UdpConnectCnt == then
UdpConnectCnt =
end
uart.write(,data)
end) UartReadCnt=
UartReadCntCopy=
UartReadData=""
UartReadDataCopy="" uart.on("data",,function(data)
UartReadCnt = UartReadCnt +
UartReadData = UartReadData..data end, ) tmr.alarm(, , , function()
if UartReadCnt ~= then
if UartReadCnt == UartReadCntCopy then
UartReadCnt =
UartReadCntCopy =
UartReadDataCopy = UartReadData
UartReadData=""
Config(UartReadDataCopy)
NetSend(UartReadDataCopy)
else
UartReadCntCopy = UartReadCnt
end
end end) function NetSend(data)
if UdpSocket ~= nil then
UdpSocket:send(ConnectPort,ConnectIP,data)
end for i=, do
if UdpSocketTable[i] ~= nil then
UdpSocketTable[i]:send(UdpPortTable[i],UdpIPTable[i],data)
end
end
end printip =
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
printip =
end) wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
if printip == then
print("+IP"..T.IP)
end
printip =
end)

file.lua

就是接收串口的数据函数,检测CRC对不对,,然后把数据写进mode.lua,,,对了这样设置了,,内部会自动生成一个mode.lua,,不用自己弄

function Config(data)
local RevLen = string.len (data)
local crc = ow.crc16(string.sub(data,,RevLen-)) local recrc = data:byte(RevLen)
recrc = recrc*
recrc = recrc + data:byte(RevLen-) if crc == recrc then
--[[ Mode ]]
if RevLen == then
if string.sub(data,,) == "++MD0" then----Mode
if file.open("mode.lua", "w+") then
file.writeline(string.sub(data,,))--MODE
print("MODE="..string.sub(data,,))
file.close()
else
print("open mode.lua faild")
end
end--[[ Mode ]]
end end
end

其实也没有说的了,串口用空闲中断接收的,前面说了,,,,剩下的主要是自己看着API文档自己测试测试哈

现在把程序下进去用上位机试一试修改模式

复位重启一下

对了我把UDP的修改了一个地方,,,写的太着急写错了,

这样才是判断是新的连接,而且不和默认的一样才执行后面的

完了一个大的心思

https://www.cnblogs.com/yangfengwu/p/9749008.html

八,ESP8266 文件保存数据(基于Lua脚本语言)的更多相关文章

  1. ESP8266使用详解--基于Lua脚本语言

    这些天,,,,今天终于看到了希望,,,天道酬勤 先说实现的功能...让ESP8266连接无线网,然后让它建立服务器,,我的客户端连接上以后,发给客户端发数据模块打印到串口,,往ESP8266串口里发数 ...

  2. 八,ESP8266 文件保存数据

    应该是LUA介绍8266的最后一篇,,,,,,下回是直接用SDK,,然后再列个12345.......不过要等一两个星期,先忙完朋友的事情 前面几篇 用AT指令版本的 一,  http://www.c ...

  3. 一,ESP8266下载和刷固件(基于Lua脚本语言)

    用自己的小板测试...... 安排上呢 一, ESP8266下载和刷固件(Lua开发----体验一下lua开发的魅力所在) 二, 控制一个灯亮灭 三, TCP服务器 四, TCP客户端 五, UDP ...

  4. 二,ESP8266 GPIO和SPI和定时器和串口(基于Lua脚本语言)

    https://www.cnblogs.com/yangfengwu/p/7514336.html 我们写lua用这个软件 如果点击的时候提示安装,,安装就行,,如果没有提示呢可以,按照下面链接的提示 ...

  5. 四,ESP8266 TCP服务器(基于Lua脚本语言)

    我要赶时间赶紧写完所有的内容....朋友的东西答应的还没做完呢!!!!!!!没想到又来了新的事情,,....... 配置模块作为TCP服务器然后呢咱们连接服务器发指令控制LED亮灭 控制的指令呢咱就配 ...

  6. 三,ESP8266 SPI(基于Lua脚本语言)

    https://www.cnblogs.com/yangfengwu/p/7520260.html 重点是说SPI通信协议,,,, 不要害怕协议因为协议是人规定的,,刚好我也是人......规定的协议 ...

  7. 五,ESP8266 TCP服务器多连接(基于Lua脚本语言)

    https://www.cnblogs.com/yangfengwu/p/7524326.html 一些时间去准备朋友的元器件了... 接着写,,争取今天写完所有的文章,,因为答应了朋友下周5之前要做 ...

  8. 六,ESP8266 TCP Client(基于Lua脚本语言)

    今天不知道是不是让我姐挺失望.......很多时候都不知道自己努力的方向对不对,,以后能不能带给家人最美好的期盼...... Init.lua 没啥改变,,就改了一下加载Client.lua gpio ...

  9. 九,ESP8266 判断是断电上电(强制硬件复位)之后运行的内部程序还是内部软件复位之后运行的程序(基于Lua脚本语言)

    现在我有一个需求,WIFI模块控制一个继电器,我要做的是如果内部程序跑乱了,造成了内部程序复位重启,那么控制继电器的状态不能改变 如果是设备断电了,然后又来电了,我需要的是继电器一定要是断开才好.不能 ...

随机推荐

  1. vue-resource获取不了数据,和ajax的区别,及vue-resource用法

    前几天用vue-resource调用接口,用post方式给后端,发现后端php接受不到数据,这好奇怪,最后发现提交给后端的时候 需要加一个参数 就是:emulateJSON : true 这句话的意思 ...

  2. luogu P4108 [HEOI2015]公约数数列——solution

    -by luogu 不会啊.... 然后%了一发题解, 关键是 考虑序列{$a_n$}的前缀gcd序列, 它是单调不升的,且最多只会改变$log_2N$次,因为每变一次至少除2 于是,当我们询问x时: ...

  3. SD从零开始41-44

    [原创] SD从零开始41 科目确定(Account determination) 使用科目确定Using Account Determination 你将需要在几个不同的领域确定将要记账的科目: 用 ...

  4. 语义slam用于高精地图和高精定位的一些想法

    最近一直在考虑语义slam在自动驾驶和辅助驾驶中的用法,研究了一下视觉为主的高精度地图+高精定位的模式,特别是mobileye的REM. 秉承先建图再定位的思路,在服务器端(云端)建图,在车端定位. ...

  5. AutoCompleteTextView 自定义提示样式

    项目中用到AutoCompleteTextView  自动提示功能,如果用自带的ArrayAdapter就一种样式,非常丑,而且每一项提示文字过多的话不会自动换行. 所以自己自定义了一个适配器. 效果 ...

  6. RecyclerView打造通用的万能Adapter

    既然想做到通用那么现在摆在面前的就三个问题:数据怎么办?布局怎么办? 绑定怎么办?.数据决定采用泛型,布局打算直接构造传递,绑定显示效果肯定就只能回传. 1 基本改造 数据决定采用泛型,布局打算直接构 ...

  7. Python实现屏幕截图的两种方式

    Python实现屏幕截图的两种方式 使用windows API 使用PIL中的ImageGrab模块 下面对两者的特点和用法进行详细解释. 一.Python调用windows API实现屏幕截图 好处 ...

  8. ChatOps如何变革企业业务

    [编者按]本文作者为日志分析软件公司 Logz.io 的联合创始人 Tomer Levy,主要介绍 ChatOps 的特点与发展历程,以及将来可能带来的业务变革.文章系国内 ITOM 管理平台 One ...

  9. She Left Her Shoes

    She left her shoes, she took everything else, her toothbrush, her clothes, and even that stupid litt ...

  10. python容错

    #try: except: else: #为什么叫容错呢,先说说错误,这里说的错误并不是因为马虎或者什么原因在脚本中留下的bug,这个不能容掉,所谓容掉就是略过这个错误,要在测试时候发现并修正,需要容 ...