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

  • 相关阅读:
    jmeter(46) redis
    jmeter(45) tcp/ip协议
    Codeforces Round #538 (Div. 2)D(区间DP,思维)
    Codeforces Global Round 1D(DP,思维)
    Educational Codeforces Round 57D(DP,思维)
    UPC11073(DP,思维)
    Yahoo Progamming Contest 2019D(DP,思维)
    Atcoder Beginner Contest 118D(DP,完全背包,贪心)
    Xuzhou Winter Camp 1C(模拟)
    Educational Codeforces Round 57 (Rated for Div. 2)D(动态规划)
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/7534521.html
Copyright © 2011-2022 走看看