标题:
如何将字符串数据发送到单片机再返回PC?
[打印本页]
作者:
Michael1999
时间:
2018-4-2 10:45
标题:
如何将字符串数据发送到单片机再返回PC?
本帖最后由 Michael1999 于 2018-4-2 10:46 编辑
单片机萌新,刚学习串口通信,现在实现了将单个字符数据发送到单片机再返回PC,但是换成字符串数据实现不了。
我大致的思路是,变量定义为字符数组,一个个字符发送,以 '\0' 为终点,与代码中发送字符串数组 str[] 类似。
但是现象,就是在死循环了。
以下是我的代码:
#include <reg52.h>
typedef unsigned char uchar;
uchar str[]={"Receive: "};
void UartInit() //初始化
{
SCON=0x50; //SM1=1,方式1;REN=1,使允许接收;
TMOD=0x20; //定时器1,方式2;
PCON=0x80; //波特率倍增;
TH1=0xf3; //波特率为4800;
TL1=0xf3;
ES=1; //打开串口中断
EA=1; //打开总中断
TR1=1; //启动定时器
}
void main() //主函数
{
UartInit(); //初始化
while(1);
}
void Uart() interrupt 4 //中断函数
{
uchar receiveData[100],i,j; //定义字符数组receiveData[]用于存放接收的字符串
while(str!='\0') //在返回数据前加“Receive: ”
{
SBUF=str; //从字符数组中取字符
i++; //自加,发送下一位的字符
while(!TI); //是否发送成功
TI=0; //若发送完毕,TI清零,等待下一次发送中断
}
i=0; //i清零,到下一组数据时进行加“Receive: ”
while(receiveData[j]!='\0')
//将字符数组中的数据逐个字符接收再发送
{
receiveData[j]=SBUF;
//接收字符
RI=0;
//接收完毕,RI清零,等待下一次接收
SBUF=receiveData[j];
//发送字符
j++; //
自加,接收下一位的字符
while(!TI)
//是否发送成功
TI=0;
//若发送完毕,TI清零,等待下一次发送中断
}
j=0;
//j清零,等待下一组数据进行接收与发送
}
而把 receiveData 定义为uchar型变量,然后把红色部分代码替换成以下代码,能实现字符数据的通信:
receiveData=SBUF;
RI=0;
SBUF=receiveData;
while(!TI);
TI=0;
附件里是两种实现的情况,字符数据是成功的,然而字符串数据失败了。
求过路大神出手相助!
录屏.rar
2018-4-2 10:46 上传
点击文件名下载附件
1.38 MB, 下载次数: 10
作者:
六月六月
时间:
2018-9-19 20:35
现在我也面临着这个问题,不知道楼主解决了没有?要是解决了能否告诉我要如何改动?
作者:
乐在旅途
时间:
2018-9-19 21:56
字符传输 是不是应该是16进制的 你在串口接收到是什么
作者:
乐在旅途
时间:
2018-9-19 21:57
串口通信 之间是不是应该是16进制通信 你在串口助手接收到的是乱码 还是16进制数
作者:
sxhwdz
时间:
2018-9-20 08:45
字符串变量要设置成全局变量,或者是静态变量。你现在是局部临时变量,每次进入中断才有效,存入的字符中断返回时不再保留。修改后字符成功的原因就是 receiveData 只在中断中使用一次,不需要保留。
作者:
grizzly
时间:
2018-9-20 11:11
问题在于进行 receiveData[j]!='/0' 这个判断的时候这个数组没有存入任何东西,所以直接跳出;又由于RI清零的操作在这个循环里面,所以程序不断进入中断,不断发送receive后又跳出。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1