|
发表于 2020-11-24 22:58:22
|
显示全部楼层
本帖最后由 hansdau 于 2020-11-24 23:10 编辑
给你个思路,可以上位机取汉字字模,网络直接传输字模数据,下位机直接显视就好,以节省单片机宝贵的硬件资源。 下面是用于生产环境的C#相关代码。请参考。
#region 下位机字模相关
public static string GetHZK12String(string Source)
{
if (Source!=null&&Source.Length<4&&Source.Length>0)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < Source.Count() ; i++)
{
//获取汉字的信息
sb.Append(GetHex(GetByte( Source.Substring(i,1))));
}
var s = sb.ToString();
return s.Substring(0, s.Length - 1);
}
else
{
var temp = "未实名";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < temp.Count(); i++)
{
//获取汉字的信息
sb.Append(GetHex(GetByte(temp.Substring(i, 1))));
}
var s = sb.ToString();
return s.Substring(0, s.Length - 1);
}
}
#region HZK12
private static byte[] GetByte(string s)
{
byte[] b_gbk = new byte[1];
// String ss = s.Substring(i, i + 1);
// Log.i("hzkTest--->>>", ss);
try
{
b_gbk = System.Text.Encoding.GetEncoding("GBK").GetBytes(s); //ss.getBytes("GBK");//必须转为GBK编码
//Log.i("hzkTest--->>>", "Length=" + b_gbk.length);
}
catch (Exception e)
{
throw e;
}
return b_gbk;
}
private static string GetHex(byte[] data)
{
int size = 12;//字模的size
int sum = (size * size / 8);
byte iHigh, iLow;
iHigh = data[1];
iLow = data[0];
// Log.i("hzkTest--->>>", "h=" + iHigh + ",l=" + iLow);
int IOffset;//偏移量
IOffset = (94 * (iLow - 161) + (iHigh - 161)) * 24;//+256防止byte值为负 汉字字模在字库中的偏移地址
//Log.i("hzkTest--->>>", "IOffset=" + IOffset);@"..\Data\test.txt"
byte[] iBuff;
using (FileStream cutFileStream = new FileStream(@"..\3PartyResource\HZK12", FileMode.Open))
{
//二进制读取器
using (BinaryReader cutFileReader = new BinaryReader(cutFileStream))
{
using (BinaryWriter tempWriter = new BinaryWriter(cutFileStream))
{
//cutBytes = cutFileReader.ReadBytes(1,2);
byte[] temp = cutFileReader.ReadBytes(IOffset);//先读取偏移量
iBuff = cutFileReader.ReadBytes(size * 2);
// CRC = OtherHelper.ToModbusCRC16(cutBytes, false);
tempWriter.Write(iBuff);
}
}
}
return getBinary(iBuff);
}
private static string getBinary(byte[] iBuff)
{
StringBuilder stringBuffer = new StringBuilder();
int i, j, k;
for (i = 0; i < 12; i++)
{
for (j = 0; j < 2; j++)
for (k = 0; k < 8; k++)
{
if ((iBuff[i * 2 + j] & (0x80 >> k)) >= 1)
{
stringBuffer.Append("1");
}
else
{
stringBuffer.Append("0");
}
}
}
// Log.i("hzkTest--->>>", stringBuffer.toString());
//把 0 1 按照共阴极逆向式列行式取码方式输出
return getRowLineReverseCode(stringBuffer);
}
private static string getRowLineReverseCode(StringBuilder sb)
{
//得到前8行16列 128个
String pre128 = sb.ToString().Substring(0, 128);
StringBuilder result = new StringBuilder();
// Log.i("hzkTest--->>>", "pre128--->>" + pre128);
//得到后4行16列 64个
String las128 = sb.ToString().Substring(128, 64);
// Log.i("hzkTest--->>>", "las128--->>" + las128);
//取出每16列的8个数据
for (int i = 0; i < 16; i++)
{
if (i < 12)
{
StringBuilder sb1 = new StringBuilder();
for (int j = 0; j < 128;)
{
String s = pre128.Substring(i + j, 1);
sb1.Append(s);
j += 16;
}
result.Append("0x" + (string.Format("{0:x}", Convert.ToInt32(sb1.ToString(), 2)).Length < 2 ? "0" + string.Format("{0:x}", Convert.ToInt32(sb1.ToString(), 2)) : string.Format("{0:x}", Convert.ToInt32(sb1.ToString(), 2))) + ",");
}
if (i < 12)
{
StringBuilder sb2 = new StringBuilder();
for (int j = 0; j < 64;)
{
String s = las128.Substring(i + j, 1);
sb2.Append(s);
j += 16;
}
result.Append("0x" + (string.Format("{0:x}", Convert.ToInt32(sb2.ToString() + "0000", 2)).Length < 2 ? "0" + string.Format("{0:x}", Convert.ToInt32(sb2.ToString() + "0000", 2)) : string.Format("{0:x}", Convert.ToInt32(sb2.ToString() + "0000", 2))) + ",");
}
}
return result.ToString();
}
#endregion |
|