前言
在小蜜蜂老师的学习视频中,我们学习到了串口收发基础,实现了简单的上位机与单片机之间的通信,包括单字符接受命令,发送字符串等等。本节将介绍如何判断多字节接受命令,以及串口重定向的使用方法。
一、串口是什么?
串口,也称为串行端口或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;
}
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了在比赛中串口的使用。在以往的比赛中,串口的考察次数是非常少的,但是是一个非常重要的内容,每年国赛甚至于近两年的省赛都是一个考察热点,建议大家最好还是掌握。