作为主站的uno开发板向作为从站LILYGO t-diapaly s3开发板,使用IIC通信协议来通信,发送一个Hello,和一个KITTY,我想在LILYGO开发板来接收这两个字符串数据,并且在屏幕上显示出来
时间: 2024-02-10 21:15:05 浏览: 110
串行通信协议——IIC协议
好的,以下是一个可能的程序示例,使用Wire库来实现I2C通信:
```
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
Wire.begin(0x3C); // 从站地址为0x3C
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 初始化屏幕
display.clearDisplay();
display.display();
}
void loop() {
receiveData();
}
void receiveData() {
int byteCount = 0;
int dataLength;
char dataBuffer[SCREEN_WIDTH];
Wire.requestFrom(0x40, 2); // 读取控制字节
while (Wire.available()) {
byte b = Wire.read();
if (byteCount == 0) {
if (b == 0x00) {
byteCount++;
}
} else if (byteCount == 1) {
byteCount++;
if (b < SCREEN_WIDTH) {
dataLength = b;
} else {
byteCount = 0;
}
}
}
if (byteCount == 2) {
byteCount = 0;
Wire.requestFrom(0x40, dataLength); // 读取数据
while (Wire.available()) {
char c = Wire.read();
if (byteCount < SCREEN_WIDTH) {
dataBuffer[byteCount] = c;
byteCount++;
}
}
if (byteCount == dataLength) {
dataBuffer[byteCount] = '\0'; // 添加字符串结尾符
Serial.println(dataBuffer);
display.clearDisplay();
display.setCursor(0, 0);
display.println(dataBuffer); // 在屏幕上显示数据
display.display();
}
}
}
```
在这个程序中,我们使用了Adafruit_SSD1306库来控制LILYGO t-diapaly s3开发板上的OLED屏幕。在`setup()`函数中,我们初始化了I2C总线和屏幕,并在屏幕上显示了欢迎信息。在`loop()`函数中,我们调用`receiveData()`函数来接收数据。`receiveData()`函数首先调用`Wire.requestFrom()`来请求两个控制字节。如果接收到的第一个字节是0x00,那么它会解析第二个字节来确定数据的长度,并调用`Wire.requestFrom()`来读取数据。最后,它在串行监视器上输出接收到的数据,并在屏幕上显示数据。
请注意,在这个程序中,我们假设uno开发板已经通过I2C总线连接到了LILYGO t-diapaly s3开发板,而且我们使用的从站地址为0x40。另外,我们假设发送的数据长度不超过屏幕宽度128。如果要发送更长的数据,需要修改程序来支持多行显示或者滚动显示。
阅读全文