基于51编程完成⼀个串口的收发数据程序。要求,单片机与 PC 机进行串口通 信,PC 机发送字符给单片机,如果收到字符串'Test'时表示正 确,单片机回送字符串'Uart OK !'。
时间: 2024-02-12 08:08:30 浏览: 82
下面是一个基于51单片机的串口收发数据程序,实现单片机与PC机间的串口通信,接收PC机发送的字符串,判断是否为'Test',并在收到正确字符串后回送'Uart OK!'。
```c
#include <reg52.h>
#include <string.h>
#define FREQ_OSC 12000000UL // 晶振频率
#define BAUD_RATE 9600 // 波特率
sbit LED = P0^0; // LED灯连接的IO口
void initSerialPort() {
TMOD = 0x20; // 设置定时器1为模式2
TH1 = 256 - FREQ_OSC / (32 * BAUD_RATE); // 计算波特率重载值
TL1 = TH1;
TR1 = 1; // 启动定时器1
SM0 = 0; // 设置串口为模式1
SM1 = 1;
REN = 1; // 启用串口接收
EA = 1; // 启用全局中断
ES = 1; // 启用串口中断
}
void sendChar(char c) {
SBUF = c; // 将字符放入发送缓冲区
while(!TI); // 等待发送完成
TI = 0; // 清除发送完成标志
}
void sendString(char *str) {
while(*str) {
sendChar(*str++);
}
}
void receiveData() interrupt 4 {
static char buffer[5]; // 接收缓冲区,最大长度为4
static int index = 0; // 当前接收到的字符数
char c = SBUF; // 读取接收缓冲区中的数据
if(index >= 4) { // 如果接收缓冲区已满,则清空缓冲区
index = 0;
memset(buffer, 0, sizeof(buffer));
}
if(c == '\r' || c == '\n') { // 如果接收到回车或换行符,则判断接收到的字符串是否为'Test'
if(strcmp(buffer, "Test") == 0) {
sendString("Uart OK!");
LED = 1; // 点亮LED灯表示接收成功
} else {
sendString("Invalid data!");
}
index = 0; // 清空接收缓冲区
memset(buffer, 0, sizeof(buffer));
} else {
buffer[index++] = c; // 将接收到的字符放入缓冲区
}
}
void main() {
initSerialPort(); // 初始化串口
while(1); // 进入循环等待中断
}
```
上述代码中,initSerialPort()函数用于初始化串口,设置波特率为9600,使用定时器1进行波特率生成,启用串口接收和全局中断,启用串口中断等。
sendChar()和sendString()函数分别用于向串口发送一个字符或者字符串。
receiveData()函数是串口接收中断服务函数,接收到的字符存入缓冲区buffer中,当接收到回车或换行符时,判断接收到的字符串是否为'Test',如果是,则向串口发送'Uart OK!',并点亮LED灯表示接收成功;否则向串口发送'Invalid data!',并清空缓冲区。
在主函数中,调用initSerialPort()函数初始化串口,然后进入循环等待中断的状态,等待串口中断接收数据。
阅读全文