为何手动选择数据不能发送,串口助手接收到的全是null或者乱码,接收中断返回来的又正确
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
void delay_1_second(void)
{
unsigned int i, j;
for (i = 0; i < 12000; i++) { // 假设每个大循环约耗时1ms
for (j = 0; j < 120; j++) { // 这里是填充的小循环,具体数量需要根据实际情况调整
// 空循环,用于消耗时间
}
}
}
/*******************************************************************************
* 函 数 名 : uart_init
* 函数功能 : 串口通信中断配置函数,通过设置TH和TL即可确定定时时间
* 输 入 : baud:波特率对应的TH、TL装载值
* 输 出 : 无
*******************************************************************************/
void uart_init(void)
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
TR1 = 1; //启动定时器1
ET1 = 0; //禁止定时器1中断
EA=1; //开放总中断
ES=1; //开放串口中断
}
// 发送单个字符的函数
void uart_send_char(u8 da1)
{
while(TI); // 等待上次发送完成(通过检查TI标志)
SBUF = da1; // 将字符放入发送缓冲区SBUF
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}
void uart_send_string(const char *str)
{
while(*str) // 遍历字符串直到遇到结束符'\0'
{
uart_send_char(*str++); // 发送当前字符,并指向下一个字符
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
uart_init();//波特率为9600
//char s2 = "ssss";
while(1)
{
uart_send_char('x');
delay_1_second();
}
}
void uart() interrupt 4 //串口通信中断函数
{
u8 rec_data;
RI = 0; //清除接收中断标志位
rec_data=SBUF; //存储接收到的数据
SBUF=rec_data; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}
|