串口接收字符串

2019-07-14 20:26发布

板子例程中有一个发送一个字节的函数
写了一个字符串的的发送
void HMISends(char *buf1)                  //字符串发送
{
        u8 i=0;
        while(1)
        {
         if(buf1[i]!=0)
                 {
                        USART_SendData(USART1,buf1[i]);  //发送一个字节
                        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET){};//等待发送结束
                         i++;
                }
         else
         return ;

                }
        }

}
如果接收字符串要如何写呢,发送方不会判断来一个字节一个字节的发送,直接发送过来四个字节这种,虽然我只想取第一个字节,但是如果直接用USART_ReceiveData(USART1)这个函数就只能收到最后一位
写不出来呀,困扰了好久。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
飞翔的梦125
1楼-- · 2019-07-15 03:03
ckbihu 发表于 2016-09-04 21:50
设置buffer,既然是通讯,就有定义协议。根据协议设置buffer大小就ok

我在做一个WIFI模块,在手机上发送FF010745FF,然后单片机接受到数据执行相应功能,其中接收数据时一次接收几位,用哪个函数接收。想请教,谢谢
meimengxing2014
2楼-- · 2019-07-15 04:09
设置一个接收缓存(数组),在接收中断中把数据接收,然后需要的时候从数组中读取数据,然后再选择你需要的数据。以下作为参考

void UART1_IRQHandler(void)                                                        //串口1中断服务程序
{
    u8 UartReadTemp;
    if (RESET != USART_GetITStatus(USART1, USART_IT_RXNE))                      //接收中断
    {
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        UartReadTemp = USART_ReceiveData(USART1);
        if (Bit_SET == UartRecvFrameOK)
        {
            UART1_RXBuffLen = 0;
        }
        if (UART1_RXBuffLen < (sizeof(UART1_RXBuff) / sizeof(UART1_RXBuff[0])))
        {
            UART1_RXBuff[UART1_RXBuffLen] = UartReadTemp;
            UART1_RXBuffLen++;
        }
        UartRecvFrameOK = Bit_RESET;
        UartRecvNewData = Bit_SET;
        TIM_ITConfig(TIM7, TIM_IT_Update, DISABLE);
        TIM_Cmd(TIM7, DISABLE);
        TIM_SetCounter(TIM7, 0);
        TIM_Cmd(TIM7, ENABLE);                                                  //当上位机发送数据下来时,开启TIM7
        TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);
    }
    if (RESET != USART_GetFlagStatus(USART1, USART_IT_ORE))                    
    {
        USART_ClearITPendingBit(USART1, USART_IT_ORE);                          //清溢出中断标志位
    }
}


s32 UART1_RecvData(u8* UART1_RecvBuff, u32 Len)          //接收数据
{
    u32 i = 0;
    if ((0 == Len) || (((u8*)NULL) == UART1_RecvBuff))                          //检查参数
    {
        return 0;
    }
    if ((Bit_RESET == UartRecvFrameOK) || (0 == UART1_RXBuffLen))
    {
        return 0;
    }
    if (Len < UART1_RXBuffLen)
    {
        return -1;
    }
    Len = UART1_RXBuffLen;

    for (i = 0; i < Len; i++)
    {
        UART1_RecvBuff[i] = UART1_RXBuff[i];
    }
    UartRecvFrameOK = Bit_RESET;
    UART1_RXBuffLen = 0;
    return Len;
}
hu0755
3楼-- · 2019-07-15 09:11
hu0755
4楼-- · 2019-07-15 09:30
 精彩回答 2  元偷偷看……

一周热门 更多>