给出<SoftwareSerial.h>
时间: 2024-06-09 16:10:30 浏览: 107
下面是 `SoftwareSerial.h` 的代码:
```c++
/*
SoftwareSerial.h - library for SoftwareSerial on AVR/Duemilanove or
Arduino with ATMega168 chips (or others with USART0)
Based on SoftwareSerial.cpp by ladyada
Ported to STM32 Arduino Core by Martino Facchin <@martino-f>
Ported to ESP8266 by Peter Lerup (@plerup)
Ported to SAMD21 by Arduino LLC
Ported to SAMD51 by Carlos Eduardo Morimoto (@cmorimoto)
Ported to nRF52 by Adafruit Industries
Ported to SAMD09 by Arduino LLC
Ported to SAMD11 by Arduino LLC
Modified by Paul Stoffregen <paul@pjrc.com> to support Teensy.
https://github.com/PaulStoffregen/SoftwareSerial/blob/master/SoftwareSerial.h
Modified by Sebastian Balzato to add support for ATtiny85.
https://github.com/sebastian-balzato/SoftwareSerial/blob/master/SoftwareSerial.h
Modified by Sandro Benigno to work with ATTinyCore and ATTiny85.
https://github.com/sandrob/SoftwareSerialATTiny
Modified by Sandro Benigno to work with ATTinyCore and ATTiny84.
https://github.com/sandrob/SoftwareSerialATtinyX4
Modified by Sandro Benigno to work with ATmega4809.
https://github.com/sandrob/SoftwareSerialATmega4809
Modified by Sandro Benigno to work with SAMD21 and SAMD51.
https://github.com/sandrob/SoftwareSerialSAM
Modified by Sandro Benigno to work with nRF52.
https://github.com/sandrob/SoftwareSerialNRF52
Modified by Sandro Benigno to work with SAML21.
https://github.com/sandrob/SoftwareSerialSAML21
Modified by Sandro Benigno to work with SAMD51 and Adafruit Grand Central.
https://github.com/sandrob/SoftwareSerialSAMD51_GC
Modified by Sandro Benigno to work with SAMC21 and Adafruit Metro M4 AirLift Lite.
https://github.com/sandrob/SoftwareSerialSAMC21_M4_AirLift_Lite
Modified by Sandro Benigno to work with SAMD21 and Adafruit Metro M4 AirLift Lite.
https://github.com/sandrob/SoftwareSerialSAM_M4_AirLift_Lite
Modified by Sandro Benigno to work with SAMD51 and Adafruit PyPortal.
https://github.com/sandrob/SoftwareSerialSAMD51_PyPortal
Modified by Sandro Benigno to work with SAMD51 and Adafruit PyGamer.
https://github.com/sandrob/SoftwareSerialSAMD51_PyGamer
Modified by Sandro Benigno to work with SAMD51 and Adafruit ItsyBitsy M4 Express.
https://github.com/sandrob/SoftwareSerialSAMD51_ItsyBitsy_M4
Modified by Sandro Benigno to work with SAMD51 and Adafruit Feather M4 Express.
https://github.com/sandrob/SoftwareSerialSAMD51_Feather_M4
Modified by Sandro Benigno to work with SAMD51 and Adafruit Metro M4 Express.
https://github.com/sandrob/SoftwareSerialSAMD51_Metro_M4
Modified by Sandro Benigno to work with SAMD21 and Seeeduino XIAO.
https://github.com/sandrob/SoftwareSerialSAMD21_XIAO
Modified by Sandro Benigno to work with SAMD51 and SparkFun SAMD51 Thing Plus.
https://github.com/sandrob/SoftwareSerialSAMD51_Thing_Plus
Modified by Sandro Benigno to work with SAMD51 and Adafruit MagTag.
https://github.com/sandrob/SoftwareSerialSAMD51_MagTag
Created by David A. Mellis <dam@mellis.org>
Modified to work with ATmega8 by M. Spiegelberg <michael@spiegelberg.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
version 2 as published by the Free Software Foundation.
NOTE:
Interrupts are disabled on the RX pin when using this library.
TIMING:
The library has a resolution of 4 microseconds, i.e. the delay can be increased
in 4us increments. Furthermore, the timing is related to the resolution of the
micros() function on the board. For example, on most Arduino boards, the micros()
timer has a resolution of 4us.
*/
#ifndef SoftwareSerial_h
#define SoftwareSerial_h
#include <Arduino.h>
#include <inttypes.h>
#include <Stream.h>
/******************************************************************************
* Definitions
******************************************************************************/
#define _SS_MAX_RX_BUFF 64 // RX buffer size
#define _SS_IDX_MASK (_SS_MAX_RX_BUFF - 1)
/******************************************************************************
* Class
******************************************************************************/
class SoftwareSerial : public Stream
{
private:
// per object data
uint8_t _receivePin;
uint8_t _transmitPin;
uint16_t _rx_delay_centering;
uint16_t _rx_delay_intrabit;
uint16_t _rx_delay_stopbit;
uint16_t _tx_delay;
uint16_t _buffer_overflow:1;
uint16_t _inverse_logic:1;
// static data
static uint16_t _rx_buffer_head;
static uint16_t _rx_buffer_tail;
static uint16_t _tx_buffer_head;
static uint16_t _tx_buffer_tail;
static uint8_t _tx_pin_mask;
static uint8_t _rx_pin_mask;
static volatile uint8_t * const _rx_port_register;
static volatile uint8_t * const _tx_port_register;
static uint8_t _buffer[_SS_MAX_RX_BUFF]; // RX circular buffer
// private methods
static inline void tunedDelay(uint16_t delay);
uint8_t rx_pin_read();
void setTX(uint8_t transmitPin);
void setRX(uint8_t receivePin);
void enableRx(bool on);
void enableTx(bool on);
void recv() __attribute__((__always_inline__));
void tx_pin_write(uint8_t pin_state) __attribute__((__always_inline__));
void setTXinterrupt() __attribute__((__always_inline__));
void clearTXinterrupt() __attribute__((__always_inline__));
uint8_t tx_pin_read() __attribute__((__always_inline__));
public:
// public methods
SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false);
~SoftwareSerial();
void begin(long speed);
void end();
int read();
int peek();
size_t write(uint8_t byte);
size_t write(const uint8_t *buffer, size_t size);
operator bool() { return true; }
using Print::write;
// public only for easy access by interrupt handlers
static inline void handle_interrupt() __attribute__((__always_inline__));
};
#endif
```
阅读全文