本文总结了两种比较简单的关于串口发送接收的程序,以下是步骤:
定义数据:
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;
}