树莓派pico使用arduino与串口屏通讯
串口屏怎么下载程序
使用TFT文件下载助手(TFTFileDownload)通过串口下载工程到串口屏
树莓派pico使用arduino与串口屏通讯的连接方式
树莓派pico使用arduino与串口屏通讯代码
注意
以下代码仅为演示代码,用于测试显示屏能实现最基本的通信功能,如果您需要在正式产品中进行使用,请根据自己的需求对代码进行相应的优化和修改,或以自己的方式实现相应的功能
注意
以下代码适用于树莓派pico
树莓派pico第一次下载时会失败,此时需要断开电脑USB,然后按住pico上的 BOOT 按钮,连接电脑USB,此时就会被识别为一个U盘,就可以像其他arduino一样正常下载了
arduino只支持utf8编码,因此需要发送汉字时,在新建串口屏工程时请选择UTF8编码,导入字库时也要使用UTF8字库,参考 arduino发送中文时乱码
1 //arduino IDE 上的型号选择Raspberry Pi Pico - Arduino Mbed OS RP2040 Boards
2 //pico的GND接串口屏或串口工具的GND,共地
3 //pico的IO0接串口屏或串口工具的RX
4 //pico的IO1接串口屏或串口工具的TX
5 //pico的5V接串口屏的5V,如果是串口工具,不用接5V也可以
6
7 #define TJC Serial1
8 #define FRAME_LENGTH 7
9
10
11 int a;
12 unsigned long nowtime;
13 void setup() {
14 // put your setup code here, to run once:
15 //初始化串口
16 TJC.begin(115200);
17
18 //因为串口屏开机会发送88 ff ff ff,所以要清空串口缓冲区
19 while (TJC.read() >= 0); //清空串口缓冲区
20 TJC.print("page main\xff\xff\xff"); //发送命令让屏幕跳转到main页面
21 nowtime = millis(); //获取当前已经运行的时间
22
23 //初始化树莓派pico上面的LED灯
24 pinMode(LED_BUILTIN, OUTPUT);
25
26 }
27
28 void loop() {
29 // put your main code here, to run repeatedly:
30 char str[100];
31 if (millis() >= nowtime + 1000) {
32 nowtime = millis(); //获取当前已经运行的时间
33
34 //用sprintf来格式化字符串,给n0的val属性赋值
35 sprintf(str, "n0.val=%d\xff\xff\xff", a);
36 //把字符串发送出去
37 TJC.print(str);
38
39 //用sprintf来格式化字符串,给t0的txt属性赋值
40 sprintf(str, "t0.txt=\"现在是%d\"\xff\xff\xff", a);
41 //把字符串发送出去
42 TJC.print(str);
43
44
45 //用sprintf来格式化字符串,触发b0的按下事件,直接把结束符整合在字符串中
46 sprintf(str, "click b0,1\xff\xff\xff");
47 //把字符串发送出去
48 TJC.print(str);
49
50 delay(50); //延时50ms,才能看清楚点击效果
51
52 //用sprintf来格式化字符串,触发b0的弹起事件,直接把结束符整合在字符串中
53 sprintf(str, "click b0,0\xff\xff\xff");
54 //把字符串发送出去
55 TJC.print(str);
56
57
58
59 a++;
60 }
61
62 //串口数据格式:
63 //串口数据帧长度:7字节
64 //帧头 参数1 参数2 参数3 帧尾
65 //0x55 1字节 1字节 1字节 0xffffff
66 //当参数是01时
67 //帧头 参数1 参数2 参数3 帧尾
68 //0x55 01 led编号 led状态 0xffffff
69 //例子1:上位机代码 printh 55 01 01 00 ff ff ff 含义:1号led关闭
70 //例子2:上位机代码 printh 55 01 04 01 ff ff ff 含义:4号led打开
71 //例子3:上位机代码 printh 55 01 00 01 ff ff ff 含义:0号led打开
72 //例子4:上位机代码 printh 55 01 04 00 ff ff ff 含义:4号led关闭
73
74 //当参数是02或03时
75 //帧头 参数1 参数2 参数3 帧尾
76 //0x55 02/03 滑动值 00 0xffffff
77 //例子1:上位机代码 printh 55 02 64 00 ff ff ff 含义:h0.val=100
78 //例子2:上位机代码 printh 55 02 00 00 ff ff ff 含义:h0.val=0
79 //例子3:上位机代码 printh 55 03 64 00 ff ff ff 含义:h1.val=100
80 //例子4:上位机代码 printh 55 03 00 00 ff ff ff 含义:h1.val=0
81
82
83 //当串口缓冲区大于等于一帧的长度时
84 while (TJC.available() >= FRAME_LENGTH) {
85 unsigned char ubuffer[FRAME_LENGTH];
86 //从串口缓冲读取1个字节但不删除
87 unsigned char frame_header = TJC.peek();
88 //当获取的数据是包头(0x55)时
89 if (frame_header == 0x55) {
90 //从串口缓冲区读取7字节
91 TJC.readBytes(ubuffer, FRAME_LENGTH);
92 if (ubuffer[4] == 0xff && ubuffer[5] == 0xff && ubuffer[6] == 0xff) {
93 if(ubuffer[1] == 0x01)
94 {
95 //下发的是LED信息
96 sprintf(str, "msg.txt=\"led %d is %s\"\xff\xff\xff", ubuffer[2], ubuffer[3] ? "on" : "off");
97 TJC.print(str);
98 if(ubuffer[2]==0x00)
99 {
100 //设置树莓派pico上的LED灯1
101 digitalWrite(LED_BUILTIN, ubuffer[3]);
102 }
103
104 }else if(ubuffer[1] == 0x02)
105 {
106 //下发的是滑动条h0.val的信息
107 sprintf(str, "msg.txt=\"h0.val is %d\"\xff\xff\xff", ubuffer[2]);
108 TJC.print(str);
109
110 }else if(ubuffer[1] == 0x03)
111 {
112 //下发的是滑动条h1.val的信息
113 sprintf(str, "msg.txt=\"h1.val is %d\"\xff\xff\xff", ubuffer[2]);
114 TJC.print(str);
115
116 }
117
118 }
119 } else {
120 TJC.read(); //从串口缓冲读取1个字节并删除
121 }
122 }
123 }
其他参考链接