就这上面这个,从网上先后购了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();
}
}