串口是非常常用的一个调试工具,我们都必须熟练使用串口的各个功能。
1.题目要求和解决方案
我们要做的是,电脑端发送字符串过来给单片机,然后单片机这边接收完之后要回复给电脑端,回复内容为“接收完成!”。单片机这边把接收到的数据存放在定义好的全局变量数组里面,我们可以通过按K4发送回去给电脑端查看刚刚接收到的内容并把它显示出来。
我们要知道,一个汉字是需要两个字节内存的,比如电脑端发送的字符串为“好好学习,天天向上!”其中的两个标点符号也是中文输入法打上的话,一个标点符号也是占用两个字节,这个字符串就是一共占用10*2=20个字节内存。
那么怎样判断是否把字符串的数据都接收完成了呢?我们参考了宋老师的编程思想,使用定时计数器,也就是让定时器0使用工作模式1计时,接收到第一个数据的时候我们先把TH0和TL0清0,然后打开定时器开始计时,当接收到第二个数据的时候又把TH0和TL0清0让他们从0开始再次计时,直到当TH0大于等于200的时候证明时间过去了50ms左右( 200*256*(12/11059200)= 0.055秒 ),如果在这50ms里面都不再接收地到数据,那么断定已经把字符串的数据都接收完成。
我们程序里定义的数组有关键字pdata,大家在《手把手教你学51单片机》文档10.4节了解一下知识点即可。
2.main.c测试代码
#include #include #include u8 uart_i=0; u8 pdata RXDBUF[64]; void COUNT_TIMES() { TMOD&=0xF0; //清0低四位 TMOD|=0x01; //设置定时器0为工作模式1 } void main() { u8 key,x; KEY_Init(); //初始化按键模块 EA = 1; //闭合总中断开关 COUNT_TIMES(); //初始化计数器 ConfigUART(9600); while(1) { key=KEY_Scan(0,500); if(key==4) { printf_str("收到的内容为:rn"); printf_str(RXDBUF); //把接收到的字符串发送给电脑端 for(x=0;x<64;x++)RXDBUF[x]=0x00; //发送完接收到的字符串之后,内存区全部清除数据,统一改为0x00以便下次接收新的字符串 } if(TH0>=200) //判断是否把数据接收完毕 { TR0=0; //关闭定时器,停止计时 printf_str("rn接收完成!rn"); RXDBUF[uart_i]='