arduino mega2560与串口屏通讯

《arduino通讯》例程是相对基础的例程

下载链接:资源合集汇总

arduino mega2560通讯-如何下载工程到串口屏

通过串口下载工程到串口屏

通过SD卡下载工程到串口屏

arduino mega2560与串口屏的连接方式

../../_images/arduino_mega2560.png

arduino mega2560代码

注意

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

注意

以下代码适用于arduino mega2560,如果是其他型号的arduino,请修改第6行代码 #define TJC Serial3 为其他串口

arduino系列请勿使用Serial(TX0和RX0)与屏幕进行通讯,因为这个串口已经连接到电脑的串口上了,会导致无法和串口屏通讯,请使用Serial1/Serial2/Serial3,arduino uno之类的只有1个串口的arduino,请使用SoftwareSerial库模拟的串口,请参考 arduino uno与串口屏通讯

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

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

其他参考链接

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