OpenEdv-开源电子网

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

请教串口发送问题

[复制链接]

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-9-22
在线时间
11 小时
发表于 2012-9-22 12:49:37 | 显示全部楼层 |阅读模式

           code[0]=0x35;
           code[1]=0x32;
           code[2]=0x3f;
           code[3]=0x3d;
           code[4]=0x3a;

         for (i=0;i<5;i++)
         {
        USART1->DR=code;
        while((USART1->SR&0X40)==0);
       }

这是我看《例说STM32》上介绍,操作寄存器发送串口的方法。
我定义了一个5位的数组,每次讲一位写进DR中,然后检测SR的第6位是否为1,来决定发送下一个。

为啥每次code[0]都不被发送。
如果,我将i=0;i<5;i++改为i=1;i<5;i++就也发发送2、3、4.code[1]不被发送?
这是为什么呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2012-9-18
在线时间
0 小时
发表于 2012-9-22 13:03:55 | 显示全部楼层
最好每次发送之后加一个delay_ms(200);我以前也这样试过,容易丢失数据。。我也不知道为什么。还有发送程序这样写貌似容易出错。void  Uart1_PutChar(u8 ch)

USART1->DR = (u8) ch;  
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕    
}

void Uart1_PutString(u8 *Buf, u8 Len)
{
u8 i;
for(i= 0; i<Len; i++)
  {
   Uart1_PutChar(*Buf++);
  }
}
可以试试这样两个。你发一个数组可以直接调用第二个。>
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-9-22
在线时间
11 小时
 楼主| 发表于 2012-9-22 13:54:47 | 显示全部楼层
           code[0]=0x85;
           code[1]=0x82;
           code[2]=0x8f;
           code[3]=0x8d;
           code[4]=0x8a;
                           Uart1_PutString(code[],5);

我这样写出错了。该怎样调用您的函数。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-9-22 15:06:10 | 显示全部楼层
{  
USART1->DR = (u8) ch;   
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕     

改为:
{  
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕     
USART1->DR = (u8) ch;   


我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-9-22
在线时间
11 小时
 楼主| 发表于 2012-9-22 17:37:20 | 显示全部楼层
 

TC要手工清除的。


TXE标志不需要专门去清除,指示发送缓冲器的状态。 与以前51单片机的TI不同。


 


TXE适用于连续发送,TC用于检查最后一个完全发出去(到管脚上)。
http://bbs.eeworld.com.cn/thread-253515-1-1.html
看到网上有人这么解释。主要是第一个TC要清零,是不是要手工清零?怎样在初始化的时候手工清零?

回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-9-22
在线时间
11 小时
 楼主| 发表于 2012-9-22 18:18:18 | 显示全部楼层
 

TC要手工清除的。


TXE标志不需要专门去清除,指示发送缓冲器的状态。 与以前51单片机的TI不同。


 


TXE适用于连续发送,TC用于检查最后一个完全发出去(到管脚上)。
http://bbs.eeworld.com.cn/thread-253515-1-1.html
看到网上有人这么解释。主要是第一个TC要清零,是不是要手工清零?怎样在初始化的时候手工清零?

回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-9-22
在线时间
11 小时
 楼主| 发表于 2012-9-22 19:20:59 | 显示全部楼层
回复【4楼】正点原子:
{   USART1->DR = (u8) ch;    while((USART1->SR&0X40)==0);//循环发送,直到发送完毕      }  改为: {   while((USART1->SR&0X40)==0);//循环发送,直到发送完毕      USART1->DR = (u8) ch;    }  
---------------------------------
OK了。得到想要的结果了。
但是,为什么换了个位置就不丢第一个数据了?跟TC清零有关?
执行了while语句就清零TC了?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 22:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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