打印
[STM32F1]

大家帮帮忙,关于串口数据处理问题的新人求助。

[复制链接]
楼主: mwj123
手机看帖
扫描二维码
随时随地手机跟帖
21
pixhw| | 2018-2-28 21:42 | 只看该作者 回帖奖励 |倒序浏览
保存到数组,然后判断。

使用特权

评论回复
22
suzhanhua| | 2018-2-28 21:43 | 只看该作者
mwj123 发表于 2018-2-28 17:33
共地是接地吗,我雷达模块接的是单片机的GND口,这样算共地吗

还不行吗?

使用特权

评论回复
23
biechedan| | 2018-2-28 21:43 | 只看该作者
你采用数组移位判断。

使用特权

评论回复
24
pl202| | 2018-2-28 21:43 | 只看该作者
楼主也没有做这方面的处理。

使用特权

评论回复
25
pixhw| | 2018-2-28 21:43 | 只看该作者
8个数组,然后保存移位,判断前三个字符和后三个字符。

使用特权

评论回复
26
selongli| | 2018-2-28 21:43 | 只看该作者
楼主没有判断标志位。

使用特权

评论回复
27
mwj123|  楼主 | 2018-3-1 07:13 | 只看该作者
selongli 发表于 2018-2-28 21:43
楼主没有判断标志位。

标志位是本身数据就存在的吗,如果需要判断正负的话,我已经&上0x00FF取正了。

使用特权

评论回复
28
mwj123|  楼主 | 2018-3-1 07:13 | 只看该作者
pl202 发表于 2018-2-28 21:43
楼主也没有做这方面的处理。

您好可以具体说一下是哪方面吗?是要将数据编入数组判断吗

使用特权

评论回复
29
mwj123|  楼主 | 2018-3-1 07:29 | 只看该作者
pixhw 发表于 2018-2-28 21:42
保存到数组,然后判断。

您好,如果用数组判断的话起始位和停止位要不要加入数组,会不会影响数组的判断呢?我对这方面还不太理解。

使用特权

评论回复
30
mwj123|  楼主 | 2018-3-1 08:06 | 只看该作者

我一直接着一直没反应,看来不是接地的问题

使用特权

评论回复
31
619888476| | 2018-3-1 09:26 | 只看该作者
系统时钟,串口配置了吗?

使用特权

评论回复
32
lihui567| | 2018-3-1 09:50 | 只看该作者
少一个接受完一帧数据的标志位,

使用特权

评论回复
33
lihui567| | 2018-3-1 09:52 | 只看该作者
lihui567 发表于 2018-3-1 09:50
少一个接受完一帧数据的标志位,

也可以判断帧头和帧尾接受完了,说明一帧数据接受完毕然后再对中间的数据逐一判断

使用特权

评论回复
34
877049204| | 2018-3-1 09:59 | 只看该作者
1、串口接受中断设置一个断点,确认接收数据正确
2、逐步调试、确认主函数内处理数据正确

使用特权

评论回复
35
yklstudent| | 2018-3-1 12:52 | 只看该作者
楼主串口都不用初始化就工作???

使用特权

评论回复
36
yklstudent| | 2018-3-1 13:04 | 只看该作者
楼主免费送给你:
#define cHead1P                                        0
#define cHead2P                                        1
#define cHead3P                                        2
#define cDataHP                                        3
#define cDataLP                                        4
#define cHead4P                                        5
#define cHead5P                                        6
#define cHead6P                                        7

#define cHead1                                        0xFF
#define cHead2                                        0xFF
#define cHead3                                        0xFF
#define cHead4                                        0x00
#define cHead5                                        0x00
#define cHead6                                        0x00

#define cMAX_BUF_SIZE                        200

typedef struct
{
        uint8_t rxBuf[cMAX_BUF_SIZE];
        uint8_t rxFlag;
        uint8_t rxLen;
}RxMsg_Type;

typedef struct
{
        uint8_t txBuf[cMAX_BUF_SIZE];
        uint8_t txIndex;
        uint8_t txLen;
}TxMsg_Type;

RxMsg_Type rxMsg;
TxMsg_Type txMsg;

bool sInvRxAnalysis(RxMsg_Type *pvRxMsg, uint16_t *pvRadarVal)
{
        if(pvRxMsg->rxBuf[cHead1P] != cHead1 ||  pvRxMsg->rxBuf[cHead2P] != cHead2 || pvRxMsg->rxBuf[cHead3P] != cHead3 \
                || pvRxMsg->rxBuf[cHead4P] != cHead4 || pvRxMsg->rxBuf[cHead5P] != cHead5 || pvRxMsg->rxBuf[cHead6P] != cHead6)
        {
                return false;
        }
        if(pvRxMsg->rxLen != 8)
        {
                return false;
        }
       
        *pvRadarVal = pvRxMsg->rxBuf[cDataHP];
        *pvRadarVal <<= 8;
        *pvRadarVal += pvRxMsg->rxBuf[cDataLP];
        return true;
}

void sInvRecvProcess(RxMsg_Type *pvRxMsg, uint8_t value)
{
        static uint16_t index = 0;
       
        switch( index )
        {
                case 0:
                {
                        if(value == cHead1)
                        {
                                pvRxMsg->rxBuf[index++] = value;
                        }
                        break;
                }
                case 1:
                {
                        if(value == cHead2)
                        {
                                pvRxMsg->rxBuf[index++] = value;
                        }
                        else
                        {
                                index = 0;
                        }
                        break;
                }
                case 2:
                {
                        if(value == cHead3)
                        {
                                pvRxMsg->rxBuf[index++] = value;
                        }
                        else
                        {
                                index = 0;
                        }
                        break;
                }
                case 3:
                case 4:
                {
                        pvRxMsg->rxBuf[index++] = value;
                        break;
                }
                case 5:
                {
                        if(value == cHead4)
                        {
                                pvRxMsg->rxBuf[index++] = value;
                        }
                        else
                        {
                                index = 0;
                        }
                        break;
                }
                case 6:
                {
                        if(value == cHead5)
                        {
                                pvRxMsg->rxBuf[index++] = value;
                        }
                        else
                        {
                                index = 0;
                        }
                        break;
                }
                case 7:
                {
                        if(value == cHead6)
                        {
                                pvRxMsg->rxBuf[index++] = value;
                                pvRxMsg->rxLen = index;
                                pvRxMsg->rxFlag = 1;
                                index = 0;
                        }
                        else
                        {
                                index = 0;
                        }
                        break;
                }
                default:
                        break;
        }
}

void uctsk_com(void *p_arg)
{
        uint16_t uwRadarVal;
       
        if(rxMsg.rxFlag)
        {
                rxMsg.rxFlag = 0;
                // 数据解析
                if(sInvRxAnalysis(&rxMsg, &uwRadarVal))
                {
                        // 数据处理
                        switch( uwRadarVal )
                        {
                                default:
                                        break;
                        }
                }
        }
}

void sUSART2_ISR(void)
{
        if(_BIT_TST(USART2->SR, 3))
        {
                _BIT_CLR(USART2->SR, 3);
        }
   
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)                        //数据接收中断
        {
                USART_ClearITPendingBit(USART2, USART_IT_RXNE);
                sInvRecvProcess(&rxMsg, USART_ReceiveData(USART2));
        }
   
        if(USART_GetITStatus(USART2, USART_IT_TC) != RESET)                                //数据发送完成中断
        {
                USART_ITConfig(USART2, USART_IT_TC, DISABLE);
                USART_ClearITPendingBit(USART2, USART_IT_TC);
        }
}

使用特权

评论回复
37
Lbsonggz| | 2018-3-1 13:35 | 只看该作者
1)参考雷达数据的波特率,数据位,停止位和奇偶校验位等,设置串口
2)建立一个数组,作为接收缓冲区
3)使能串口,在接收中断中接收数据,接收到最后字节后,停止接收,禁止接收中断,置位完成标志
4)进入主程序,处理接收的数据,清空缓冲区,清零完成标志,使能接收中断,

反复循环如上过程

使用特权

评论回复
38
mwj123|  楼主 | 2018-3-1 14:30 | 只看该作者
yklstudent 发表于 2018-3-1 13:04
楼主免费送给你:
#define cHead1P                                        0
#define cHead2P                                        1

就最后能勉强看懂,这个直接用吗?

使用特权

评论回复
39
mwj123|  楼主 | 2018-3-1 14:31 | 只看该作者
Lbsonggz 发表于 2018-3-1 13:35
1)参考雷达数据的波特率,数据位,停止位和奇偶校验位等,设置串口
2)建立一个数组,作为接收缓冲区
3)使能 ...

我再试试

使用特权

评论回复
40
mwj123|  楼主 | 2018-3-1 14:32 | 只看该作者
619888476 发表于 2018-3-1 09:26
系统时钟,串口配置了吗?

我把初始化的函数注释掉了。。忘了用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则