找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4130|回复: 6
打印 上一主题 下一主题
收起左侧

如何将字符串数据发送到单片机再返回PC?

[复制链接]
跳转到指定楼层
楼主
ID:300673 发表于 2018-4-2 10:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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

1.38 MB, 下载次数: 10

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:324374 发表于 2018-9-19 20:35 | 只看该作者
现在我也面临着这个问题,不知道楼主解决了没有?要是解决了能否告诉我要如何改动?
回复

使用道具 举报

板凳
ID:70048 发表于 2018-9-19 21:56 | 只看该作者
字符传输 是不是应该是16进制的 你在串口接收到是什么
回复

使用道具 举报

地板
ID:70048 发表于 2018-9-19 21:57 | 只看该作者
串口通信 之间是不是应该是16进制通信 你在串口助手接收到的是乱码 还是16进制数
回复

使用道具 举报

5#
ID:387733 发表于 2018-9-20 08:45 | 只看该作者
字符串变量要设置成全局变量,或者是静态变量。你现在是局部临时变量,每次进入中断才有效,存入的字符中断返回时不再保留。修改后字符成功的原因就是 receiveData 只在中断中使用一次,不需要保留。
回复

使用道具 举报

6#
ID:398663 发表于 2018-9-20 11:11 | 只看该作者
问题在于进行 receiveData[j]!='/0' 这个判断的时候这个数组没有存入任何东西,所以直接跳出;又由于RI清零的操作在这个循环里面,所以程序不断进入中断,不断发送receive后又跳出。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表