ESP32C3与串口屏通讯

使用的是ESP32C3合宙经典款(板载ch343芯片的)

提示

以下的教程均基于arduino2.0以上的版本,在低于arduino2.0的版本下编译可能会报错

ESP32C3与串口屏的连接方式

../../_images/hezhou_esp32c3.png

ESP32C3代码

注意

以下代码仅为演示代码,用于测试显示屏能实现最基本的通信功能,如果您需要在正式产品中进行使用,请根据自己的需求对代码进行相应的优化和修改,或以自己的方式实现相应的功能

注意

以下代码适用于ESP32C3

arduino只支持utf8编码,因此需要发送汉字时,在新建串口屏工程时请选择UTF8编码,导入字库时也要使用UTF8字库,参考 arduino发送中文时乱码

  1 //arduino IDE 上的型号选择AirM2M CORE ESP32C3
  2 //arduino的GND接串口屏或串口工具的GND,共地
  3 //arduino的IO4接串口屏或串口工具的RX
  4 //arduino的IO5接串口屏或串口工具的TX
  5 //arduino的5V接串口屏的5V,如果是串口工具,不用接5V也可以
  6 //根据自己的实际修改对应的TX_Pin和RX_Pin
  7 #define TJC Serial
  8 #define TX_Pin 4
  9 #define RX_Pin 5
 10 #define FRAME_LENGTH 7
 11 #define LED_PIN0 12
 12 #define LED_PIN1 13
 13
 14 int a;
 15 unsigned long nowtime;
 16 void setup() {
 17   // put your setup code here, to run once:
 18   //初始化串口
 19   TJC.begin(115200, SERIAL_8N1, RX_Pin, TX_Pin);
 20   //TJC.begin(115200);
 21   //因为串口屏开机会发送88 ff ff ff,所以要清空串口缓冲区
 22   while (TJC.read() >= 0); //清空串口缓冲区
 23   TJC.print("page main\xff\xff\xff"); //发送命令让屏幕跳转到main页面
 24   nowtime = millis(); //获取当前已经运行的时间
 25
 26   //初始化esp32c3上面的LED灯
 27   pinMode(LED_PIN0, OUTPUT);
 28   pinMode(LED_PIN1, OUTPUT);
 29   digitalWrite(LED_PIN0, LOW);
 30   digitalWrite(LED_PIN1, LOW);
 31
 32 }
 33
 34 void loop() {
 35   // put your main code here, to run repeatedly:
 36   char str[100];
 37   if (millis() >= nowtime + 1000) {
 38     nowtime = millis(); //获取当前已经运行的时间
 39
 40     //用sprintf来格式化字符串,给n0的val属性赋值
 41     sprintf(str, "n0.val=%d\xff\xff\xff", a);
 42     //把字符串发送出去
 43     TJC.print(str);
 44
 45     //用sprintf来格式化字符串,给t0的txt属性赋值
 46     sprintf(str, "t0.txt=\"现在是%d\"\xff\xff\xff", a);
 47     //把字符串发送出去
 48     TJC.print(str);
 49
 50
 51     //用sprintf来格式化字符串,触发b0的按下事件,直接把结束符整合在字符串中
 52     sprintf(str, "click b0,1\xff\xff\xff");
 53     //把字符串发送出去
 54     TJC.print(str);
 55
 56     delay(50);  //延时50ms,才能看清楚点击效果
 57
 58     //用sprintf来格式化字符串,触发b0的弹起事件,直接把结束符整合在字符串中
 59     sprintf(str, "click b0,0\xff\xff\xff");
 60     //把字符串发送出去
 61     TJC.print(str);
 62
 63
 64
 65     a++;
 66   }
 67
 68   //串口数据格式:
 69   //串口数据帧长度:7字节
 70   //帧头     参数1    参数2   参数3       帧尾
 71   //0x55     1字节   1字节    1字节     0xffffff
 72   //当参数是01时
 73   //帧头     参数1    参数2   参数3       帧尾
 74   //0x55     01     led编号  led状态    0xffffff
 75   //例子1:上位机代码  printh 55 01 01 00 ff ff ff  含义:1号led关闭
 76   //例子2:上位机代码  printh 55 01 04 01 ff ff ff  含义:4号led打开
 77   //例子3:上位机代码  printh 55 01 00 01 ff ff ff  含义:0号led打开
 78   //例子4:上位机代码  printh 55 01 04 00 ff ff ff  含义:4号led关闭
 79
 80   //当参数是02或03时
 81   //帧头     参数1    参数2   参数3       帧尾
 82   //0x55     02/03   滑动值    00    0xffffff
 83   //例子1:上位机代码  printh 55 02 64 00 ff ff ff  含义:h0.val=100
 84   //例子2:上位机代码  printh 55 02 00 00 ff ff ff  含义:h0.val=0
 85   //例子3:上位机代码  printh 55 03 64 00 ff ff ff  含义:h1.val=100
 86   //例子4:上位机代码  printh 55 03 00 00 ff ff ff  含义:h1.val=0
 87
 88
 89   //当串口缓冲区大于等于一帧的长度时
 90   while (TJC.available() >= FRAME_LENGTH) {
 91     unsigned char ubuffer[FRAME_LENGTH];
 92     //从串口缓冲读取1个字节但不删除
 93     unsigned char frame_header = TJC.peek();
 94     //当获取的数据是包头(0x55)时
 95     if (frame_header == 0x55) {
 96       //从串口缓冲区读取7字节
 97       TJC.readBytes(ubuffer, FRAME_LENGTH);
 98       if (ubuffer[4] == 0xff && ubuffer[5] == 0xff && ubuffer[6] == 0xff) {
 99         if(ubuffer[1] == 0x01)
100         {
101           //下发的是LED信息
102           sprintf(str, "msg.txt=\"led %d is %s\"\xff\xff\xff", ubuffer[2], ubuffer[3] ? "on" : "off");
103           TJC.print(str);
104           if(ubuffer[2]==0x00)
105           {
106             //设置ESP32C3上的LED灯1
107             digitalWrite(LED_PIN0, ubuffer[3]);
108           }else if(ubuffer[2]==0x01)
109           {
110             //设置ESP32C3上的LED灯2
111             digitalWrite(LED_PIN1, ubuffer[3]);
112           }
113
114         }else if(ubuffer[1] == 0x02)
115         {
116           //下发的是滑动条h0.val的信息
117           sprintf(str, "msg.txt=\"h0.val is %d\"\xff\xff\xff", ubuffer[2]);
118           TJC.print(str);
119
120         }else if(ubuffer[1] == 0x03)
121         {
122           //下发的是滑动条h1.val的信息
123           sprintf(str, "msg.txt=\"h1.val is %d\"\xff\xff\xff", ubuffer[2]);
124           TJC.print(str);
125
126         }
127
128       }
129     } else {
130       TJC.read();  //从串口缓冲读取1个字节并删除
131     }
132   }
133 }

其他参考链接

屏幕通电后不断的闪烁(不断重启)