sos博 发表于 2019-7-25 09:43:12

关于串口接收的若干问题

环境:HAL库
1,我花了好久,终于实现了串口发送+串口中断DMA接收发送没问题,但是接收只能在MY_UART_IDLECallback或者MY_UART_IRQHandler里面得到数据,
请问我怎么在main函数主程序里面得到接收数据?比如弄个函数uint8_t *get_string(void);实现我一调用就返回新得到的字符串?

2,是不是中断只能设置一个全局的rev_string变量来存储在中断函数中收到的数据?然后再main函数里面直接读rev_sting这个变量?
但是我要写协议,一会收一会发,对面还会根据我的应答回复不同的东西,比如我发送down,对面回复我一个OK,我怎么在发送了down之后,判断收到了OK呢?
是不是收到的rev_sting变量,判断一次后,为了让他能收到新数据,我要在判断函数的末尾把rev_string清空?
那有没有可能,我正在清空呢比如用memset(rev_string,0,len),这个时候又来新数据,我刚好收不到怎么办?

3,HAL_UART_Transmit这函数要写timeout,请问这个超时时间是什么意思呢?是里面延时时间吗?
4,HAL_UART_Transmit_DMA这个函数就不要timeout。。。
我在main的while里面写的如下,大家帮我看一下对不对呗,\r会被识别为\0吗,真的好困惑,头一次写串口这种来回应答的协议,我连接收怎么处理都不知道。。。
if(bootcnt<100)
    {
      bootcnt++;
                        HAL_UART_Transmit(&huart1, getdown, 10,10);
                        if(strstr((const char *)receive_buff,"update_fw"))
                        {
                              HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
                              memset(receive_buff,0,data_length_main);//清空接收的数据
                              HAL_UART_Transmit(&huart1,resultok,16,10);
                              if(strstr((const char *)receive_buff,"ok")!=NULL)
                        {
                                        Serial_PutByte(NAK);
                                        if(1)//如果串口有数据,那么开始执行xmodem接收,不知道怎么判断
                                        {
                                                //此处应该判断数据包是否符合xmodem协议,但是我没有判断,直接当作来的数据就是xmodem的数据
                                                if(Xmodem_Receive()==HAL_OK)
                                                {
                                                }                        
                                        }
                        }
                        }
                }
HAL_StatusTypeDef Serial_PutByte(uint8_t param)
{
if ( HAL_UART_STATE_TIMEOUT ==HAL_UART_GetState(&UartHandle))
    {HAL_UART_Abort(&UartHandle);}//中止正在进行的传输,阻塞模式
        return HAL_UART_Transmit(&UartHandle, ¶m, 1, TX_TIMEOUT);
}
void Serial_PutString(uint8_t *p_string)
{
uint16_t length = 0;
while (p_string != '\0')
{ length++;}
HAL_UART_Transmit(&UartHandle, p_string, length, TX_TIMEOUT);
}
uint8_t get_char()
{
        uint8_t ch;
        if( HAL_UART_STATE_RESET ==HAL_UART_GetState(&UartHandle))
        {HAL_UART_Receive(&huart1,&ch,1,RX_TIMEOUT);}
        return ch;
}
HAL_StatusTypeDef get_string(uint8_t *pstring)
{
        uint16_t len=0;
        uint8_t ch;
        while((ch=get_char())!='\0')
        {pstring=ch;}
        return HAL_OK;
}





wenyangzeng 发表于 2019-7-25 10:40:08

既然配置了串口中断接收,当然只能在中断函数里读数据了,如果要在主循环函数里查询接收,就应该配置成接收不使用中断了。ST官方演示有查询接收、中断接收等可以参考:


页: [1]
查看完整版本: 关于串口接收的若干问题