OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5784|回复: 3

一个串口通信的问题

[复制链接]

30

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2017-5-1
在线时间
63 小时
发表于 2018-3-10 20:00:24 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 BA2BA 于 2018-3-10 20:07 编辑

今天偶然去弄一个很早以前运行通过的串口通信实验例程,源代码中,有个功能,即按K1后,单片机会通过串口自动发送一个字符串给电脑,并显示在串口调试软件的接收窗口中,当我把K1这个按钮去掉,直接去运行K1这部分代码时,此部分代码却无法运行,不能自动发送字符串给PC,百思不得。
下面是部分代码:
uchar T1_com[]=" Receving Data:\0";                //发送的字符串

void K1_com(void)         //按键K1功能子函数
{
uchar i=0;
  if(!K1)                //按键是否按下
{
  while(T1_com!='\0') //发送预定字符是否完毕
  {
   SBUF=T1_com;      //发送预定字符
        while(!TI);          //判断字符是否发送完毕
         TI=0;               //停止发送字符
         i++;                //计数加1,返回发下个字符
        }
  }
}


下面是main部分代码
while(1)                 //循环
{
K1_com();                //调用按键子函数
  delay();                //按键间隔延时
  if(RI)                  //判断是否收到PC机串口信号
         {
          x=SBUF;              //收到的信号存X
          lcd1602_rendd(x);       //收到的数字送显示子函数显示
          SBUF=x;                 //收到数字送回串口
             while(!TI);            //判断串口发送是否完成
           TI=0;                  //停止发送字符

此后代码省略.
以上代码,当按下目标板上的K1时,自动发送设定好的字符串到PC

我把上面 void K1_com(void)  子函数改成如下代码
void usart_com(void)         //串口发送固定字符子函数
{
   while(T1_com!='\0') //发送预定字符是否完毕
  {
   SBUF=T1_com;      //发送预定字符
        while(!TI);          //判断字符是否发送完毕
         TI=0;               //停止发送字符
         i++;                //计数加1,返回发下个字符
        }
}


将main主程序中改为

void main(void)            //主程序开始
{
uchar x;
T1_com_init();            //调定时器1串口初始化子函数
LED0=0;                  //LED0点亮,
usart_com();
while(1)                 //循环
{
  if(RI)                  //判断是否收到PC机串口信号
         {
         
          x=SBUF;              //收到的信号存X
          SBUF=x;                 //收到数字送回串口
             while(!TI);            //判断串口发送是否完成
           TI=0;                  //停止发送字符
                RI=0;                  //停止接收字符
         }
  }


程序不能自动发送设置好的字符串,相当于跳过usart_com(); 子函数,直接运行后面的代码。


最佳答案

查看完整内容[请看2#楼]

经试验,发现修改后的程序没有问题,问题出在使用的芯片型号上,没修改前的使用的是AT89C51,用编程器向芯片写程序方式,修改后的是用在STC15W408上,直接通过串口写程序。其原因是STC15W408串口1只能写程序,无法完成对外的串口通信功能。 产生问题的原因找到了,但为什么STC15W408无法完成对外的串口通信功能,没搞懂。 问题已解决。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2017-5-1
在线时间
63 小时
 楼主| 发表于 2018-3-10 20:00:25 | 显示全部楼层
本帖最后由 BA2BA 于 2018-3-14 17:55 编辑

经试验,发现修改后的程序没有问题,问题出在使用的芯片型号上,没修改前的使用的是AT89C51,用编程器向芯片写程序方式,修改后的是用在STC15W408上,直接通过串口写程序。其原因是STC15W408串口1只能写程序,无法完成对外的串口通信功能。
产生问题的原因找到了,但为什么STC15W408无法完成对外的串口通信功能,没搞懂。

问题已解决。
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-3-10 21:50:42 | 显示全部楼层
i=0;
while(T1_com【i】!='\0')
回复

使用道具 举报

30

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2017-5-1
在线时间
63 小时
 楼主| 发表于 2018-3-12 08:58:11 | 显示全部楼层
本帖最后由 BA2BA 于 2018-3-12 09:01 编辑
275891381 发表于 2018-3-10 21:50
i=0;
while(T1_com【i】!='\0')

谢谢回复,不好意思,代码贴过来的时候,出现了失误,改后的代码是:

void usart_com(void)         //串口发送固定字符子函数
{
uchar i=0;
  while(T1_com【i】!='\0') //发送预定字符是否完毕
  {
   SBUF=T1_com【i】;      //发送预定字符
        while(!TI);          //判断字符是否发送完毕
         TI=0;               //停止发送字符
         i++;                //计数加1,返回发下个字符
        }
}
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-1 11:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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