OpenEdv-开源电子网

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

485通信程序疑问

[复制链接]

5

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2014-4-18
在线时间
4 小时
发表于 2016-1-16 21:30:37 | 显示全部楼层 |阅读模式
5金钱
这是原子哥的485发送程序:
void RS485_Send_Data(u8 *buf,u8 len)
{
        u8 t;
        RS485_TX_EN=1;                       
          for(t=0;t<len;t++)       
        {
                while((USART2->SR&0X40)==0);        //等待发送结束  
                USART2->DR=buf[t];
        }         
        while((USART2->SR&0X40)==0);       
        RS485_RX_CNT=0;          
        RS485_TX_EN=0;                                                       
}
其中下面这两句是不是应该调换一下位置
while((USART2->SR&0X40)==0);        //等待发送结束  
USART2->DR=buf[t];
应该是先发送才能判断到底有没有发送完成啊,如果while((USART2->SR&0X40)==0);这句在前面的话,岂不是一直卡在这里出不去了,SR寄存器的第六位TC是要在发送完一帧数据且TXE=1时硬 置1,如果那句放在前面 ,TC不是永远都是零
[img]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\296417781\QQ\WinTemp\RichOle\~UI3}{4[SOS7L@R$0}T3$8X.png[/img]



QQ图片20160116213427.png

最佳答案

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

不会有问题,但是的确会造成误解。 你的问题在于第一次进入时如果是已经发送完成且为0,那么就死在这了。 1、初始化串口时,将TXE置1的同时,TC也会置1,所以第一次进入该函数时不会死, 2、再次进入该函数时,由于上次出函数的时候又没有清除该位,它上次发完保持为1当然还是1。 原子哥的这种写法的确有冒险,支持你。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-16 21:30:38 | 显示全部楼层
本帖最后由 xkwy 于 2016-1-17 17:53 编辑

不会有问题,但是的确会造成误解。
tc.png

你的问题在于第一次进入时如果是已经发送完成且为0,那么就死在这了。
1、初始化串口时,将TXE置1的同时,TC也会置1,所以第一次进入该函数时不会死,
2、再次进入该函数时,由于上次出函数的时候又没有清除该位,它上次发完保持为1当然还是1。



原子哥的这种写法的确有冒险,支持你。

坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

5

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2014-4-18
在线时间
4 小时
 楼主| 发表于 2016-1-18 15:56:49 | 显示全部楼层
xkwy 发表于 2016-1-16 21:30
不会有问题,但是的确会造成误解。

问题是在初始化串口的时候,有关串口2 的设置就下面几句,没有设置TXE的值啊,只设置了UE,TE,RE,PE和RXNE
        USART2->BRR=mantissa;        
        USART2->CR1|=0X200C;         
#ifdef EN_USART2_RX                  
        USART2->CR1|=1<<8;   
        USART2->CR1|=1<<5;           
        UCTX_NVIC_Init(3,3,USART2_IRQChannel,5);
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-18 19:29:00 | 显示全部楼层
所以我说这样冒险嘛,可能STM32的设计师想到程序员可能会这么做,在USART设置TE时候附带把TC置位了
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 00:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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