int SerialBase::read(uint16_t *buffer, int length, const event_callback_t& callback, int event, unsigned char char_match) { if (serial_rx_active(&_serial)) { return -1; // transaction ongoing } start_read((void*)buffer, length, 16, callback, event, char_match); return 0; }
int SerialBase::read(const Buffer& buffer, const event_callback_t& callback, int event, unsigned char char_match) { if (serial_rx_active(&_serial)) { return -1; // transaction ongoing } start_read(buffer, 8, callback, event, char_match); return 0; }
/** * Configure the RX buffer for an asynchronous write serial transaction * * @param obj The serial object. * @param tx The buffer for sending. * @param tx_length The number of words to transmit. */ static void serial_rx_buffer_set(serial_t *obj, void *rx, int rx_length, uint8_t width) { (void)width; // Exit if a reception is already on-going if (serial_rx_active(obj)) { return; } obj->rx_buff.buffer = rx; obj->rx_buff.length = rx_length; obj->rx_buff.pos = 0; }
void serial_rx_buffer_set(serial_t *obj, void *rx, int rx_length, uint8_t width) { /* Sanity check arguments */ MBED_ASSERT(obj); MBED_ASSERT(rx != (void*)0); // We only support byte buffers for now MBED_ASSERT(width == 8); if(serial_rx_active(obj)) return; obj->rx_buff.buffer = rx; obj->rx_buff.length = rx_length; obj->rx_buff.pos = 0; return; }
/** Begin asynchronous RX transfer (enable interrupt for data collecting) * The used buffer is specified in the serial object - rx_buff * * @param obj The serial object * @param rx The receive buffer * @param rx_length The number of bytes to receive * @param rx_width Deprecated argument * @param handler The serial handler * @param event The logical OR of events to be registered * @param handler The serial handler * @param char_match A character in range 0-254 to be matched * @param hint A suggestion for how to use DMA with this transfer */ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_width, uint32_t handler, uint32_t event, uint8_t char_match, DMAUsage hint) { struct serial_s *p_obj = GET_SERIAL_S(obj); IRQn_Type irq = usart_irq_n[p_obj->index]; if ((rx_length == 0) || (rx_width != 8)) { return; } /* disable all events first */ serial_event_disable(obj, SERIAL_EVENT_RX_ALL); /* enable the specific event */ serial_event_enable(obj, event); obj->char_match = char_match; if (serial_rx_active(obj)) { /* some reception is in progress */ return; } obj->rx_buff.buffer = rx; obj->rx_buff.length = rx_length; obj->rx_buff.pos = 0; /* enable interrupt */ /* clear pending IRQ */ NVIC_ClearPendingIRQ(irq); /* disable the IRQ first */ NVIC_DisableIRQ(irq); /* set the priority(higher than Tx) and vector */ NVIC_SetPriority(irq, 0); NVIC_SetVector(irq, (uint32_t)handler); /* enable IRQ */ NVIC_EnableIRQ(irq); usart_rx_interrupt_preprocess(p_obj, (uint8_t *)rx, rx_length); }