- 打卡等级:偶尔看看III
- 打卡总天数:53
- 最近打卡:2026-07-04 09:39:43
已绑定手机
注册会员
- 积分
- 141
|
发表于 2026-6-21 15:43:15
|
显示全部楼层
自己重新处理了下, 就是一开始不对导致的,
现在专门加了一个buff,然后来进行处理。
就算串口出问题了,也不会导致整成死机,
增加了中断, 同时检查串口的状态,可以进行恢复。
// 200字节
#define PRINTF_BUFF_SIZE 200
uint8_t xdata debug_ErrorFlag=0;
uint8_t xdata printfbuff[PRINTF_BUFF_SIZE];
uint8_t xdata *printf_buf_in;
uint8_t xdata *printf_buf_out;
uint8_t xdata printf_Status=0;
void printfBuff_input(unsigned char value)// 接收数据input处理
{
if((printf_buf_in < printf_buf_out) && (1 == printf_buf_out - printf_buf_in)) {
debug_ErrorFlag = 1;
return; // 上报出错....
}else if((printf_buf_in > printf_buf_out) && ((printf_buf_in - printf_buf_out) >= PRINTF_BUFF_SIZE)) {
debug_ErrorFlag =1;
return; // 上报出错...
}else {
if(printf_buf_in >= (unsigned char *)(printfbuff + PRINTF_BUFF_SIZE)) {
printf_buf_in = (unsigned char *)(printfbuff);
}
*printf_buf_in++ = value;
}
}
uint8_t with_data_printfbuff(void)
{
if(printf_buf_out != printf_buf_in){
return 1;
}else{
return 0;
}
}
uint8_t printfBuff_output(void)
{
unsigned char value = 0;
//有数据
if(printf_buf_out != printf_buf_in) {
if(printf_buf_out >= (unsigned char *)(printfbuff + PRINTF_BUFF_SIZE)) {
printf_buf_out = (unsigned char *)(printfbuff); //数据已经到末尾
}
value = *(printf_buf_out);
printf_buf_out++;
}
return value;
}
void Uart1_Init(void) //1000000bps@40.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xF6; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
ES = 1; //使能串口1中断
printf_Status = 0;
printf_buf_out = printfbuff;
printf_buf_in = printfbuff;
debug_ErrorFlag=0;
}
void Uart1_Isr(void) interrupt 4
{
if (TI) //检测串口1发送中断
{
TI = 0; //清除串口1发送中断请求位
if(with_data_printfbuff()){
SBUF = printfBuff_output();
}else {
printf_Status = 0;
}
}
if (RI) //检测串口1接收中断
{
RI = 0; //清除串口1接收中断请求位
}
}
#endif
void Debug_handle(void)
{
if(debug_ErrorFlag){
Uart1_Init(); // reset debug...
printf("debug uart reset...\r\n");
}
// 如果有数据需要打印,且串口没有再发送数据, 则发送下一个字节
if(printf_Status==0 && with_data_printfbuff()){
printf_Status = 1;
SBUF = printfBuff_output();
}
if(printf_Status){
TOUCH_LED1 = 1;
}else {
TOUCH_LED1 = 0;
}
}
////////////////////////////////////////
// 重写printf字符发送重定向函数
// 入口参数: dat (printf函数待打印的字符)
// 函数返回: 需要返回入口参数的数据
////////////////////////////////////////
char putchar (char dat) //将串口1和printf函数绑定
{
#if 0
while (!UART1_CheckTxFlag()); //等待之前的数据发送完成
UART1_ClearTxFlag(); //清除完成标志
UART1_SendData(dat); //发送当前字节
#else
#endif
printfBuff_input(dat);
return dat;
}
|
|