硬汉嵌入式论坛

 找回密码
 立即注册
查看: 620|回复: 5
收起左侧

[有问必答] uart5不是道什么情况接收数据异常,还未测试能否输出

[复制链接]

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2022-5-25 11:40:02 | 显示全部楼层 |阅读模式
硬汉哥我在f103上移植您的V5的HAL库的串口FIFO,uart5不是道什么情况不接收数据,但是我用的uart123都正常,就uart5不正常,uart5波特率设的4800。是我移植的有问题吗?
有空帮忙看一下非常感谢。

uint8_t g_Spo2RxBuf[SPO2_RX_BUF_SIZE];

SPO2_PARA_T g_tSpo2;

void SPO2_RxDataAnalysis(void)
{
        static uint8_t ucStatus = 0;  //血氧模块状态机标志
        static uint8_t ucCount = 0;   
        uint8_t read;
               
        if(comGetChar(COM5, &read))  //执行到这判断没有接收数据直接跳到下面else去了。
        {
                switch(ucStatus)
                {
                        case 0:
                        {
                                if((read & 0x80) == 1)  //确保第一位数据包头正确
                                {
                                        ucStatus = 1;
                                        g_Spo2RxBuf[ucCount] = read;                                       
                                        ucCount++;
                                }
                                else
                                {
                                        g_tSpo2.Spo2_errFlag = 1;
                                        ucStatus = 0;
                                }
                        }break;
                       
                        case 1:
                        {
                                g_tSpo2.Spo2_errFlag = 0;
                               
                                g_Spo2RxBuf[ucCount] = read;
                                if(ucCount >= 7)
                                {
                                        ucCount = 0;
                                        if((g_Spo2RxBuf[0] == 0x00) || (g_Spo2RxBuf[0] == 0xAF))
                                        {
                                                g_tSpo2.Spo2_errFlag = 1;
                                                g_tSpo2.PluseRate = 0;
                                                g_tSpo2.Spo2 = 0;
                                        }
                                        else
                                        {
                                                g_tSpo2.Spo2_errFlag = 0;
                                                g_tSpo2.PluseRate = (g_Spo2RxBuf[3]& (BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6))
                                                                                        | ((g_Spo2RxBuf[2] & BIT6) << 1);
                                               
                                                g_tSpo2.Spo2 = g_Spo2RxBuf[4] & (BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6);
                                        }
                                }
                                else
                                        ucCount++;
                               
                        }break;
                       
                       
                        default: break;
                }
        }
        else       
                g_tSpo2.Spo2_errFlag = 1;
}

image.png

回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2022-5-25 15:02:28 | 显示全部楼层
应该是我移植的问题,但是不知道问题出在哪,我这样写就能读出来


struct Spo2_struct Spo2_Str;

void Spo2_ProtocolAnalysis(void);
void Spo2_comm(void);

/*
*********************************************************************************************************
*        函 数 名: Spo2_Init
*        功能说明: 血氧协议预解析
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void Spo2_Init(void)
{
        HAL_UART_Receive_IT(&huart5, Spo2_Str.Uart3_RxBuf, 1);
//        Spo2_Str.Spo2_Tick = 51;
}

/*
*********************************************************************************************************
*        函 数 名: Uart3_RxSpo2
*        功能说明: usart3血氧数据接收函数,放在中断中
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void Uart3_RxSpo2(void)
{
        Spo2_Str.Uart3_RxData[Spo2_Str.Uart3_RxNum++] = Spo2_Str.Uart3_RxBuf[0];
       
        if((Spo2_Str.Uart3_RxData[0] & 0x80) != 0x80)   //解析包头数据
        {
                Spo2_Str.Uart3_RxNum = 0;
        }
       
        if(Spo2_Str.Uart3_RxNum >= 7)
        {
                Spo2_Str.Uart3_RxNum = 0;
        }
       
        HAL_UART_Receive_IT(&huart5, Spo2_Str.Uart3_RxBuf, 1);  //采用中断都串口数据,不加只读一次       
}

/*
*********************************************************************************************************
*        函 数 名: Spo2_ProtocolAnalysis
*        功能说明: 血氧协议预解析
*        形    参: data 要发送的数据, length 数据的长度
*        返 回 值: 无
*********************************************************************************************************
*/
void Spo2_ProtocolAnalysis(void)
{
        if((Spo2_Str.Uart3_RxData[0] == 0x00) || (Spo2_Str.Uart3_RxData[0] == 0xAF))
        {
                Spo2_Str.Spo2_errFlag = 1;
                Spo2_Str.PluseRate = 0;
                Spo2_Str.Spo2 = 0;
        }
        else
        {
                Spo2_Str.Spo2_errFlag = 0;
//                if(Spo2_Str.Uart3_RxNum >= 7)
//                {       
                        Spo2_Str.PluseRate = (Spo2_Str.Uart3_RxData[3] & (BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6)) | ((Spo2_Str.Uart3_RxData[2] & BIT6) << 1);
                        Spo2_Str.Spo2 = Spo2_Str.Uart3_RxData[4] & (BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6);
       
                        if(Spo2_Str.PluseRate >= 255)
                        {
                                Spo2_Str.PluseRate = 0;
                        }
                        if(Spo2_Str.Spo2 >= 100)
                        {
                                Spo2_Str.Spo2 = 0;
                        }
                       
                        Spo2_Str.Uart3_RxNum = 0;
//                }
        }
}
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2022-5-25 17:29:41 | 显示全部楼层
找到原因了,抱歉打扰了。数据解析错误, if((read & 0x80) == 1)  
这个位置错了应该 if((read & 0x80) == 0x80)  ,我移植的也有问题,重新移植了一下,ok了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106912
QQ
发表于 2022-5-26 10:08:06 | 显示全部楼层
王发明 发表于 2022-5-25 17:29
找到原因了,抱歉打扰了。数据解析错误, if((read & 0x80) == 1)  
这个位置错了应该 if((read & 0x80) = ...

好的,解决了就好。
回复

使用道具 举报

210

主题

1044

回帖

1684

积分

至尊会员

More we do, more we can do.

积分
1684
发表于 2022-5-26 10:27:16 | 显示全部楼层
问下楼主,这个跑仿真很快能发现,开始怎么认为是UART的问题呢?
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2022-5-27 09:44:19 | 显示全部楼层
emwin 发表于 2022-5-26 10:27
问下楼主,这个跑仿真很快能发现,开始怎么认为是UART的问题呢?

一开始跑仿真,没有读到数据,读数据数组没有任何数据,然后 if(comGetChar(COM5, &read))  //执行到这判断没有接收数据直接跳到下面else去了。就是串口5没有收到任何数据。我当时就确认是我串口5这里移植的有问题。我重新移植了之后发现串口就收数据了,然后重新看了一下协议发现问题。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-9 16:29 , Processed in 0.271422 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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