OpenEdv-开源电子网

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

请教一下原子哥和各位大神,关于串口接收数据的小问题

[复制链接]

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
发表于 2018-9-19 09:57:12 | 显示全部楼层 |阅读模式
1金钱
请教一下原子哥和各位大神,关于串口接收数据的小问题。我用串口1接收一段数组,把这段数组存储到RES里,我想把RES的第5个数提取出来用串口2发送出去,这个代码应该怎么写呢。我写的代码发出的都是乱码

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

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2018-9-19 10:01:35 | 显示全部楼层
这是我写的,发出去的都是乱码
oid USART1_IRQHandler(void)   
{
       
          u8 res;
        if(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET)
       {        
                res=USART_ReceiveData(USART1);       
                               
                EmeterReceBuf[USART1Rlen]=res;                       
                                   Emeter_Rd_RecProcess();
                               
        }
                                       
}
u8  Emeter_Rd_RecProcess(void)
{       
   
        USART_SendData(USART2,EmeterReceBuf[5]);


}
希望大家帮助我一下
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-9-19 10:19:34 | 显示全部楼层
USART_SendData(USART1,EmeterReceBuf[4]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

10

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1759
金钱
1759
注册时间
2017-10-9
在线时间
147 小时
发表于 2018-9-19 10:20:00 | 显示全部楼层
你的EmeterReceBuf数组的组数长度USART1len是随机数(若你的USART1len变量没有初始化,子程序每调用一次,这个值就会刷新改变一次(也是随机 的)),每次接收到新的数据后,只把新的位置(也就是这个随机数对应的位置)的数据更新,你的EmeterReceBuf[5]的数据一值是一个垃圾数,所以你的数据发送出来后是不正确的;


建议修改:
USART1Rlen = 0;

if(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET)
       {        
               
               res=USART_ReceiveData(USART1);        
                                
                EmeterReceBuf[USART1Rlen]=res;  
                 
if(USART1Rlen  == 5)   
{
Emeter_Rd_RecProcess();
}                              

       USART1Rlen ++;
                                
        }

语法格式不要在意,你自己对齐就行,个人拙见而已,如果不正确请不要责备!!!
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2018-9-19 10:20:41 | 显示全部楼层
1208 发表于 2018-9-19 10:19
USART_SendData(USART1,EmeterReceBuf[4]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);

大神,是吧你写的这两行替换我写的那个吗
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2018-9-19 10:22:23 | 显示全部楼层
千湖 发表于 2018-9-19 10:20
你的EmeterReceBuf数组的组数长度USART1len是随机数(若你的USART1len变量没有初始化,子程序每调用一次, ...

谢谢了,我改下试试
回复

使用道具 举报

10

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1759
金钱
1759
注册时间
2017-10-9
在线时间
147 小时
发表于 2018-9-19 10:28:09 | 显示全部楼层
支持者2400 发表于 2018-9-19 10:22
谢谢了,我改下试试

这个是我写的,
回复

使用道具 举报

10

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1759
金钱
1759
注册时间
2017-10-9
在线时间
147 小时
发表于 2018-9-19 10:28:32 | 显示全部楼层
支持者2400 发表于 2018-9-19 10:20
大神,是吧你写的这两行替换我写的那个吗

这个不是
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-9-19 11:04:17 | 显示全部楼层
感觉4楼说得挺好得,调出来结果怎么样
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-9-19 11:06:04 | 显示全部楼层
接收数据的数组下标没有增加,在接收中加上 USART1Rlen++;
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2018-9-19 11:07:04 | 显示全部楼层
HXYDJ 发表于 2018-9-19 11:06
接收数据的数组下标没有增加,在接收中加上 USART1Rlen++;

刚才被电了,220V
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2018-9-19 13:30:08 | 显示全部楼层
千湖 发表于 2018-9-19 10:20
你的EmeterReceBuf数组的组数长度USART1len是随机数(若你的USART1len变量没有初始化,子程序每调用一次, ...

大神,我试了,按理来说,第五个码不是00,但是串口调试助手里收到的一直都是00,这是什么情况啊
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2018-9-19 13:30:42 | 显示全部楼层
1208 发表于 2018-9-19 11:04
感觉4楼说得挺好得,调出来结果怎么样

结果是00,没收到真正的码
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
发表于 2018-9-19 14:31:07 | 显示全部楼层
调试 看你的RBUF里面有没有收到数据。如果有就是你发送有问题
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2018-9-19 14:37:12 | 显示全部楼层
不學會32不改名 发表于 2018-9-19 14:31
调试 看你的RBUF里面有没有收到数据。如果有就是你发送有问题

单片机接收到的是正确完整的数组
回复

使用道具 举报

0

主题

113

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3321
金钱
3321
注册时间
2017-12-14
在线时间
406 小时
发表于 2018-9-19 15:45:33 | 显示全部楼层
USART1Rlen = 0;
void USART1_IRQHandler(void)   
{
  u8 res;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET)
       {        
               
               res=USART_ReceiveData(USART1);        
                                
                EmeterReceBuf[USART1Rlen]=res;  
                 
if(USART1Rlen  == 5)   
{
USART_SendData(USART2,EmeterReceBuf[4]);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
}                              

       USART1Rlen ++;
                                
        }
}
用这个就行了
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
发表于 2018-9-19 15:50:36 | 显示全部楼层
本帖最后由 不學會32不改名 于 2018-9-19 15:55 编辑
支持者2400 发表于 2018-9-19 14:37
单片机接收到的是正确完整的数组
#define   send_char   4
USART1_IRQHandler(void)    //接收中断,将收到的数据放入接收缓冲区
{
        
          u8 res;
        if(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET)
       {        
                res=USART_ReceiveData(USART1);        
                                
                EmeterReceBuf[USART1Rlen]=res;   
                    if(USART1Rlen  ==  send_char  )                    {
                            Emeter_Send_char();
                     }
                USART1Rlen++;
                 
              USART_ClearFlag(USART1,USART_FLAG_RXNE);
              USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                                
        }}

Emeter_Send_char(void)  //发送一个字节
{
      u8   usart_send  =  0;
    if(usart_send == 0)
    {
         usart_send = 1;
         
     USART_SendData(USART2,EmeterReceBuf[4]);
     while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
    {
       usart_send == 0;
     }
   }
}


回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2018-9-19 16:24:51 | 显示全部楼层
feichangkunge 发表于 2018-9-19 15:45
USART1Rlen = 0;
void USART1_IRQHandler(void)   
{

这次确实成功了,谢谢大佬,但是每次只接受到一个,如果我想一次多接几个怎么办呢
回复

使用道具 举报

210

主题

773

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2018-3-26
在线时间
288 小时
 楼主| 发表于 2018-9-19 16:30:05 | 显示全部楼层
不學會32不改名 发表于 2018-9-19 15:50
#define   send_char   4
USART1_IRQHandler(void)    //接收中断,将收到的数据放入接收缓冲区
{

谢谢大佬
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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