@@ -121,6 +121,8 @@ void UARTComponent::write_str(const char *str) {
121
121
this ->hw_serial_ ->write (str);
122
122
ESP_LOGVV (TAG, " Wrote \" %s\" " , str);
123
123
}
124
+ void UARTComponent::end () { this ->hw_serial_ ->end (); }
125
+ void UARTComponent::begin () { this ->hw_serial_ ->begin (this ->baud_rate_ , get_config ()); }
124
126
bool UARTComponent::read_byte (uint8_t *data) {
125
127
if (!this ->check_read_timeout_ ())
126
128
return false ;
@@ -272,6 +274,18 @@ void UARTComponent::write_str(const char *str) {
272
274
}
273
275
ESP_LOGVV (TAG, " Wrote \" %s\" " , str);
274
276
}
277
+ void UARTComponent::end () {
278
+ if (this ->hw_serial_ != nullptr )
279
+ this ->hw_serial_ ->end ();
280
+ else if (this ->sw_serial_ != nullptr )
281
+ this ->sw_serial_ ->end ();
282
+ }
283
+ void UARTComponent::begin () {
284
+ if (this ->hw_serial_ != nullptr )
285
+ this ->hw_serial_ ->begin (this ->baud_rate_ , static_cast <SerialConfig>(get_config ()));
286
+ else if (this ->sw_serial_ != nullptr )
287
+ this ->sw_serial_ ->begin ();
288
+ }
275
289
bool UARTComponent::read_byte (uint8_t *data) {
276
290
if (!this ->check_read_timeout_ ())
277
291
return false ;
@@ -337,7 +351,22 @@ void UARTComponent::flush() {
337
351
this ->sw_serial_ ->flush ();
338
352
}
339
353
}
340
-
354
+ void ESP8266SoftwareSerial::end () {
355
+ /* Because of this bug: https://github.com/esp8266/Arduino/issues/6049
356
+ * detach_interrupt can't called.
357
+ * So simply reset rx_in_pos and rx_out_pos even if it's totally racy with
358
+ * the interrupt.
359
+ */
360
+ // this->gpio_rx_pin_->detach_interrupt();
361
+ this ->rx_in_pos_ = 0 ;
362
+ this ->rx_out_pos_ = 0 ;
363
+ }
364
+ void ESP8266SoftwareSerial::begin () {
365
+ /* attach_interrupt() is also not safe because gpio_intr() may
366
+ * endup with arg == nullptr.
367
+ */
368
+ // this->gpio_rx_pin_->attach_interrupt(ESP8266SoftwareSerial::gpio_intr, this, FALLING);
369
+ }
341
370
void ESP8266SoftwareSerial::setup (int8_t tx_pin, int8_t rx_pin, uint32_t baud_rate, uint8_t stop_bits, uint32_t nr_bits,
342
371
std::string &parity) {
343
372
this ->bit_time_ = F_CPU / baud_rate;
@@ -346,13 +375,15 @@ void ESP8266SoftwareSerial::setup(int8_t tx_pin, int8_t rx_pin, uint32_t baud_ra
346
375
this ->parity_ = parity;
347
376
if (tx_pin != -1 ) {
348
377
auto pin = GPIOPin (tx_pin, OUTPUT);
378
+ this ->gpio_tx_pin_ = &pin;
349
379
pin.setup ();
350
380
this ->tx_pin_ = pin.to_isr ();
351
381
this ->tx_pin_ ->digital_write (true );
352
382
}
353
383
if (rx_pin != -1 ) {
354
384
auto pin = GPIOPin (rx_pin, INPUT);
355
385
pin.setup ();
386
+ this ->gpio_rx_pin_ = &pin;
356
387
this ->rx_pin_ = pin.to_isr ();
357
388
this ->rx_buffer_ = new uint8_t [this ->rx_buffer_size_ ];
358
389
pin.attach_interrupt (ESP8266SoftwareSerial::gpio_intr, this , FALLING);
0 commit comments