查看: 1795|回复: 9

[原创] 【LPC51U68】3.UUCode

[复制链接]
  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 1480 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92793
    最后登录
    2024-4-29
    发表于 2019-12-12 09:44:52 | 显示全部楼层 |阅读模式
    本帖最后由 stm1024 于 2019-12-12 09:47 编辑

    仔细看手册就知道LPC51U68同样支持ISP。
    先说一下如何进入ISP。先按住SW2(ISP0)不松手,然后再按住RESET键,两个键都按下的情况下,先送RESET,过个1-2秒再松SW2,这个时候就进入了串口的ISP。
    如果打开串口调试助手,配置正确的话,发送“?”就可以看到ISP有回复“Synchronized”,然后再发送“OK”,ISP应答“OK”,表明同步完成。然后就可以按UUCode编码发送数据了。
    1.jpg
    为了完成串口的ISP,需要先实现UU编码的编码和解码。简单来说这个编码是将ASCII映射到ASCII的可打印区域,这样所有的原始字节流都可以通过此编码方式,用键盘敲出来后再解码,这种编码3个字节会变成4个字节,因此编码后膨胀了33%,解码方式就是反过来了。这个编码的说明见文档UART ISP的UU编码方式
    https://www.nxpic.org.cn/document/detail/index/id-14538
    有需要的可以自己去下载。
    如果需要做自己的ISP上位机程序,就需要实现此编码功能,这里给出的是实现代码。
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;

    4. namespace UUCoder
    5. {
    6.     public class UUCoder
    7.     {
    8.         public static string Encode(byte[] bytes)
    9.         {
    10.             int x = bytes.Length / 3;
    11.             byte[] b3 = new byte[3];
    12.             StringBuilder sb = new StringBuilder();
    13.             //第一个字符是UUCode长度
    14.             sb.Append((char)(bytes.Length + 0x20));

    15.             for (int i = 0; i < x; i++)
    16.             {
    17.                 b3[0] = bytes[i * 3];
    18.                 b3[1] = bytes[i * 3 + 1];
    19.                 b3[2] = bytes[i * 3 + 2];
    20.                 sb.Append(encode3(b3));
    21.             }

    22.             if (bytes.Length % 3 == 1)
    23.             {
    24.                 b3[0] = bytes[bytes.Length - 1];
    25.                 b3[1] = 0x00;
    26.                 b3[2] = 0x00;
    27.                 sb.Append(encode3(b3));
    28.             }
    29.             if (bytes.Length % 3 == 2)
    30.             {
    31.                 b3[0] = bytes[bytes.Length - 2];
    32.                 b3[1] = bytes[bytes.Length - 1];
    33.                 b3[2] = 0x00;
    34.                 sb.Append(encode3(b3));
    35.             }
    36.             //最后是回车+换行
    37.             return sb.ToString() + "\r\n";
    38.         }

    39.         public static byte[] Decode(string s)
    40.         {
    41.             int len = s[0] - 0x20;
    42.             s = s.Substring(1).Trim();
    43.             if (s.Length % 4 != 0)
    44.                 throw new Exception("UUCoder.Decode(string):Bad String.");
    45.             List<byte> ret = new List<byte>();
    46.             for (int i = 0; i < s.Length / 4; i++)
    47.             {
    48.                 ret.AddRange(decode4(s.Substring(4 * i, 4)));
    49.             }
    50.             while (ret.Count > len)
    51.                 ret.RemoveAt(ret.Count - 1);
    52.             return ret.ToArray();
    53.         }

    54.         private static string encode3(byte[] b3)
    55.         {
    56.             char[] ret = new char[4];
    57.             if(b3.Length!=3)
    58.             {
    59.                 throw new Exception("UUCoder:Error bytes Length");
    60.             }
    61.             ret[0] = (char)((b3[0] >> 2) + 0x20);
    62.             ret[1] = (char)((((b3[0] & 0x03) << 4) | (b3[1] >> 4)) + 0x20);
    63.             ret[2] = (char)((((b3[1] & 0x0f) << 2) | (b3[2] >> 6)) + 0x20);
    64.             ret[3] = (char)((b3[2] & 0x3f) + 0x20);
    65.             for (int i = 0; i < 4; i++)
    66.             {
    67.                 if (ret[i] == 0x20)
    68.                     ret[i] = (char)0x60;
    69.             }
    70.             return new string(ret);
    71.         }

    72.         private static byte[] decode4(string s4)
    73.         {

    74.             if (s4.Length != 4)
    75.             {
    76.                 throw new Exception("UUCoder:Error string Length");
    77.             }

    78.             byte[] b4 = Encoding.ASCII.GetBytes(s4);
    79.             for (int i = 0; i < 4; i++)
    80.             {
    81.                 if (b4[i] == 0x60)
    82.                     b4[i] = 0x00;
    83.                 else
    84.                     b4[i] -= 0x20;

    85.             }
    86.             byte[] b3 = new byte[3];
    87.             b3[0] = b4[0];
    88.             b3[0] <<= 2;
    89.             b3[0] |= (byte)((b4[1] >> 4) & 0x03);
    90.             b3[1] = (byte)(((b4[1] & 0x0f) << 4) | (b4[2] >> 2) & 0x0f);
    91.             b3[2] = (byte)(((b4[2] & 0x03) << 6) | b4[3]);
    92.             return b3;
    93.         }
    94.     }

    95. }
    复制代码
    测试代码:
    1. using System;
    2. using System.Runtime.InteropServices;
    3. namespace UUCoder
    4. {
    5.     class Program
    6.     {
    7.         [DllImport("Kernel32.dll")]
    8.         public static extern bool Beep(int frequency, int duration);

    9.         static byte[] GeneateRandomBytes(int cnt)
    10.         {
    11.             Random r = new Random(DateTime.Now.Millisecond);            
    12.             byte[] ret = new byte[cnt];
    13.             for (int i = 0; i < cnt; i++)
    14.                 ret[i] = (byte)r.Next(0x00, 0xff);
    15.             return ret;
    16.         }

    17.         static bool CompareBytes(byte[] b1,byte[] b2)
    18.         {
    19.             if (b1 == null && b2 == null)
    20.                 return true;
    21.             if (b1 != null && b2 == null)
    22.                 return false;
    23.             if (b2 != null && b1 == null)
    24.                 return false;

    25.             if (b1.Length != b2.Length)
    26.                 return false;
    27.             int xsum = 0;
    28.             for(int i=0;i<b1.Length;i++)
    29.             {
    30.                 xsum += b1[i] ^ b2[i];
    31.             }
    32.             if (xsum == 0)
    33.                 return true;
    34.             else
    35.                 return false;
    36.         }

    37.         static void Main(string[] args)
    38.         {
    39.             
    40.             for (int t=0;t<255;t++)
    41.             {
    42.                 byte[] b= GeneateRandomBytes(t);
    43.                 PrintBytes(b);
    44.                 string s = UUCoder.Encode(b);
    45.                 Console.Write(s);
    46.                 byte[] bd = UUCoder.Decode(s);
    47.                 PrintBytes(bd);
    48.                 if (CompareBytes(b, bd))
    49.                 {
    50.                     Console.WriteLine("Match!");                           
    51.                 }
    52.                 else
    53.                 {
    54.                     Console.WriteLine("Mismatch!");
    55.                     Beep(4000, 80);
    56.                 }               
    57.                 Console.WriteLine("==================================================");
    58.             }
    59.         }

    60.         static void PrintBytes(byte[] b)
    61.         {
    62.             for (int i = 0; i < b.Length; i++)
    63.                 Console.Write("0x" + b[i].ToString("X02") + " ");
    64.             Console.WriteLine();
    65.         }
    66.     }
    复制代码
    运行效果:
    2.jpg
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2019-12-12 11:42:35 | 显示全部楼层
    之前没有接触过UUcode,
    现在也主要使用Ymordem协议传输。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 1480 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92793
    最后登录
    2024-4-29
     楼主| 发表于 2021-11-17 16:07:47 | 显示全部楼层
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 1480 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92793
    最后登录
    2024-4-29
     楼主| 发表于 2021-11-17 16:07:52 | 显示全部楼层
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 1480 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92793
    最后登录
    2024-4-29
     楼主| 发表于 2021-11-17 16:07:56 | 显示全部楼层
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 1480 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92793
    最后登录
    2024-4-29
     楼主| 发表于 2021-11-17 16:07:59 | 显示全部楼层
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 1480 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92793
    最后登录
    2024-4-29
     楼主| 发表于 2021-11-17 16:08:01 | 显示全部楼层
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 1480 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92793
    最后登录
    2024-4-29
     楼主| 发表于 2021-11-17 16:08:03 | 显示全部楼层
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 1480 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92793
    最后登录
    2024-4-29
     楼主| 发表于 2021-11-17 16:08:04 | 显示全部楼层
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 1480 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92793
    最后登录
    2024-4-29
     楼主| 发表于 2021-11-17 16:08:07 | 显示全部楼层
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-30 08:47 , Processed in 0.135491 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表