weixin_46485737 2023-05-13 15:29 采纳率: 0%
浏览 30

esp8266获取json后,无法在墨水屏显示中文

我想用esp8266访问http://whois.pconline.com.cn/ipJson.jsp?ip=xxx.xxx.xxx.xxx&json=true
这个api,然后将返回的ip“202.101.102.194”和city“福州市”,显示在与esp8266连接的墨水屏上用来表示定位。ip值的数字能正常显示,而city的“福州市”却不能显示(和中文有关的包括pro也不能显示但是region偶尔能莫名其妙显示个“琅”字),本人由于大学第一次接触esp8266,希望能帮我看看哪里出了问题,应该要怎么改,谢谢。

img

img


arduino串口显示的是这个,
我定义了一个string类型的全局变量用来记录city的值,在displaytext()中使用了下面代码转换成const char*,用来配合u8g2.drawUTF8显示文字以下是我的全部代码:

#include <GxEPD2_BW.h>
#include <Adafruit_GFX.h>
#include <U8g2_for_Adafruit_GFX.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <Wire.h>
//#define BME280_ADDRESS 0x76
GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=D8*/ 15, /*DC=D3*/ 4, /*RST=D4*/ 2, /*BUSY=D2*/ 5));
U8G2_FOR_ADAFRUIT_GFX u8g2Fonts;
//extern const uint8_t u8g2_mfyuanhei_16_gb2312[] PROGMEM;
#include "u8g2_mfyuanhei_16_gb2312.c"
#include "u8g2_mfxinran_92_number.c"
String city_rl="";
String ip_rl="";


void setup() 
{
  lianwang();
  ipfrom();
  displaytext();
}


void loop() {
  
}
void displaytext(){
  display.init(115200);
  display.setRotation(0);
  u8g2Fonts.begin(display);
   int16_t dataWidth;
  String str = "2023-5-13";
  const char* character = str.c_str(); 
  const char* ip_rll=ip_rl.c_str();
  const char* city_rll=city_rl.c_str();
  uint8_t size = 24;
  display.firstPage();
  uint8_t SCREEN_WIDTH=400;
  do
  {
    uint8_t size = 101;
    u8g2Fonts.setBackgroundColor(0xff);
    u8g2Fonts.setForegroundColor(0x00);
    u8g2Fonts.setFont(u8g2_mfyuanhei_16_gb2312);

    dataWidth = u8g2Fonts.getUTF8Width(character);
    u8g2Fonts.drawUTF8((SCREEN_WIDTH - dataWidth)/2, size, character);
    Serial.printf("\ndataWidth: %d\n", dataWidth/8);

    u8g2Fonts.setFont(u8g2_font_wqy16_t_gb2312);

    dataWidth = u8g2Fonts.getUTF8Width("陶嘉骐制作");
    u8g2Fonts.drawUTF8((SCREEN_WIDTH - dataWidth)/2, size*2, "陶嘉骐制作");
    
    u8g2Fonts.setFont(u8g2_font_wqy16_t_gb2312);
    u8g2Fonts.drawUTF8(250, 150, ip_rll);
    u8g2Fonts.setFont(u8g2_font_wqy16_t_gb2312);
    u8g2Fonts.drawUTF8(200, 200, city_rll);
    const unsigned char gImage_weizhi[60] = { /* 0X00,0X01,0X14,0X00,0X14,0X00, */
    0XFF,0X0F,0XF0,0XFC,0X03,0XF0,0XF8,0X01,0XFF,0XF0,0X00,0XFF,0XF0,0X60,0XF1,0XE0,
    0XF0,0X70,0XE1,0XF8,0X7F,0XE0,0XF0,0XFF,0XF0,0XF0,0XF7,0XF0,0X00,0XF0,0XF8,0X01,
    0XFF,0XF8,0X01,0XFF,0XFC,0X03,0XFF,0XFC,0X03,0XF8,0XFE,0X07,0XFF,0XFE,0X0F,0XFF,
    0XFF,0X0F,0XFF,0XFF,0X9F,0XFE,0XFF,0X9F,0XFF,0XFF,0XFF,0XFF,};
    display.drawInvertedBitmap(350, 0, gImage_weizhi, 20, 20, GxEPD_BLACK); // 绘制反色位图
  }
  while (display.nextPage());
  display.hibernate();
}
void lianwang(){
  Serial.begin(115200);
  WiFi.begin("wif","11113333");
  while(WiFi.status()!=WL_CONNECTED){
    delay(500);
    Serial.print("..");
  }
  Serial.println("ip address");
  Serial.println(WiFi.localIP());
}
void ipfrom(){
  HTTPClient http;
  WiFiClient wifiClient;
  if (WiFi.status() == WL_CONNECTED){
    http.begin(wifiClient,"http://whois.pconline.com.cn/ipJson.jsp?ip=xxx.xxx.xxx.xxx&json=true");
    int httpCode = http.GET();
    Serial.print(httpCode);
    http.setUserAgent("Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36");
    if (httpCode==HTTP_CODE_OK)
    {
      String respone =  http.getString();
      //Serial.println(respone);
      StaticJsonDocument<384> doc;
      DeserializationError error = deserializeJson(doc, respone);
      if (error) 
      {
        Serial.print(F("deserializeJson() failed: "));
        Serial.println(error.f_str());
        return ;
      }
      const char* ip = doc["ip"]; // "202.101.102.194"
      const char* pro = doc["pro"]; // "福建省"
      const char* proCode = doc["proCode"]; // "350000"
      const char* city = doc["city"]; // "福州市"
      const char* cityCode = doc["cityCode"]; // "350100"
      const char* region = doc["region"]; // nullptr
      const char* regionCode = doc["regionCode"]; // "0"
      const char* addr = doc["addr"]; // "福建省福州市 电信"
      const char* regionNames = doc["regionNames"]; // nullptr
      const char* err = doc["err"]; // nullptr
      ip_rl=ip;
      city_rl=city;
      Serial.println(ip_rl);
      Serial.println(city_rl);
      http.end();
    }
  }
}


  • 写回答

1条回答 默认 最新

  • qllaoda 2023-05-13 15:38
    关注

    u8g2_mfyuanhei_16_gb2312.c,里面可能只有部分汉字的字体数据

    评论

报告相同问题?

问题事件

  • 修改了问题 5月13日
  • 创建了问题 5月13日

悬赏问题

  • ¥15 SPSS分类模型实训题步骤
  • ¥15 求解决扩散模型代码问题
  • ¥15 工创大赛太阳能电动车项目零基础要学什么
  • ¥20 limma多组间分析最终p值只有一个
  • ¥15 nopCommerce开发问题
  • ¥15 torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGKILL
  • ¥15 QuartusⅡ15.0编译项目后,output_files中的.jdi、.sld、.sof不更新怎么解决
  • ¥15 pycharm输出和导师的一样,但是标红
  • ¥15 想问问富文本拿到的html怎么转成docx的
  • ¥15 我看了您的文章,遇到了个问题。