标题:
新手疑惑 关于C51单片机串口通讯的问题,挺急的在线等
[打印本页]
作者:
2432606985
时间:
2018-7-31 23:08
标题:
新手疑惑 关于C51单片机串口通讯的问题,挺急的在线等
各位好,本人由于刚刚接触51单片机,在学习串口通讯中遇到了困难,
{~}]@@8K`T7{0QJAWV]A8{8.png
(47.94 KB, 下载次数: 56)
下载附件
2018-7-31 23:07 上传
问题是:
由串口助手输入字符串后,再返回到串口助手上的字符串却有丢失,丢失的特点为,间隔丢失。
自己的理解:
函数中有比较函数 strstr(),输入ready后,可以继续运行(led会灭)
所以rec数组所存的是输入串口助手中的字符串,但显示出来却是“ray”,
应该是send_str()函数有问题,但找不出原因。
请求老手指点!不胜感激!!
由于是新手,如果能够解释得清楚一些就更好了!
下面是我的源码:
#include "reg52.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED=P2^0;
u8 rec_ct=0; //记录接收数据的位数
u8 rec_flag=0; //接收完成标志
u8 rec[10]; //定义一个数组
void delay3s(void) //延时3s,误差 0us
{
unsigned char a,b,c;
for(c=254;c>0;c--)
for(b=96;b>0;b--)
for(a=60;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void delay500ms(void) //延时0.5s,误差 0us
{
unsigned char a,b,c;
for(c=205;c>0;c--)
for(b=116;b>0;b--)
for(a=9;a>0;a--);
}
void UsartInit() //串口初始化
{
SCON=0x50; //串口设置
TMOD=0X20; //T1计数器设置
PCON=0x80; //倍增打开
TH1=0xf3;
TL1=0xf3; //波特率设为4800;
EA=1; //IE设置
ES=1;
TR1=1; //开始计数
}
void send_str() //发送接收到的字符串
{
u8 i;
for(i=0;i<10;i++)
{
SBUF=rec[i];
while(!TI);
TI=0;
i++;
}
}
void Ustar() interrupt 4
{
if(RI==1)
{
RI=0;
rec[rec_ct]=SBUF; //接收串口数据
rec_ct++;
if(rec_ct==10) rec_ct=0; //防止溢出
rec_flag = 1;
}
}
void main()
{
u8 ct;
UsartInit();
start:
ct = 0;
while(1)
{
LED=0; //这个灯作为指示灯
delay3s(); //等待3S
if(rec_flag == 1) //串口接收到数据
{
rec_flag = 0;
send_str(); //发送接收到的字符串
if(strstr(rec, "ready")) //有没有ready
{
P2 = 0xff; //接收到正确的回复就灭
delay500ms();
break;
}
}
ct ++;
if(ct>=3) goto start; //超过三次重新开始
}
while(1);
}
复制代码
作者:
多德
时间:
2018-7-31 23:08
你的send_str函数里面已经在for循环里将i++了,然后你TI = 0;后依然i++。检查一下。
void send_str(void) //发送接收到的字符串
{
u8 i;
for(i=0; i<10; i++)
{
TI = 0;
SBUF=rec[i];
while(!TI);
TI = 0;
}
}
作者:
guangshi_wq
时间:
2018-8-1 01:21
把发送也要写到中断里,不能这样写
作者:
guangshi_wq
时间:
2018-8-1 01:22
象这样写.
void intSIO() interrupt 4 using 2
{
if(TI){
TI=OFF;
if(bSD){
if(curSND<lenSND) SBUF=bufSND[curSND++];
else {bSD=OFF;/*mSI=0;*/}}}
if(RI){
RI=OFF;
bufRCV[putRCV++]=SBUF;
putRCV &= 0X07;}
}
作者:
2432606985
时间:
2018-8-1 07:38
那请问将发送写入中断后,如何触发TI=1的条件呢?如果不能触发TI=1就不能将数据写入SBUF,而数据没有写入SBUF,就无法触发TI=1的条件,这是个死循环啊。。。。。。 我的理解是这样的
作者:
fht@51hei
时间:
2018-8-1 09:39
void intSIO() interrupt 4 using 2
{
if(TI)
{
TI=OFF;
if(bSD)
{
if(curSND<lenSND) SBUF=bufSND[curSND++];
else {bSD=OFF;/*mSI=0;*/}}}
if(RI){
RI=OFF;
bufRCV[putRCV++]=SBUF;
putRCV &= 0X07;}
}
作者:
2432606985
时间:
2018-8-2 08:21
谢谢各位前辈给我的建议和热心的解答!但是我的问题是为什么会出现这样的情况以及解决方法,最佳答案只能给解决了这两个问题的人哈。大家对我编程的建议我都应用在后续程序中了,使得逻辑更加清晰了,非常感谢!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1