51单片机串口接收非固定长度字符串的代码
时间: 2023-07-28 21:07:21 浏览: 98
下面是51单片机串口接收非固定长度字符串的代码示例:
```c
#include <reg52.h>
#include <stdio.h>
#include <string.h>
#define FOSC 11059200L
#define BAUD 9600
#define TH1 (256 - FOSC / 12 / BAUD)
sbit LED = P1^0;
char buffer[20];
unsigned char index = 0;
void UART_init() {
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = TL1 = TH1;
TR1 = 1;
SM0 = 0;
SM1 = 1;
REN = 1;
EA = 1;
ES = 1;
}
void UART_interrupt() interrupt 4 {
if (RI) {
RI = 0;
// 接收到数据
char data = SBUF;
if (data == '\r') {
// 字符串接收完毕
buffer[index] = '\0';
if (strcmp(buffer, "on") == 0) {
LED = 1;
} else if (strcmp(buffer, "off") == 0) {
LED = 0;
}
index = 0;
} else {
// 继续接收
buffer[index] = data;
index++;
}
}
}
void main() {
UART_init();
while (1);
}
```
在上面的代码中,我们定义了一个字符数组 `buffer` 和一个整型变量 `index`。`buffer` 数组用于存储接收到的字符串,`index` 变量表示当前接收到的字符在 `buffer` 数组中的位置。
在 `UART_interrupt()` 函数中,我们首先判断 RI 寄存器的值,如果为 1,表示接收到了数据。我们读取 SBUF 寄存器的值,然后判断接收到的数据是否为回车符(`\r`)。如果是回车符,表示字符串接收完毕,我们将 `buffer` 数组末尾加上字符串结束符 `\0`,然后使用 `strcmp()` 函数来判断接收到的字符串是不是等于 "on" 或 "off"。根据判断结果来控制 LED 灯的亮灭,并将 `index` 变量清零。如果不是回车符,表示字符串还未接收完毕,我们将接收到的字符存储到 `buffer` 数组中,并将 `index` 变量加 1。
最后在 `main()` 函数中,我们调用 `UART_init()` 函数初始化串口,并进入一个无限循环中等待串口中断。
阅读全文