arduino对接UsartGPU35c,显示中文

 

在网上买的这个串口屏叫UsartGPU35c,这与其他屏幕相比,

1、是TFT彩屏

2、IO用的少,只要两个RX、TX

3、内存占用少,因为屏幕自带一个单片机,所以你只需传指令就行了,不像其他TFT彩屏,每个点都要数据传进去,这导致很多低性能的单片机根本维持不了

 

我所用的板子是这块,安信可的nodemcu-32s,开发模式是arduino

连接方式很简单,这四个脚连接即可,屏幕是5V供电,RX接对方的TX,反之一样

 

显示的中文

 

我这块屏幕显示的是人名,所以无法准备好字模,只能调用已有字库,但屏幕字库中文只支持gb2312,arduino编辑器上的中文全是utf-8的,所以arduino直接传送中文,是显示乱码的(数字和英文、符号都不受影响)。

解决方案是arduino连接服务器,中文直接在服务器上转为gb2312数字,然后传送给屏幕,即可实现。

 

服务端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Index : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {


        string _str = GetHexFromChs("我站在方山顶上");       //将文字转为二进制代码

        Response.Write(_str);
    }



    public static string GetHexFromChs(string s)
    {
        if ((s.Length % 2) != 0)
        {
            s += " ";//空格
                     //throw new ArgumentException("s is not valid chinese string!");
        }

        System.Text.Encoding chs = System.Text.Encoding.GetEncoding("gb2312");

        byte[] bytes = chs.GetBytes(s);

        string str = "";

        for (int i = 0; i < bytes.Length; i++)
        {
            str += string.Format("{0:X}", bytes[i]);
        }

        return str;
    }
}

得到的是这么个东西

接下来在arduino上

创建一个 MyHex_String.cpp


#include "MyHex_String.h"
 
unsigned char MyHex_String::Hex0(char ch)
{
  {
    static const char* hex = "0123456789ABCDEF";
    for (unsigned char i = 0; i != 16; ++i)
      if (ch == hex[i])
        return i;
    return 0;
  }
}

char* MyHex_String::solve(char* dest, const char* src)
{
  {
    int i = 0;
    int cnt = 0;
    unsigned char* d = (unsigned char*)dest;
    while (*src)
    {
      if (i & 1)
      {
        d[cnt++] |= Hex0(*src);
      }
      else
      {
        d[cnt] = Hex0(*src) << 4;
      }
      src++;
      i++;
    }
    return dest;
  }
}

 

创建一个 MyHex_String.h


#ifndef MyHex_String_h
#define MyHex_String_h

#if defined(ARDUINO) && (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif

#define MyHex_String_VERSION "0.4.1"

#define MyHex_String_OK                               0
#define MyHex_String_ERROR_CHECKSUM   -1
#define MyHex_String_ERROR_TIMEOUT    -2

class MyHex_String
{
public:
  unsigned char Hex0(char ch);
  char* solve(char* dest, const char* src);

};

#endif

 


#include <WiFi.h>
#include <HTTPClient.h>
#include <RSCG12864B.h>
#include "MyHex_String.h"
 MyHex_String  MyHex;//创建对象
HTTPClient http;

#ifndef STASSID


#define STASSID "xxxx4321"
#define STAPSK  "yyyy4321"

#endif


const char* ssid     = STASSID;
const char* password = STAPSK;

WiFiClient client;

int state=0;

int pin0=0;

void setup()
{
   Serial.begin(115200);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  WifiInit();

  pinMode(pin0,OUTPUT);

  digitalWrite(pin0,HIGH);
}
 
void loop()
{

  if(digitalRead(pin0)==state)
  {
    state=!digitalRead(pin0);

String zi= "";



String webstr=GetWeb();

  char dest[100] = { 0 }; 
  


 char  src[webstr.length()+1];
 webstr.toCharArray(src,webstr.length() + 1);
zi=MyHex.solve(dest, src);

 

  Serial.println("CLS(0);");
  Serial.println( "DS16(20,30,'"+zi+"',4);");//输出转换结果




  delay(2000);
    
  }
  
}

void WifiInit()
{
  
  
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      
    }
  


}



String GetWeb()
{
  
    http.begin("http://192.168.2.8:29000/Index.aspx?FName=8as丰立");


        int httpCode =  http.GET(); 

        Serial.println(httpCode);

        if(httpCode == 200) { // 访问成功,取得返回参数
      String payload = http.getString();
     

      return payload;


  } else { // 访问不成功,打印原因
     String payload = http.getString();
     Serial.print("context:");
     Serial.println(payload);

     return payload;
  }


}
sql 转GB2312

0xCED2D5BED4DAB7BDC9BDB6A5C9CF

SELECT CAST('我站在方山顶上' AS VARBINARY) AS [GB2312];   

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
现在市面上的显示器,大多数是由数码管构成的,最大的不方便之处就是显示信息量太小,只能一个一个的将信息分时显示出来,非常不直观,因此制作了这个使用高分彩屏的电压显示器。 在电路设计上,采用了带4key的Usart-GPU,串口液晶屏。这款串口屏完全一样,只是考虑到便携性,采用了一块非常不常见的2.0吋320X240的液晶屏(平常的2.0吋是220X176分辨率的),这种高分屏显示的效果非常细腻;在单片机上,采用的是stm32的单片机,这种单片机使用的是12位AD,且是32位单片机,在AD采样上带DMA传输,速度和精度都有保障; 在精度方面也是同样的,只是采用了12位AD,因此分辨率是4096级,按照上面的计算,24V/3096=0.006V,3LSB误差0.018V,也就是说单独测量最高6S勉强达到0.01V精度,电池电压相减,极端误差0.036V;另外,在分压网络的选择上,低电压,比如1S那个,选择了6V满量程,2S选择10.7V满量程,这样在常用的3S上精度可以更高;测量3S电池的情况: 本程序全部开源,因此很多界面以及功能都是可以修改的,比如,电池电压与电量的百分比:// 0 10 20 30 40 50 60 70 80 90 100uc16 Liqx[11]={300,350,368,373,377,381,385,390,395,408,419};可以自行修改; 在主板的布局上,左边是GPU电路,用于控制液晶屏的显示,右边是CPU电路,用于采样电池电压,其实单片机的还有很多管脚没有使用,但是都引出了,因此此板实际上还可以当单片机的核心板使用;电阻分压网络实际做到了8S,但是考虑到用户较少,因此产品只设计的6S; 由于管脚都引出了,因此可以通过MOS管控制蜂鸣器,可以根据每节电池的电压,控制放电通路MOS的关断等等,让这块板子很容易升级制作成放电仪之类的东西; 在使用上,下侧排插,左边为GND,右边分别为1S 2S 3S.......将锂电池插上既可以显示;4个按钮目前只有左下角一个按钮有用,其他3个按钮留作以后扩展使用;在接电状态,按下左下角按钮,就可以进入debug界面,显示测量的AD值; 100mhz给设计的简单外壳:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖朝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值