Mercurial > public > ostc4
comparison Discovery/Src/tComm.c @ 664:667093daa937 Betatest
Stability improvment bluetooth startup:
The previous implementation expected a default setup of the Bluetooth module. Deviations from the default expectation caused the init function to stop. The new implementation is able to fix wrong baud rate setting (reset baudrate to default 115200).
In addition the function evaluating the answers of the module is not able to derive the status out of a data stream.
author | Ideenmodellierer |
---|---|
date | Tue, 21 Dec 2021 19:36:41 +0100 |
parents | 0ad0b26ec56b |
children | bc6c90e20d9e |
comparison
equal
deleted
inserted
replaced
663:16833cd3a2f5 | 664:667093daa937 |
---|---|
1999 { | 1999 { |
2000 char answerOkay[] = "\r\nOK\r\n"; | 2000 char answerOkay[] = "\r\nOK\r\n"; |
2001 char aRxBuffer[UART_CMD_BUF_SIZE]; | 2001 char aRxBuffer[UART_CMD_BUF_SIZE]; |
2002 uint8_t sizeAnswer = sizeof(answerOkay) -1; | 2002 uint8_t sizeAnswer = sizeof(answerOkay) -1; |
2003 uint8_t result = HAL_OK; | 2003 uint8_t result = HAL_OK; |
2004 uint8_t index = 0; | 2004 uint8_t indexRef = 0; |
2005 uint8_t indexBuf = 0; | |
2005 uint8_t answer; | 2006 uint8_t answer; |
2006 | 2007 |
2007 memset(aRxBuffer,0,UART_CMD_BUF_SIZE); | 2008 memset(aRxBuffer,0,UART_CMD_BUF_SIZE); |
2008 if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, sizeAnswer, UART_OPERATION_TIMEOUT) == HAL_OK) | 2009 if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, sizeAnswer, UART_OPERATION_TIMEOUT) == HAL_OK) |
2009 { | 2010 { |
2010 do | 2011 do |
2011 { | 2012 { |
2012 if(answerOkay[index] != aRxBuffer[index]) | 2013 if(answerOkay[indexRef] == aRxBuffer[indexBuf]) |
2013 { | 2014 { |
2014 index = sizeAnswer; | 2015 indexRef++; |
2015 result = HAL_ERROR; /* unexpected answer => there might be characters left in RX que => read and discard all rx bytes */ | |
2016 do | |
2017 { | |
2018 answer = HAL_UART_Receive(&UartHandle, (uint8_t*)&aRxBuffer[index], 1, 10); | |
2019 if (index < UART_CMD_BUF_SIZE) | |
2020 { | |
2021 index++; | |
2022 } | |
2023 }while(answer == HAL_OK); | |
2024 index = sizeAnswer; | |
2025 } | 2016 } |
2026 else | 2017 else |
2027 { | 2018 { |
2028 index++; | 2019 if(indexRef != 0) |
2020 { | |
2021 indexRef = 0; | |
2022 } | |
2029 } | 2023 } |
2030 }while(index < sizeAnswer); | 2024 indexBuf++; |
2025 }while(indexBuf < sizeAnswer); | |
2026 | |
2027 if(indexRef != sizeAnswer) /* unexpected answer => there might be characters left in RX que => read and check all rx bytes */ | |
2028 { | |
2029 do | |
2030 { | |
2031 answer = HAL_UART_Receive(&UartHandle, (uint8_t*)&aRxBuffer[indexBuf], 1, 10); | |
2032 if (indexBuf < UART_CMD_BUF_SIZE) | |
2033 { | |
2034 if(answerOkay[indexRef] == aRxBuffer[indexBuf]) | |
2035 { | |
2036 indexRef++; | |
2037 } | |
2038 else | |
2039 { | |
2040 if(indexRef != 0) | |
2041 { | |
2042 indexRef = 0; | |
2043 } | |
2044 } | |
2045 indexBuf++; | |
2046 } | |
2047 }while(answer == HAL_OK); | |
2048 if(indexRef != sizeAnswer) | |
2049 { | |
2050 result = HAL_ERROR; | |
2051 } | |
2052 } | |
2031 } | 2053 } |
2032 else | 2054 else |
2033 { | 2055 { |
2034 result = HAL_ERROR; | 2056 result = HAL_ERROR; |
2035 } | 2057 } |
2173 if(TxBuffer[0] != 0) /* forward command to module */ | 2195 if(TxBuffer[0] != 0) /* forward command to module */ |
2174 { | 2196 { |
2175 CmdSize = strlen(TxBuffer); | 2197 CmdSize = strlen(TxBuffer); |
2176 if(HAL_UART_Transmit(&UartHandle, (uint8_t*)TxBuffer,CmdSize, 2000) == HAL_OK) | 2198 if(HAL_UART_Transmit(&UartHandle, (uint8_t*)TxBuffer,CmdSize, 2000) == HAL_OK) |
2177 { | 2199 { |
2178 if(BmTmpConfig == BM_CONFIG_ECHO) /* echo is not yet turned off => read and discard echo */ | |
2179 { | |
2180 HAL_UART_Receive(&UartHandle, (uint8_t*)TxBuffer, CmdSize, UART_OPERATION_TIMEOUT); | |
2181 } | |
2182 | |
2183 result = tComm_CheckAnswerOK(); | 2200 result = tComm_CheckAnswerOK(); |
2184 | |
2185 | 2201 |
2186 if((BmTmpConfig == BM_CONFIG_BAUD) && (result == HAL_OK) && (UartHandle.Init.BaudRate != 460800)) /* is com already switched to fast speed? */ | 2202 if((BmTmpConfig == BM_CONFIG_BAUD) && (result == HAL_OK) && (UartHandle.Init.BaudRate != 460800)) /* is com already switched to fast speed? */ |
2187 { | 2203 { |
2188 HAL_UART_DeInit(&UartHandle); | 2204 HAL_UART_DeInit(&UartHandle); |
2189 HAL_Delay(1); | 2205 HAL_Delay(1); |
2190 UartHandle.Init.BaudRate = 460800; | 2206 UartHandle.Init.BaudRate = 460800; |
2191 HAL_UART_Init(&UartHandle); | 2207 HAL_UART_Init(&UartHandle); |
2208 } | |
2209 if((BmTmpConfig == BM_CONFIG_BAUD) && (result == HAL_OK) && (UartHandle.Init.BaudRate == 460800)) /* This shut not happen because default speed is 115200 => update module configuration */ | |
2210 { | |
2211 sprintf(TxBuffer,"AT%%B8\r"); /* set default baudrate */ | |
2212 CmdSize = strlen(TxBuffer); | |
2213 HAL_UART_Transmit(&UartHandle, (uint8_t*)TxBuffer,CmdSize, 2000); | |
2214 HAL_UART_DeInit(&UartHandle); | |
2215 HAL_Delay(10); | |
2216 UartHandle.Init.BaudRate = 115200; | |
2217 HAL_UART_Init(&UartHandle); | |
2218 sprintf(TxBuffer,"AT&W\r"); /* write configuration */ | |
2219 CmdSize = strlen(TxBuffer); | |
2220 HAL_UART_Transmit(&UartHandle, (uint8_t*)TxBuffer,CmdSize, 2000); | |
2192 } | 2221 } |
2193 if(result == HAL_OK) | 2222 if(result == HAL_OK) |
2194 { | 2223 { |
2195 BmTmpConfig++; | 2224 BmTmpConfig++; |
2196 } | 2225 } |
2197 if(BmTmpConfig == BM_CONFIG_DONE) | 2226 if(BmTmpConfig == BM_CONFIG_DONE) |
2198 { | 2227 { |
2199 ConfigRetryCnt = 0; | 2228 ConfigRetryCnt = 0; |
2229 RestartModule = 1; | |
2200 } | 2230 } |
2201 } | 2231 } |
2202 } | 2232 } |
2203 if(result != HAL_OK) | 2233 if(result != HAL_OK) |
2204 { | 2234 { |
2208 MX_Bluetooth_PowerOff(); | 2238 MX_Bluetooth_PowerOff(); |
2209 if(RestartModule) | 2239 if(RestartModule) |
2210 { | 2240 { |
2211 RestartModule = 0; /* only one try */ | 2241 RestartModule = 0; /* only one try */ |
2212 ConfigRetryCnt = 200; /* used for delay to startup module again */ | 2242 ConfigRetryCnt = 200; /* used for delay to startup module again */ |
2243 | |
2244 if(BmTmpConfig == BM_CONFIG_ECHO) /* the module did not answer even once => try again with alternative baud rate */ | |
2245 { | |
2246 HAL_UART_DeInit(&UartHandle); | |
2247 HAL_Delay(1); | |
2248 UartHandle.Init.BaudRate = 460800; | |
2249 HAL_UART_Init(&UartHandle); | |
2250 } | |
2213 BmTmpConfig = BM_CONFIG_RETRY; | 2251 BmTmpConfig = BM_CONFIG_RETRY; |
2214 } | 2252 } |
2215 else /* even restarting module failed => switch bluetooth off */ | 2253 else /* even restarting module failed => switch bluetooth off */ |
2216 { | 2254 { |
2217 ConfigRetryCnt = 0; | 2255 ConfigRetryCnt = 0; |