OpenEdv-开源电子网

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

串口接受数据

[复制链接]

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2018-11-28
在线时间
13 小时
发表于 2019-3-13 15:51:55 | 显示全部楼层 |阅读模式
1金钱
发送一串十六进制数【5A A5 06 83 12 00 01 00 02】到串口   32接收并保存到数组  但总是达不到想要的效果(通过识别最后的两位02   来控制灯的亮灭)求各位大神指点迷津   代码如下void USART1_IRQHandler(void)                        //串口3中断服务程序,用于和触摸屏通讯。
{
        extern int STOP;
    uint8_t Res;
    static uint8_t US_STA = 0;         //用于检测是否已经收到帧头,未收到为0,收到5a为1,收到a5为2。
    static uint8_t buffer_num = 0;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        Res = USART_ReceiveData(USART1);               //读取接收到的数据
        if(!USART_RX_STA)
        {
            if(US_STA == 0)
            {
                if(Res == 0x5A) US_STA = 1;         //接收到了0x5a,US_STA=1
            }
            else if(US_STA == 1)
            {
                if(Res == 0xA5)
                {
                    US_STA = 2;                     //接收到了0xA5,US_STA=2
                    buffer_num = 0;
                }
                else US_STA = 0;                    //5A后面不是A5则全部重新接收。
            }
            else if(US_STA == 2)
            {
                USART_RX_BUF[buffer_num] = Res;
                if(buffer_num++ == USART_RX_BUF[0])
                {
                    buffer_num = 0;
                    USART_RX_STA = 1;              //当接收数量等于缓存0位置时,则接收完成。
                    US_STA = 0;
                                                                        STOP=1;
                }
            }
        }
    }
}






while(1)
        {

if(STOP==1)
{
//        printf("%x\r\n",USART_RX_BUF);
                switch(USART_RX_BUF[8])
                {
                        case 0x02:
                       
                                LED2_1;        printf("OPEN\r\n");printf("%x\r\n",USART_RX_BUF[8]);memset(USART_RX_BUF,0,sizeof(USART_RX_BUF));USART_RX_STA=0;
                                break;
                        case 0x01:
                                LED2_0;       
                                printf("CLOSE\r\n");printf("%x\r\n",USART_RX_BUF[8]);memset(USART_RX_BUF,0,sizeof(USART_RX_BUF));USART_RX_STA=0;
                                        break;
                        default : break;
                }
        }
else
        printf("DEFAULT\r\n");
}
       

最佳答案

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

5A A5 以上两个没存 06 83 12 00 01 00 02 这几个存了 if(buffer_num++ == USART_RX_BUF[0]) 这里判断都知道索引为0 switch(USART_RX_BUF[8]) 这个怎么会用8呢??
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2018-9-6
在线时间
37 小时
发表于 2019-3-13 15:51:56 | 显示全部楼层
5A
A5
以上两个没存
06 83 12 00 01 00 02
这几个存了

if(buffer_num++ == USART_RX_BUF[0])  
这里判断都知道索引为0

switch(USART_RX_BUF[8])
这个怎么会用8呢??


回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2019-3-13 16:18:57 | 显示全部楼层
USART_RX_BUF[8]确定是8吗?
回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2018-11-28
在线时间
13 小时
 楼主| 发表于 2019-3-13 17:09:48 | 显示全部楼层
a5820736 发表于 2019-3-13 16:18
USART_RX_BUF[8]确定是8吗?

确定啊
回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2018-11-28
在线时间
13 小时
 楼主| 发表于 2019-3-13 17:50:17 | 显示全部楼层
a5820736 发表于 2019-3-13 16:18
USART_RX_BUF[8]确定是8吗?

判别最后一个数   它不就存在USART_RX_BUF[8]里么
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2019-3-13 17:58:11 | 显示全部楼层
前两个并没有存在数组里吧,觉得最好都打印出来看看
回复

使用道具 举报

0

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
887
金钱
887
注册时间
2018-4-20
在线时间
491 小时
发表于 2019-3-13 17:59:12 | 显示全部楼层
CXY1996 发表于 2019-3-13 17:50
判别最后一个数   它不就存在USART_RX_BUF[8]里么

再好好看看你的中断函数
回复

使用道具 举报

35

主题

560

帖子

2

精华

资深版主

Rank: 8Rank: 8

积分
17786
金钱
17786
注册时间
2018-3-3
在线时间
523 小时
发表于 2019-3-13 18:30:14 | 显示全部楼层
仿真看看吧
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-13 19:57:32 | 显示全部楼层
虽然你没说, 但我猜你是想这样做

  Res = USART_ReceiveData(USART1);        
if(!USART_RX_STA)
{   switch(US_STA){
          case 0:
          case 1:
             if(Res==0x5A)US_STA++;
             else  US_STA=0;
             break;
          case 2:
             USART_RX_BUF[buffer_num]=Res;
             if (++buffer_num==USART_RX_BUF[0]-1){
                    USART_RX_STA = 1;              //当接收数量等于缓存0位置时,则接收完成。
                    US_STA = 0;
                    STOP=1;
             }
             break;
        }
        .......
回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2018-11-28
在线时间
13 小时
 楼主| 发表于 2019-3-13 20:42:05 | 显示全部楼层
IoTCatcher 发表于 2019-3-13 18:51
5A
A5
以上两个没存

啊~     我说呢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 09:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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