mirror of https://github.com/ARMmbed/mbed-os.git
[B96B_ASYNC] some fixes to pass serial_asynch.cpp test
Flush errors and current data register at reading start Allow separate serial obj for TX and RX (= do not initialize [TX/RX]_DMA when not needed. Char_match: make it work with long buffers and return the correct position of the char_match.pull/1493/head
parent
3aaf866154
commit
5b0bfb1361
|
|
@ -1027,6 +1027,8 @@ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_widt
|
|||
NVIC_EnableIRQ(irqn);
|
||||
|
||||
UartHandle.Instance = (USART_TypeDef *)SERIAL_OBJ(uart);
|
||||
// flush current data + error flags
|
||||
__HAL_UART_CLEAR_PEFLAG(&UartHandle);
|
||||
#if DEVICE_SERIAL_ASYNCH_DMA
|
||||
// Enable DMA interrupt
|
||||
irqn = h_serial_rx_get_irqdma_index(obj);
|
||||
|
|
@ -1042,6 +1044,8 @@ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_widt
|
|||
// following HAL function will enable the RXNE interrupt + error interrupts
|
||||
HAL_UART_Receive_IT(&UartHandle, (uint8_t*)rx, rx_length);
|
||||
#endif
|
||||
/* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
|
||||
__HAL_UART_ENABLE_IT(&UartHandle, UART_IT_ERR);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
@ -1080,6 +1084,7 @@ int serial_irq_handler_asynch(serial_t *obj)
|
|||
{
|
||||
volatile int return_event = 0;
|
||||
uint8_t *buf = (uint8_t*)obj->rx_buff.buffer;
|
||||
uint8_t i = 0;
|
||||
|
||||
// Irq handler is common to Tx and Rx
|
||||
UartHandle.Instance = (USART_TypeDef *)(SERIAL_OBJ(uart));
|
||||
|
|
@ -1107,15 +1112,15 @@ int serial_irq_handler_asynch(serial_t *obj)
|
|||
__HAL_UART_CLEAR_FLAG(&UartHandle, HAL_UART_ERROR_PE);
|
||||
return_event |= SERIAL_EVENT_RX_PARITY_ERROR & obj->serial.events;
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(&UartHandle, HAL_UART_ERROR_NE)) {
|
||||
if (__HAL_UART_GET_FLAG(&UartHandle, HAL_UART_ERROR_NE)||(UartHandle.ErrorCode & HAL_UART_ERROR_NE)!=0) {
|
||||
__HAL_UART_CLEAR_FLAG(&UartHandle, HAL_UART_ERROR_NE);
|
||||
// not supported by mbed
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(&UartHandle, HAL_UART_ERROR_FE)) {
|
||||
if (__HAL_UART_GET_FLAG(&UartHandle, HAL_UART_ERROR_FE)||(UartHandle.ErrorCode & HAL_UART_ERROR_FE)!=0) {
|
||||
__HAL_UART_CLEAR_FLAG(&UartHandle, HAL_UART_ERROR_FE);
|
||||
return_event |= SERIAL_EVENT_RX_FRAMING_ERROR & obj->serial.events;
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(&UartHandle, HAL_UART_ERROR_ORE)) {
|
||||
if (__HAL_UART_GET_FLAG(&UartHandle, HAL_UART_ERROR_ORE)||(UartHandle.ErrorCode & HAL_UART_ERROR_ORE)!=0) {
|
||||
__HAL_UART_CLEAR_FLAG(&UartHandle, HAL_UART_ERROR_ORE);
|
||||
return_event |= SERIAL_EVENT_RX_OVERRUN_ERROR & obj->serial.events;
|
||||
}
|
||||
|
|
@ -1128,9 +1133,19 @@ int serial_irq_handler_asynch(serial_t *obj)
|
|||
if ((UartHandle.RxXferCount==0)&&(obj->rx_buff.pos >= (obj->rx_buff.length - 1))) {
|
||||
return_event |= SERIAL_EVENT_RX_COMPLETE & obj->serial.events;
|
||||
}
|
||||
if ((buf != NULL) && (buf[obj->rx_buff.pos-1] == obj->char_match) && (SERIAL_OBJ(events) & SERIAL_EVENT_RX_CHARACTER_MATCH)) {
|
||||
// Chek if Char_match is present
|
||||
if (SERIAL_OBJ(events) & SERIAL_EVENT_RX_CHARACTER_MATCH) {
|
||||
if (buf != NULL){
|
||||
while((buf[i] != obj->char_match)&&(i<UartHandle.RxXferSize)){//for (i=0;i<UartHandle.RxXferSize;i++){
|
||||
i++;//if (buf[i] == obj->char_match{
|
||||
//}
|
||||
}
|
||||
if (i<UartHandle.RxXferSize){
|
||||
obj->rx_buff.pos = i;
|
||||
return_event |= SERIAL_EVENT_RX_CHARACTER_MATCH & obj->serial.events;
|
||||
}
|
||||
}
|
||||
}
|
||||
return return_event;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue