OpenEdv-开源电子网

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

大家帮我看一下这个小程序,为什么数据发不出去呢?

[复制链接]

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
发表于 2018-9-29 10:09:48 | 显示全部楼层 |阅读模式
1金钱
[mw_shl_code=applescript,true]void Emeter_Rd_Addre(void)
{
   
    u8 cs                                          = 0;
    EmeterSendLen                                    = 0;
       
          
    EmeterSendBuf[EmeterSendLen++] = 0x68;
    EmeterSendBuf[EmeterSendLen++] = 0xAA;
       
    EmeterSendBuf[EmeterSendLen++] = 0xAA;
    EmeterSendBuf[EmeterSendLen++] = 0xAA;
    EmeterSendBuf[EmeterSendLen++] = 0xAA;
    EmeterSendBuf[EmeterSendLen++] = 0xAA;
    EmeterSendBuf[EmeterSendLen++] = 0xAA;
    EmeterSendBuf[EmeterSendLen++] = 0x68;
    EmeterSendBuf[EmeterSendLen++] = RD_ADRR_SEND;
       
    EmeterSendBuf[EmeterSendLen++] = 0x00;
    cs = CS_Create (EmeterSendBuf,EmeterSendLen);
    EmeterSendBuf[EmeterSendLen++] = cs;  
    EmeterSendBuf[EmeterSendLen++] = 0x16;         
        
          Send_Data(EmeterSendBuf, EmeterSendLen);
   
    delay_ms(100);  
   
         
          
//    USART1_IRQHandler();
   
}



void Send_Data(u8 *pucStr, u8 ulNum)
{
u8 i;
for(i = 0;i<ulNum;i++)
{
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET)  
    USART_SendData(USART2,*pucStr++);
}  

}[/mw_shl_code]

最佳答案

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

你的发送函数有问题!你的for循环跟它底下的符合语句根本就存在矛盾。 你的while 循环根本就只会执行一次知道不,甚至可能一次都执行不到,因为你发送标志位根本没有清除呀,例程没好好看呦! 给你两个发送函数吧,你自己看看就知道了: /*发送单个字节数据*/ void Uart_SendChar( USART_TypeDef* USARTx , u16 data) { USART_SendData(USARTx,data); while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) != SET); //Clear ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2018-9-27
在线时间
12 小时
发表于 2018-9-29 10:09:49 | 显示全部楼层
你的发送函数有问题!你的for循环跟它底下的符合语句根本就存在矛盾。 你的while 循环根本就只会执行一次知道不,甚至可能一次都执行不到,因为你发送标志位根本没有清除呀,例程没好好看呦!
给你两个发送函数吧,你自己看看就知道了:
/*发送单个字节数据*/
void Uart_SendChar( USART_TypeDef* USARTx , u16 data)
{
        USART_SendData(USARTx,data);
        while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) != SET);
        //ClearWatchDog();
        USART_ClearFlag(USARTx,USART_FLAG_TC);
}


/*发送一串字节数据--数组、字符串*/
void Uart_transmit( USART_TypeDef* USARTx , u8 *data , u16 Len)
{
        u16 i;
        //RS485_TX_EN=1;       
        for(i=0 ; i<Len ; i++)
        {
                USART_SendData(USARTx,data[i]);
                while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) != SET);
                //ClearWatchDog();
                USART_ClearFlag(USARTx,USART_FLAG_TC);
        }
        //RS485_TX_EN=0;       
}
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2018-9-29 10:25:47 | 显示全部楼层
我用串口调试助手往电脑端发送数据,为什么一个数据都接收不到呢
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2018-9-27
在线时间
12 小时
发表于 2018-9-29 11:30:57 | 显示全部楼层
对了,不知道你串口初始化的时候有没有请标志位,最好清除一下在初始化函数里:USART_ClearFlag(USARTx, USART_FLAG_TC);
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2018-9-29 12:54:13 | 显示全部楼层
cxy123321 发表于 2018-9-29 11:30
对了,不知道你串口初始化的时候有没有请标志位,最好清除一下在初始化函数里:USART_ClearFlag(USARTx, US ...

谢谢大神
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2018-9-30 08:06:05 | 显示全部楼层
cxy123321 发表于 2018-9-29 11:30
对了,不知道你串口初始化的时候有没有请标志位,最好清除一下在初始化函数里:USART_ClearFlag(USARTx, US ...

大神,我试了,还是发不出去
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2018-9-27
在线时间
12 小时
发表于 2018-9-30 10:15:57 | 显示全部楼层
先确认你的串口初始化函数有没有加入清除发送标志的代码“USART_ClearFlag(USART2, USART_FLAG_TC);”不行你可以试一下用printf来打印输出,看是不是发送函数的问题,不过我认为啊上面改完之后是没问题的。有问题的话应该在别的地方了,比如你的串口初始化函数咋写的,或者说你程序根本就没有运行到串口初始化函数被调用的地方(还没初始化),又或者说你初始化完之后又动了串口的初始化引脚导致引脚被占用(还是初始化失败)。。。。。。这些你最好先确认一下,如果有仿真器最好了,设一下断点就行了,不知道你外部的代码是什么情况也不太好判断问题所在。当然,还有可能是你物理链接有问题或串口波特率不对。
下面是printf输出,把他全部放到串口初始化文件里面就行了,把你的SendData()换成下面那个试试,如果还是不行,那很有可能就是上面的初始化或者连接问题。
[mw_shl_code=applescript,true]#include “stdio.h”

int fputc(int ch,FILE *p)  //printf串口重映射。函数默认的,在使用printf函数时自动调用
{
        USART_SendData(USART2,(u8)ch);       
        while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
        return ch;
}


/*printf发送函数--默认你的串口2*/
void SendData(u8*buf,u16 Len)
{
        u16 i;
        for(i=0;i<Len;i++)
        {
                printf(" %d",buf);
        }
}[/mw_shl_code]
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 07:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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