arduino mega2560与串口屏通讯
提示
以下的教程均基于arduino2.0以上的版本,在低于arduino2.0的版本下编译可能会报错
arduino mega2560与串口屏通讯工程下载
串口屏怎么下载程序
arduino mega2560与串口屏的连接方式
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 //当串口缓冲区大于等于一帧的长度时
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 }
其他参考链接