单片机串口通信程序

该文详细介绍了如何进行串口通信的初始化和中断处理,包括接收数据的存储和判断。文中提到了两种方法,一是使用printf函数进行数据发送,通过重写putchar函数实现串口重定向;二是利用sprintf函数构建字符串然后通过自定义的发送函数Uart_Sendstr发送。这两种方法都在主循环中对接收到的数据进行解析并作出响应。
摘要由CSDN通过智能技术生成

本文总结了两种比较简单的关于串口发送接收的程序,以下是步骤:

定义数据:

unsigned char idata URX[10] = 0;	//串口接收数组
unsigned char idata URX_Num = 0;	//串口字符数
unsigned char idata URX_tt = 0;		//串口减速时间
bit URX_Over = 0;					//数据接收完成标志位

首先要串口初始化:(以9600波特率为例)

void UartInit(void)		//9600bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR |= 0x04;		//定时器2时钟为Fosc,即1T
	T2L = 0xC7;		//设定定时初值
	T2H = 0xFE;		//设定定时初值
	AUXR |= 0x10;		//启动定时器2
}

串口中断: 

void Uart1() interrupt 4
{
	if(RI==1)
	{
		RI=0;URX_tt=0;
		if(URX_Num<10){URX[URX_Num++]=SBUF;}
	}
}

在定时器0扫描里加入,或者主函数while(1)里加入:

(其中++URX_tt=(1000/波特率),数要接近,否则会有小小干扰。)

if(URX_Num > 0)
{
	if(++URX_tt == 15) { URX_Over = 1;} 
}

接下来关于串口通信有两种方法,都需要先添加两个头文件

#include <stdio.h>		//包含printf与sprintf函数
#include "string.h"		//包含strncmp或strcmp函数

方法一:使用printf函数

1、首先要串口重定向(无需放主函数里,printf会调用此函数)

//重写putchar函数
char putchar(char c)
{
	ES=0;			//关串口中断
	SBUF=c;			
	while(TI!=1);	//等待发送成功
	TI=0;			//清除发送中断标志
	ES=1;			//开串口中断
	return c;
}

2、在主函数while(1)里添加串口相关函数:

unsigned int Value=666;
if(URX_Over == 1)
{
    URX_Over = 0;
	if(strncmp(URX, "A", 1) == 0) 
	{
		LEDx_ON(1);LEDx_OFF(2);
	}
	else if(strncmp(URX, "B", 1) == 0) 
	{
		printf("Value:%02bu.%01bu\r\n", (unsigned char)(Value/10),(unsigned char)(Value%10));
	}
	URX_Num = 0;
}

其中printf后跟随数据最好加(char)等强转数据类型,接收到的数据不会有问题。

方法二:使用sprintf函数

1、定义一个串口发送数组:

unsigned char idata UUU[20];

其中数组长度一定要大于等于需要发送的数据长度,可以写稍微大一点。

2、编写发送字符串函数:

void Uart_Sendstr(unsigned char *Uartstr)
{
  while(*Uartstr!='\0')
	{
	  SBUF = *Uartstr;
		while(TI == 0);
		TI = 0;
		Uartstr++;
	}
}

3、在主函数while(1)里添加串口相关函数:

unsigned int Value=666;
if(URX_Over == 1)
{
    URX_Over = 0;
	if(strncmp(URX, "A", 1) == 0) 
	{
		LEDx_ON(1);LEDx_OFF(2);
	}
	else if(strncmp(URX, "B", 1) == 0) 
	{
		sprintf(UUU,"Value:%02bu.%01bu\r\n", (unsigned char)(Value/10),(unsigned char)(Value%10));
        Uart_Sendstr(UUU);
	}
	URX_Num = 0;
}
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值