zoukankan      html  css  js  c++  java
  • 八,ESP8266 文件保存数据(基于Lua脚本语言)

    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[6];
                sendbyte[0] = (byte)'+';//2B
                sendbyte[1] = (byte)'+';
                sendbyte[2] = (byte)'M';//4D
                sendbyte[3] = (byte)'D';//44
                sendbyte[4] = (byte)'0';//0
    
                if (radioButton5.Checked)
                {
                    sendbyte[5] = (byte)'0';
                }
                else if (radioButton6.Checked)
                {
                    sendbyte[5] = (byte)'1';
                }
                else if (radioButton7.Checked)
                {
                    sendbyte[5] = (byte)'2';
                }
                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,6,6))--MODE
                        print("MODE="..string.sub(data,6,6))
                        file.close()
                    else
                        print("open mode.lua faild")    
                    end

     

    注意

    if  file.open("mode.lua", "w+") then
        file.writeline("123")
        file.flush()//连续写最好加上
        file.writeline("456")
        file.flush()
        file.writeline("789")
        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 "

    s2 ="456 "

    s3 ="789 "

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

    if  file.open("mode.lua", "r") then
        local Mode = file.readline()
        if  Mode == nil then
            Mode="2"
        end
        if  Mode:byte(1) == 48 then
            print("Wifi MODE: SOFTAP")
            wifi.setmode(wifi.SOFTAP)
        elseif  Mode:byte(1) == 49 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(4,gpio.OUTPUT)
    gpio.mode(2,gpio.OUTPUT)
    gpio.write(4,1)
    
    if  adc.force_init_mode(adc.INIT_ADC) then
        node.restart()
        return
    end
    
    tmr.alarm(0, 1000, 1, function()
        gpio.write(4,1-gpio.read(4))
    end)
    
    tmr.alarm(1, 5000, 0, 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="2"
        end
        if  Mode:byte(1) == 48 then
            print("Wifi MODE: SOFTAP")
            wifi.setmode(wifi.SOFTAP)
        elseif  Mode:byte(1) == 49 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="11223344"
    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="11223344"
    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(1)
    
    ConnectIP = "192.168.1.103"
    ConnectPort = 8080
    
    UdpSocket = net.createUDPSocket()   
    UdpSocket:listen(ConnectPort)
    
    
    
    UdpSocketTable={}
    UdpIPTable={}
    UdpPortTable={}
    UdpConnectCnt = 0
    UdpCanConnect = 0
    
    UdpSocket:on("receive", function(socket, data, port, ip)
        UdpCanConnect = 1
        for i=0,2 do
            if  UdpIPTable[i] == ip and UdpPortTable[i] == port  then
                UdpCanConnect = 0
            end
        end
    
        if  ip == ConnectIP and port == ConnectPort  then
            UdpCanConnect = 0
        end
    
        if  UdpCanConnect == 1 then
            UdpSocketTable[UdpConnectCnt] = socket
            UdpIPTable[UdpConnectCnt] = ip 
            UdpPortTable[UdpConnectCnt] = port
            print("
    "..UdpConnectCnt.."-Connect")
            UdpConnectCnt = UdpConnectCnt + 1
        end
        
        if  UdpConnectCnt == 3 then
            UdpConnectCnt = 0
        end
        uart.write(0,data)
    end)
    
    
    UartReadCnt=0
    UartReadCntCopy=0
    UartReadData=""
    UartReadDataCopy=""
    
    
    uart.on("data",0,function(data) 
        UartReadCnt = UartReadCnt + 1
        UartReadData = UartReadData..data
            
    end, 0)
    
    
    
    tmr.alarm(2, 5, 1, function()
        if  UartReadCnt ~=0 then
            if  UartReadCnt == UartReadCntCopy  then
                UartReadCnt = 0
                UartReadCntCopy = 0
                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=0,2 do
            if  UdpSocketTable[i] ~= nil then
                UdpSocketTable[i]:send(UdpPortTable[i],UdpIPTable[i],data) 
            end
        end
    end
    
    
    
    printip = 0
    wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
        printip = 0
    end)
    
    
    wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
       if printip == 0 then
          print("+IP"..T.IP)
       end
       printip = 1
    end)

    file.lua

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

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

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

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

     复位重启一下

     

     

     

     

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

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

    完了一个大的心思

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

  • 相关阅读:
    在C++中,子类重载一个操作符时,如何调用父类被重载的操作符函数
    基于AT89C51单片机的贪吃蛇电子游戏(仿真)
    七种机器内部排序的原理与C语言实现,并计算它们的比较次数与移动次数。
    使用java反射机制编写Student类并保存
    SqlServer2012导入Oracle详细案例
    TableLayoutPanel 的使用
    windows 10 & Office 2016 安装
    用过的手机集合
    windows 7 语言切换 Vistalizator
    ALV报表的颜色设计(行、列、单元格)
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/7534521.html
Copyright © 2011-2022 走看看