OpenEdv-开源电子网

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

各位兄弟姐妹,小弟初学stm32f103,现在我想用串口接收一个固定长度的数组,但是收的数据不对?

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-4-19
在线时间
2 小时
发表于 2018-4-19 09:40:59 | 显示全部楼层 |阅读模式
1金钱

按下两次发送

按下两次发送

按下3次发送

按下3次发送

按下一次发送

按下一次发送

main函数while(1)

main函数while(1)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-4-19 09:49:44 | 显示全部楼层
接收中断里面没有清标志位
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-4-19 09:58:08 | 显示全部楼层
第一:发送数据之后等待发送完成,第二:想想第一次8个数据发送完成后,你的num是不是已经是8了,再来一个数据是不是又直接开始发送了?第三:开辟这么大的数组干啥,浪费了
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-4-19
在线时间
2 小时
 楼主| 发表于 2018-4-19 10:00:11 | 显示全部楼层
HXYDJ 发表于 2018-4-19 09:49
接收中断里面没有清标志位

recvFlag=0,清标志位
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-4-19
在线时间
2 小时
 楼主| 发表于 2018-4-19 10:19:29 | 显示全部楼层
szczyb1314 发表于 2018-4-19 09:58
第一:发送数据之后等待发送完成,第二:想想第一次8个数据发送完成后,你的num是不是已经是8了,再来一个 ...

这一行改一下  USART_SendData(USART1,rx_buf[num]);
另外我想数据随便发,但是我只想收前8 个数据
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-4-19
在线时间
2 小时
 楼主| 发表于 2018-4-19 10:46:32 | 显示全部楼层
welcomeplay 发表于 2018-4-19 10:19
这一行改一下  USART_SendData(USART1,rx_buf[num]);
另外我想数据随便发,但是我只想收前8 个数据

uint8_t rx_buf[1024];
uint16_t num=0;
uint8_t recvFlag = 0;
uint8_t i;
void USART1_IRQHandler(void)
   {
      if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
        {
                                       
                                        rx_buf[num++]=USART_ReceiveData(USART1);
                                       
                                        if(num>7)
                                                        {
                                                         num=0;
                                                         recvFlag=1;
                                                        }
                                }
                                                                                 
                                               
          }

int main(void)
{
         uint16_t i;
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
         delay_init();
         My_USART1_Init();
         while(1)
         {
                                if(recvFlag){                                                    
                                         recvFlag=0;
                                         for(i=0;i<8;i++){                                                                                                               
                                           USART_SendData(USART1,rx_buf[i++]);
                                                 delay_ms(5);
            }
                 }
                }
        }


我改了一下还是这样
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2013-12-28
在线时间
26 小时
发表于 2018-4-19 10:56:50 | 显示全部楼层
for(i=0;i<8;i++)
{   
  USART1->DR = rx_buf[i]-0x30;
  while((USART1->SR&0X40)==0);   
}
  可以试试
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-4-19
在线时间
2 小时
 楼主| 发表于 2018-4-19 11:05:38 | 显示全部楼层
lzh 发表于 2018-4-19 10:56
for(i=0;iDR = rx_buf-0x30;
  while((USART1->SR&0X40)==0);   
}

                   *  
不行
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2013-12-28
在线时间
26 小时
发表于 2018-4-19 11:14:56 | 显示全部楼层
中断里面那样写,有可能造成数据没发完,又开始从数组0开始写入了。收一次发一次最好限制接收位数,收完了再发。边收边发就弄个循环数组
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2013-12-28
在线时间
26 小时
发表于 2018-4-19 11:30:42 | 显示全部楼层
本帖最后由 lzh 于 2018-4-19 11:50 编辑

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
{                                                                              
if(num<8)
{
  rx_buf[num++]=USART_ReceiveData(USART1);
  if(num==8)recvFlag=1;
}
}
                                                                                 
if(recvFlag){                                                   

for(i=0;i<8;i++)
{                                                                                                               
USART_SendData(USART1, rx_buf);

}
recvFlag=0;
num=0;
}


回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 08:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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