串口调试程序

举报
ReCclay 发表于 2022/02/22 00:25:30 2022/02/22
【摘要】 需要注意的地方 1、EA要再主函数中写在最前面,然后再InitUart。 2、注意InitUart的参数对应不同波特率和晶振 3、如果需要接收数据,需要在while(1)中加入UartDriver,并在...

需要注意的地方

1、EA要再主函数中写在最前面,然后再InitUart。
2、注意InitUart的参数对应不同波特率和晶振
3、如果需要接收数据,需要在while(1)中加入UartDriver,并在中断函数中加入UartMonitor…

uart.c

/*******************************************************************************
* 文件名:uart.c
* 作  者:CLAY
* 版本号:v1.0.0
* 日  期: 
* 备  注:串口调试利器
*         支持多种格式的发送,接收采用帧模式
*******************************************************************************
*/
#include "config.h"
#include <string.h>
#include <stdio.h>

bit flagTxd = 0;

bit flagRxdFrame = 0;
u8 cntRxd = 0;
u8 bufRxd[100];

extern void UartAction();//注意这个需要在main.c中书写!

/*长整型转化为字符串*/
u8 LongToStr(long dat, u8* str)
{
    char i = 0;
    u8 len = 0;
    u8 buf[11];     // // 长整数最大值4294967295,转ASCII码后占用10+1=11字节(加'\0'字符)

    if(dat < 0)
    {
        dat = -dat;
        *str++ = '-';
        len++;
    }
    do{
        buf[i++] = dat%10 + '0';
        dat /= 10;
    }while(dat > 0);
    len += i;
    while(i-- > 0)
    {
        *str++ = buf[i]; // 上面已经进行+0x30的处理,故此处不再处理
    }
    *str = '\0';
    return len;
}

/*字符串转化为长整型*/
u32 StrToLong(char* str)
{
    u32 result = 0;
    u32 fact = 1;
    u8 len = strlen(str); // 不包括字符'\0'
    u8 i;

    for(i=len-1; i>=0; i--)
    {
        result += ((str[i] - '0') * fact);
        fact *= 10;
    }
    return result;
}

/*串口初始化*/
void InitUart(u8 sta)
{
	if(sta == 0) // 波特率:9600 /11.0592MHZ
	{
		PCON &= 0x7F;       //波特率不倍速
		SCON = 0x50;        //8位数据,可变波特率
		AUXR &= 0xBF;       //定时器1时钟为Fosc/12,即12T
		AUXR &= 0xFE;       //串口1选择定时器1为波特率发生器
		TMOD &= 0x0F;       //清除定时器1模式位
		TMOD |= 0x20;       //设定定时器1为8位自动重装方式
		TL1 = 0xFD;         //设定定时初值
		TH1 = 0xFD;         //设定定时器重装值
		ET1 = 0;            //禁止定时器1中断
		TR1 = 1;            //启动定时器1
		
	}
	else if(sta == 1)// 波特率:9600 /22.1184MHZ
	{	  
		AUXR = 0x00;  		// 定时器1作为波特率发生器       
		SCON = 0x50; 	
		TMOD |= 0x20;		// 0010 0000 定时器1工作于方式2(8位自动重装方式)
		TH1  = 0xFA;	
		TL1  = 0xFA;
		TR1  = 1;
		       
	}
	else if(sta == 2)// 波特率:115200 /11.0592MHZ
	{
		PCON &= 0x7F;		//波特率不倍速
		SCON = 0x50;		//8位数据,可变波特率
		AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
		AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
		TMOD &= 0x0F;		//清除定时器1模式位
		TMOD |= 0x20;		//设定定时器1为8位自动重装方式
		TL1 = 0xFD;			//设定定时初值
		TH1 = 0xFD;			//设定定时器重装值
		ET1 = 0;			//禁止定时器1中断
		TR1 = 1;			//启动定时器1
	}
	
	ES = 1;
}

/*发送单字节*/
void UartSendByte(u8 dat)
{
    flagTxd = 0;
    SBUF = dat;
    while(!flagTxd);
}

/*发送回车换行*/
void UartSendEnter()
{
    UartSendByte(0x0D);
    UartSendByte(0x0A);
}

/*发送字符串,如果结尾有\n,则后面自动加入回车换行*/
void UartSendStr(char *str)
{
    u16 i;
    u16 len = strlen(str); 

    for(i=0; i<len-1; i++) // 最后一个字符单独处理,实现加入回车换行
    {
        UartSendByte(str[i]);
    }

    if(str[i] == '\n')
    {
        UartSendEnter();
    }
    else
    {
        UartSendByte(str[i]);
    }
}

void UartSendFloat(float dat, u8* str)
{
	sprintf(str, "%.2f", dat);
	
	UartSendStr(str);
}

/*发送数值,实则转化为字符串发送,结尾自动加入回车换行*/
void UartSendNum(u32 dat, u8 sta)
{
    u8 buf[11];

    LongToStr(dat, buf);
    UartSendStr(buf);
	if(sta)
	{
		UartSendEnter();
	}
}

/*发送字符串+数值*/
void UartSendStrNum(char* buf, u32 dat, u8 sta)
{
    UartSendStr(buf);
    UartSendNum(dat, sta);
}

/*十进制转十六进制*/
void HexToASCII(u16 hex, char* str)
{
    u8 temp = 0;

    temp = ((hex & 0xF000) >> 12);
    str[0] = (temp >= 10) ? (temp-10+'A') : (temp+'0');
    
    temp = ((hex & 0x0F00) >> 8);
    str[1] = (temp >= 10) ? (temp-10+'A') : (temp+'0');
                                                 
    temp = ((hex & 0x00F0) >> 4);                 
    str[2] = (temp >= 10) ? (temp-10+'A') : (temp+'0');
                                                 
    temp = ((hex & 0x000F) >> 0);                 
    str[3] = (temp >= 10) ? (temp-10+'A') : (temp+'0');

    str[4] = '\0';
}

/*发送十六进制字符*/
void UartSendHex(u16 hex)
{
    u8 temp[11];

    HexToASCII(hex, temp);
    UartSendStr(temp);
    UartSendEnter();
}

/*发送二进制字符*/
void UartSendBinary(u8 dat)
{
    u8 i;
    u8 temp[17];

    for(i=0; i<8; i++)
    {
        temp[i] = ((dat<<i) & 0x80) ? '1':'0';
    }
    temp[i] = '\0';

    for(i=0; i<strlen(temp); i++)
    {
        UartSendByte(temp[i]);
        UartSendByte(' ');
    }
    UartSendEnter();
}

/*串口数据读取函数,len为指定的数据长度,返回为实际的数据长度*/
u8 UartRead(u8* buf, u8 len)
{
	u8 i;
	
	if(len > cntRxd)
	{
		len = cntRxd;
	}
	for(i=0; i<len; i++)
	{
		*buf++ = bufRxd[i];
	}
	*buf = '\0';
	cntRxd = 0;
	
	return len;
}

/*串口发送数据函数,len为指定的长度,较UartSendStr可以指定发送字符串长度*/
void UartWrite(u8* buf, u8 len)
{
	while(len--)
	{
		UartSendByte(*buf++);
	}
}

/*串口接收监控, ms-为定时间隔*/
void UartMonitor(u8 ms)
{
	static u8 cntbkp = 0;
	static u8 idletmr = 0;
	
	if(cntRxd > 0)
	{
		if(cntbkp != cntRxd)
		{
			cntbkp = cntRxd;
			idletmr = 0;
		}
		else
		{
			if(idletmr < 30)
			{
				idletmr += ms;
				if(idletmr >= 30)
				{
					flagRxdFrame = 1;
				}
			}
		}
	}
	else
	{
		cntbkp = 0;
	}
}

/*串口驱动函数,在主函数中调用*/
void UartDriver()
{
	if(flagRxdFrame)
	{
		flagRxdFrame = 0;
		UartAction();
	}
}

/*串口中断*/
void UartInterrupt() interrupt 4
{
	if(RI)
	{
		RI = 0;
		if(cntRxd < sizeof(bufRxd))
		{
			bufRxd[cntRxd++] = SBUF;
		}
	}
	
	if(TI)
	{
		TI = 0;
		flagTxd = 1;
	}

}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309

uart.h

#ifndef _UART_H
#define _UART_H

void InitUart(u8 sta);
void UartSendStr(char* str);
void UartSendNum(u32 dat, u8 sta);
void UartSendStrNum(char* buf, u32 dat, u8 sta);
void UartSendHex(u16 hex);
void UartSendBinary(u8 dat);

void UartDriver();//注意这个需要在主函数中while(1)调用
void UartMonitor(u8 ms);
u8 UartRead(u8* buf, u8 len);
void UartWrite(u8* buf, u8 len);
void UartSendFloat(float dat, u8* str);

#endif



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

config.h

#ifndef _CONFIG_H
#define _CONFIG_H

#include <stc15.h>

/*变量类型重定义*/
typedef unsigned char   u8;
typedef unsigned int    u16;
typedef unsigned long   u32;
typedef          char   int8;
typedef          int    int16;
typedef          long   int32;


#endif



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

测试main函数

#include "config.h"
#include "uart.h"

void main()
{
    unsigned char a=0x55;
    unsigned int b=0xAB98;
    unsigned long c=1234567890; 
    unsigned char Buf[]="欢迎使用STC15单片机!\n";   //字符串在内存结尾必然有一个附加字符:\0   

	EA = 1;
	
    InitUart(0);                      				// 9600bps@11.0592MHz
    UartSendStr("串口设置完毕:123ABC\n");  		// 发送字符串
    UartSendStr(Buf);		
    UartSendNum(b, 1);               				// 发送数值
    UartSendStrNum("发送=:",c, 1);   				// 发送字符串+数值
    UartSendHex(b) ;                 				// 发送16进制
    UartSendBinary(a);               				// 发送2进制

		
    while(1)
    {
		
	}
}

void UartAction()
{
//以下仅仅作为演示
	u8 buf[40];
	
	UartRead(buf, sizeof(buf));

	if(strcmp(buf,"R+") == 0 )
	{
		R_Speed_Set += 10;
		if(R_Speed_Set >= 90)
		{
			R_Speed_Set = 90;
		}
		UartSendStrNum("右轮设置: ",R_Speed_Set, 1);
	}
//......
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/82629301

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。