OpenEdv-开源电子网

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

关于串口接收的首字符的问题

[复制链接]

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2017-12-27
在线时间
20 小时
发表于 2020-10-20 14:56:23 | 显示全部楼层 |阅读模式
1金钱
最近测试F4串口接收程序,发现一些不理解的问题:
串口在单片机复位之后第一次接收的数据Array2[]和发送的数据Array1[]是一样的 ,即 Array2[] == Array1[] ;

之后每次接收到的数据Array4[]和发送的数据Array3[]都不一样,而且有一个共同的特点,即 Array4[] == ‘0x00’+Array3[],就是说每次接受到的数据 第一个byte都是0x00,从第二个byte开始才是发送的数据。


请问各位朋友,这是怎么回事?有什么解决办法?

谢谢各位解答!

说明:
数据末尾使用 0x0d,0x0a作为结束符。


  1. void DEBUG_USART_IRQHandler(void)
  2. {

  3.     static u8 ucTemp[2]= {0x00, 0x00};
  4.     static u8 i=0 ;

  5.     if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)//  && (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_ORE) != RESET) )
  6.     {

  7.         USART_ClearFlag(DEBUG_USARTx,USART_FLAG_ORE);
  8.                
  9.         gu8_USART_RX_BUFF[usart_buffer_len] = USART_ReceiveData( DEBUG_USARTx );
  10.         if(usart_buffer_len > 4 )
  11.         {
  12.             if( gu8_USART_RX_BUFF[usart_buffer_len-1] == 0x0D && gu8_USART_RX_BUFF[usart_buffer_len] == 0x0A)//  &&    i == (gu8_USART_RX_BUFF[1] -1) )
复制代码



首字符错误的数据

首字符错误的数据

正常数据

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

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2017-12-27
在线时间
20 小时
 楼主| 发表于 2020-10-20 15:03:23 | 显示全部楼层
  1. void DEBUG_USART_IRQHandler(void)
  2. {

  3.     static u8 ucTemp[2]= {0x00, 0x00};
  4.     static u8 i=0 ;

  5.     if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)//  && (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_ORE) != RESET) )
  6.     {
  7.         USART_ClearFlag(DEBUG_USARTx,USART_FLAG_ORE);
  8.                
  9.         gu8_USART_RX_BUFF[usart_buffer_len] = USART_ReceiveData( DEBUG_USARTx );
  10.                 if(usart_buffer_len > 4 )
  11.                 {
  12.                         if( gu8_USART_RX_BUFF[usart_buffer_len-1] == 0x0D && gu8_USART_RX_BUFF[usart_buffer_len] == 0x0A)//  &&    i == (gu8_USART_RX_BUFF[1] -1) )
  13.                         {
  14.                                 USART_RX_FLAG = 1;
  15.                                 gu8_USART_RX_BUFF_LEN = usart_buffer_len- 1;
  16.                                 gu8_USART_RX_BUFF[usart_buffer_len-1] = 0x00;
  17.                                 gu8_USART_RX_BUFF[usart_buffer_len] = 0x00;
  18.                                 usart_buffer_len = 0;
  19.                         }
  20.         }
  21.                 usart_buffer_len++;       
  22.                 if( usart_buffer_len>= gu8_USART_RX_BUFF_SIZE )
  23.                         usart_buffer_len=0;
  24.     }
  25. }
复制代码
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4477
金钱
4477
注册时间
2013-4-22
在线时间
336 小时
发表于 2020-10-20 16:58:46 | 显示全部楼层
调试看一下是不是一直进if( gu8_USART_RX_BUFF[usart_buffer_len-1] == 0x0D && gu8_USART_RX_BUFF[usart_buffer_len] == 0x0A)//  &&    i == (gu8_USART_RX_BUFF[1] -1) )
                        {
                                USART_RX_FLAG = 1;
                                gu8_USART_RX_BUFF_LEN = usart_buffer_len- 1;
                                gu8_USART_RX_BUFF[usart_buffer_len-1] = 0x00;
                                gu8_USART_RX_BUFF[usart_buffer_len] = 0x00;
                                usart_buffer_len = 0;
                        }这里面
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2017-12-27
在线时间
20 小时
 楼主| 发表于 2020-10-20 17:16:17 | 显示全部楼层
三叶草 发表于 2020-10-20 16:58
调试看一下是不是一直进if( gu8_USART_RX_BUFF == 0x0D && gu8_USART_RX_BUFF == 0x0A)//  &&    i == (gu8 ...

不是的,只有接收到结束标识才会进去,比如串口助手发送 16进制数组(""内的数据)“FF 0B 02 30 00 00 00 B4 63 0D 0A ”,只有连续接收到 0D 0A 这两个数值才会进去if()里面,一次发送只会进去一次。
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4477
金钱
4477
注册时间
2013-4-22
在线时间
336 小时
发表于 2020-10-21 09:04:36 | 显示全部楼层
貌似发送有问题
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2017-12-27
在线时间
20 小时
 楼主| 发表于 2020-10-21 14:33:12 | 显示全部楼层

发送端,用虚拟串口查看收发数据没问题,用串口监视软件看没问题,用逻辑分析仪测试信号也没问题,就是接收端的问题。怎么也想不明白。
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-10-21 16:37:25 | 显示全部楼层
本帖最后由 ufbycd 于 2020-10-21 16:41 编辑

usart_buffer_len++;    出现的位置不对。
第一次接收在if内判断到结尾后将usart_buffer_len=0,离开if后就usart_buffer_len++了。
也就造成从第二次开始的接收都是从索引1的位置而非索引0的位置开始缓存。

应该在 gu8_USART_RX_BUFF[usart_buffer_len] = USART_ReceiveData( DEBUG_USARTx ); 之后就立马 usart_buffer_len++;
usart_buffer_len所指代的是接收到的数据的个数,所以一收到数据就应立马递增。(PS:改成recv_size直观点)
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-29 22:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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