蓝桥杯单片机串口通信收发

前言

在小蜜蜂老师的学习视频中,我们学习到了串口收发基础,实现了简单的上位机与单片机之间的通信,包括单字符接受命令,发送字符串等等。本节将介绍如何判断多字节接受命令,以及串口重定向的使用方法。


一、串口是什么?

串口,也称为串行端口或COM口,是一种用于串行数据传输的物理接口,通常用于连接计算机和其他设备(如调制解调器、打印机、传感器等)。串口传输一次只能传输一个比特位(bit),它可以通过串行通信协议来传输数据。串口通信是一种较慢但稳定、可靠的传输方式,通常用于与硬件设备进行通信、控制和监控。串口通信通过串口线连接,传输速度较慢,但可以实现长距离传输和点对点传输。

二、使用步骤

1.单字符接受命令

void UartInit()		//4800bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xCC;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
	ES=1;
	EA=1;
}

unsigned char command = 0x00;    //定义一个接受数据变量

void SendByte(unsigned char dat)   //上位机发送一个字符
{
	SBUF=dat;        //将数据传给SBUF
	while(TI==0);    //等待发送完成,硬件置一
		TI=0;         //软件清零
}

void ServiceUart() interrupt 4   //中断判断接受字符
{
	if(RI==1)     //如果接收到了数据,硬件置一
	{
	  command = SBUF;   //将数据传给变量
		RI=0;      //软件清零
	}
}

然后我们可以在其他地方对command进行判断了(以发送a为例)

if(command!=0&&command=='a') 
{
  command=0;
  
  //在这里放想让单片机做的事
  
}

这就是单字符命令接受的一个过程,那么其实多字符也是类似,我们只是将保存数据的变量换成了数组,在每次中断判断的时候依次存入数组。

2.多字符接受命令

unsigned char str[8];
unsigned char rev;
void Uartservice() interrupt 4
{
	if(RI==1)
	{
		RI=0;
		str[rev]=SBUF;    //依次存入数组
		rev++;
	}
}

判断过程我以第十届国赛为例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里注意,\r\n实际上就是回车,比如输入ST之后按下回车,系统会自动添加\r\n内容,当然想要手动打的话也是可以的。

void Uartworking()
{
	if(str[rev-1]=='\n')   //如果接受到的字符串最后一位为\n
	{
		unsigned char i;
		if(str[0]=='S'&&str[1]=='T')
		{
			//具体命令
		}
		else if(str[0]=='P'&&str[1]=='A'&&str[2]=='R'&&str[3]=='A')
		{
           //具体命令
		}
		else
		{
		   //具体命令
		}
		for(i=0;i<8;i++)    //加一个for循环将数组里的值清零
		{
			str[i]='\0';
		}
		rev=0;    //让数组从头开始存放
	}
}

3.重定向的使用

在比赛中,我们往往需要将单片机处理的数据实时返回给上位机,这个时候我们就可以对实现这个功能了。使用方法也很简单,是我们在c语言的学习中使用到的printf函数,但是使用重定向的话会占用单片机大量的资源,在使用的时候需要注意。

串口重定向是一种技术,用于将计算机上的一个串口连接到另一个位置,例如另一台计算机、网络服务器或专用设备。它允许用户通过串口连接到远程设备进行数据传输,就好像该设备直接连接到计算机一样。

串口重定向通常通过虚拟串口软件来实现,这些软件将计算机上的串口转换为虚拟串口,用户可以将其连接到远程设备,以便进行数据传输。这种技术通常用于数据采集、远程访问、远程控制等应用中。

首先包含stdio.h头文件

#include "stdio.h"

只需要写出一个函数就行了

char putchar(char ch)
{
	SendByte(ch);
	return ch;
}

在这里完善一下第十届国赛的串口部分
在这里插入图片描述

void Uartworking()
{
	if(str[rev-1]=='\n')
	{
		unsigned char i;
		if(str[0]=='S'&&str[1]=='T')
		{
		 //在此处需要对对接收到的数据进行一个强制转换,不转换的情况下返回的数据可能会出问题
			printf("$%d,%.2f\r\n",(int)dis,(float)(temp/100.0));     
		}
		else if(str[0]=='P'&&str[1]=='A'&&str[2]=='R'&&str[3]=='A')
		{
			printf("#%d,%d\r\n",(int)dis_sta,(int)temp_sta);
		}
		else
		{
			printf("ERROR\r\n");
		}
		for(i=0;i<8;i++)
		{
			str[i]='\0';
		}
		rev=0;
	}
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了在比赛中串口的使用。在以往的比赛中,串口的考察次数是非常少的,但是是一个非常重要的内容,每年国赛甚至于近两年的省赛都是一个考察热点,建议大家最好还是掌握。

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值