环境: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[length] != '\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[len++]=ch;}
- return HAL_OK;
- }
复制代码
|