esp32-cam模块micropython自制串口调试软件

 就这上面这个,从网上先后购了2套。其中一套模块和下载底座都有问题。
1.刷入arduino编译的例子CameraWebServer固件后镜头发热,不能成功运行。
2.底座始终处在下载模式。解决方法是从引脚的根上切断走线。幸好此引脚和GND挨着,需要下载时短接一下就行。
总结下来就是,此套模块印刷电路板质量不过关。
在确保CameraWebServer固件能正常运行后。刷入micropython,但我的这两块板thonny和cycraft都不能连接。只有普通的串口调试器可以连接。但手工上传下载文件非常麻烦。所以使用c#自制一个上传下载器。以下是所有代码,命令行就可编译。使用c#自带的串口,应该.net framwork 2.0以上都可编译成功。传输技巧就是:上传下载都使用base16编码。

using System;
using System.IO.Ports;
using System.Threading;
using System.IO;
class micropytools
{
    static bool _continue, _fflag;
    static int rflag;
    static SerialPort _serialPort;
    static String readbuf;
    static String help="Micropython file manager tool. 2023 v0.1\r\nCommands examples:\r\ndir \r\nget filename \r\nput filename \r\ndel filename\r\nType quit to exit\r\n";
    static void Main(string[] args)
    {
        string message;
        Thread readThread = new Thread(Read);
        if (args.Length == 0) {
            Console.Write("require a serial port number: \r\nexample: programname 5\r\n");
			return ;
        }
        _serialPort = new SerialPort();
        _serialPort.PortName = "COM"+args[0];
        _serialPort.BaudRate = 115200;
        _serialPort.Parity = Parity.None;
        _serialPort.DataBits = 8;
        _serialPort.StopBits = StopBits.One;
        _serialPort.Handshake = Handshake.None;

        _serialPort.ReadTimeout = 500;
        _serialPort.WriteTimeout = 500;

        _serialPort.Open();
        _continue = true;
        readThread.Start();
        _fflag = true;
        rflag = 0;
        //Console.Write(help);

        while (_continue)
        {
            message = Console.ReadLine();
            if (message.Equals("quit"))
            {
                _continue = false;
            }
            else if (message.Equals("help"))
            {
                Console.Write(help);
            }
            else if (message.StartsWith("put"))
            {
                String[] s = message.Split(new char[] { ' ' });
                if (s.Length == 2) putfile(s[1]);
            }
            else if (message.Equals("dir"))
            {
                _serialPort.Write("import os;os.listdir()\r\n");
            }
            else if (message.StartsWith("get"))
            {
                String[] s = message.Split(new char[] { ' ' });
                if (s.Length == 2)   getfile(s[1]);
            }
            else if (message.StartsWith("del"))
            {
                String[] s = message.Split(new char[] { ' ' });
                if(s.Length==2)
                    _serialPort.Write("import os;os.remove(\""+s[1]+"\")\r\n");
            }
            else
            {
                _serialPort.Write(message+"\r\n");

            }
        }
        readThread.Join();
        _serialPort.Close();
    }
    public static void Read()
    {
        while (_continue)
        {
            try
            {
                int ch = _serialPort.ReadByte();
                Console.Write((char)ch);
                if (_fflag == false)
                {
                    readbuf += (char)ch;
                    if ((char)ch == '\n')
                    {
                        rflag += 1;
                        if (rflag >= 2)
                        {
                            _fflag = true;
                            rflag = 0;
                        }
                    }
                }

            }
            catch (TimeoutException) { }
        }
    }
    public static void putfile(string path)
    {
        byte[] byteData = new byte[16];
        FileStream file = null;
        try
        {
            file = new FileStream(path, FileMode.Open);
            int icount;
            _serialPort.Write("f=open(\"" + path + "\",\"wb\")\r\n");
            while ((icount = file.Read(byteData, 0, 16)) > 0)
            {
                string s = "b'";
                for (int i = 0; i < icount; i++)
                {
                    s += "\\x" + String.Format("{0:X2}", byteData[i]);
                }
                s += "'";
                Thread.Sleep(100);
                _serialPort.Write("f.write(" + s + ")\r\n");
            }
            Thread.Sleep(100);
            _serialPort.Write("f.close()\r\n");
        }
        catch (Exception e)
        {
            Console.WriteLine("Read file Exception:{0}", e);
        }
        file.Close();
    }
    public static void getfile(string path)
    {
        byte[] byteData = new byte[16];
        FileStream file = null;
        try
        {
            file = new FileStream(path, FileMode.Create);
            _serialPort.Write("import ubinascii\r\n");
            _serialPort.Write("f=open(\"" + path + "\",\"rb\")\r\n");
            _serialPort.Write("binascii=ubinascii.hexlify(f.read())\r\n");
            Thread.Sleep(100);
            _fflag = false;
            readbuf = "";
            _serialPort.Write("print(binascii)\r\n");
            while (true) {
                Thread.Sleep(100);
                if (_fflag == true) break;
            }
            Thread.Sleep(100);
            _serialPort.Write("f.close()\r\n");
            Thread.Sleep(100);

            String[] st = readbuf.Split(new string[] { "\r\n" }, StringSplitOptions.None);
            Console.WriteLine(st.Length);
            foreach (String s in st)
            {
                if (s.StartsWith("b'")) {
                    string s2 = s.Substring(2, s.Length - 3);
                    Console.Write(s2);
                    _serialPort.Write("\r\n");
                    byte[] buf = new byte[s2.Length / 2];
                    for (int i = 0; i < s2.Length/2; i += 1)
                    {
                        buf[i]=Convert.ToByte(s2.Substring(i * 2, 2),16);
                    }
                    file.Write(buf, 0, buf.Length);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("File Exception:{0}", e);
        }
        file.Close();
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值