pengfei wu
/
ESP8266Program
For test
ArduinoSerial.cpp@10:9d4ec0359a5c, 2015-02-02 (annotated)
- Committer:
- shennongmin
- Date:
- Mon Feb 02 09:46:16 2015 +0000
- Revision:
- 10:9d4ec0359a5c
- Child:
- 11:7bd1b2a67b1a
Style remained
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shennongmin | 10:9d4ec0359a5c | 1 | #include "ArduinoSerial.h" |
shennongmin | 10:9d4ec0359a5c | 2 | |
shennongmin | 10:9d4ec0359a5c | 3 | unsigned int ArduinoSerial::instance_counter = 0; |
shennongmin | 10:9d4ec0359a5c | 4 | ArduinoSerial* ArduinoSerial::instance_reference[ARDUINOSERIAL_INSTANCE_MAX] = {0}; |
shennongmin | 10:9d4ec0359a5c | 5 | |
shennongmin | 10:9d4ec0359a5c | 6 | void ArduinoSerial::uart_irq_callback(void) { |
shennongmin | 10:9d4ec0359a5c | 7 | unsigned int index; |
shennongmin | 10:9d4ec0359a5c | 8 | for (index = 0; index < instance_counter; index++) { |
shennongmin | 10:9d4ec0359a5c | 9 | if (instance_reference[index] != NULL) { |
shennongmin | 10:9d4ec0359a5c | 10 | while(instance_reference[index]->readable()) { |
shennongmin | 10:9d4ec0359a5c | 11 | instance_reference[index]->write_char(instance_reference[index]->getc()); |
shennongmin | 10:9d4ec0359a5c | 12 | } |
shennongmin | 10:9d4ec0359a5c | 13 | } |
shennongmin | 10:9d4ec0359a5c | 14 | } |
shennongmin | 10:9d4ec0359a5c | 15 | } |
shennongmin | 10:9d4ec0359a5c | 16 | |
shennongmin | 10:9d4ec0359a5c | 17 | ArduinoSerial::ArduinoSerial(PinName tx, PinName rx):Serial(tx, rx) { |
shennongmin | 10:9d4ec0359a5c | 18 | if (instance_counter < ARDUINOSERIAL_INSTANCE_MAX) { |
shennongmin | 10:9d4ec0359a5c | 19 | instance_reference[instance_counter++] = this; |
shennongmin | 10:9d4ec0359a5c | 20 | if (1 == instance_counter) { |
shennongmin | 10:9d4ec0359a5c | 21 | attach(&uart_irq_callback); |
shennongmin | 10:9d4ec0359a5c | 22 | } |
shennongmin | 10:9d4ec0359a5c | 23 | } else { |
shennongmin | 10:9d4ec0359a5c | 24 | printf("Create instance 0x%u failed: more instances created!\r\n"); |
shennongmin | 10:9d4ec0359a5c | 25 | } |
shennongmin | 10:9d4ec0359a5c | 26 | } |
shennongmin | 10:9d4ec0359a5c | 27 | |
shennongmin | 10:9d4ec0359a5c | 28 | ArduinoSerial::~ArduinoSerial(void) { |
shennongmin | 10:9d4ec0359a5c | 29 | instance_counter--; |
shennongmin | 10:9d4ec0359a5c | 30 | if (0 == instance_counter) { |
shennongmin | 10:9d4ec0359a5c | 31 | attach(NULL); |
shennongmin | 10:9d4ec0359a5c | 32 | } |
shennongmin | 10:9d4ec0359a5c | 33 | } |
shennongmin | 10:9d4ec0359a5c | 34 | |
shennongmin | 10:9d4ec0359a5c | 35 | void ArduinoSerial::begin(int baud_rate) { |
shennongmin | 10:9d4ec0359a5c | 36 | baud(baud_rate); |
shennongmin | 10:9d4ec0359a5c | 37 | flush(); |
shennongmin | 10:9d4ec0359a5c | 38 | } |
shennongmin | 10:9d4ec0359a5c | 39 | |
shennongmin | 10:9d4ec0359a5c | 40 | int ArduinoSerial::available(void) { |
shennongmin | 10:9d4ec0359a5c | 41 | return (unsigned int)(ARDUINOSERIAL_BUFFER_SIZE + rx_buffer.head - rx_buffer.tail) % ARDUINOSERIAL_BUFFER_SIZE; |
shennongmin | 10:9d4ec0359a5c | 42 | } |
shennongmin | 10:9d4ec0359a5c | 43 | |
shennongmin | 10:9d4ec0359a5c | 44 | /* 清空接收缓冲区的数据 */ |
shennongmin | 10:9d4ec0359a5c | 45 | void ArduinoSerial::flush(void) |
shennongmin | 10:9d4ec0359a5c | 46 | { |
shennongmin | 10:9d4ec0359a5c | 47 | memset(&rx_buffer, 0, sizeof(rx_buffer)); |
shennongmin | 10:9d4ec0359a5c | 48 | } |
shennongmin | 10:9d4ec0359a5c | 49 | |
shennongmin | 10:9d4ec0359a5c | 50 | char ArduinoSerial::read_char(void) { |
shennongmin | 10:9d4ec0359a5c | 51 | // if the head isn't ahead of the tail, we don't have any characters |
shennongmin | 10:9d4ec0359a5c | 52 | if (rx_buffer.head == rx_buffer.tail) { |
shennongmin | 10:9d4ec0359a5c | 53 | return (char)-1; |
shennongmin | 10:9d4ec0359a5c | 54 | } else { |
shennongmin | 10:9d4ec0359a5c | 55 | unsigned char c = rx_buffer.buffer[rx_buffer.tail]; |
shennongmin | 10:9d4ec0359a5c | 56 | rx_buffer.tail = (unsigned int)(rx_buffer.tail + 1) % ARDUINOSERIAL_BUFFER_SIZE; |
shennongmin | 10:9d4ec0359a5c | 57 | return c; |
shennongmin | 10:9d4ec0359a5c | 58 | } |
shennongmin | 10:9d4ec0359a5c | 59 | } |
shennongmin | 10:9d4ec0359a5c | 60 | |
shennongmin | 10:9d4ec0359a5c | 61 | void ArduinoSerial::setTimeout(unsigned long millisecond) { |
shennongmin | 10:9d4ec0359a5c | 62 | find_timeout = millisecond; |
shennongmin | 10:9d4ec0359a5c | 63 | } |
shennongmin | 10:9d4ec0359a5c | 64 | |
shennongmin | 10:9d4ec0359a5c | 65 | /* 在超时之前, 如果在串口接收数据缓冲区中找到了定长字符串 str 就返回 true, 如果超时, 返回 false */ |
shennongmin | 10:9d4ec0359a5c | 66 | bool ArduinoSerial::find(const char *str) { |
shennongmin | 10:9d4ec0359a5c | 67 | bool ret = false; |
shennongmin | 10:9d4ec0359a5c | 68 | String data; |
shennongmin | 10:9d4ec0359a5c | 69 | char c; |
shennongmin | 10:9d4ec0359a5c | 70 | unsigned long i; |
shennongmin | 10:9d4ec0359a5c | 71 | |
shennongmin | 10:9d4ec0359a5c | 72 | for (i = 0; i < find_timeout; i++) { |
shennongmin | 10:9d4ec0359a5c | 73 | while(available() > 0) { |
shennongmin | 10:9d4ec0359a5c | 74 | c = read_char(); |
shennongmin | 10:9d4ec0359a5c | 75 | data += c; |
shennongmin | 10:9d4ec0359a5c | 76 | } |
shennongmin | 10:9d4ec0359a5c | 77 | if (data.indexOf(String(str)) != -1) { |
shennongmin | 10:9d4ec0359a5c | 78 | ret = true; |
shennongmin | 10:9d4ec0359a5c | 79 | break; |
shennongmin | 10:9d4ec0359a5c | 80 | } |
shennongmin | 10:9d4ec0359a5c | 81 | delay(1); |
shennongmin | 10:9d4ec0359a5c | 82 | } |
shennongmin | 10:9d4ec0359a5c | 83 | |
shennongmin | 10:9d4ec0359a5c | 84 | return ret; |
shennongmin | 10:9d4ec0359a5c | 85 | } |
shennongmin | 10:9d4ec0359a5c | 86 | |
shennongmin | 10:9d4ec0359a5c | 87 | size_t ArduinoSerial::write(uint8_t data) { |
shennongmin | 10:9d4ec0359a5c | 88 | putc(data); |
shennongmin | 10:9d4ec0359a5c | 89 | return 1; |
shennongmin | 10:9d4ec0359a5c | 90 | } |
shennongmin | 10:9d4ec0359a5c | 91 | |
shennongmin | 10:9d4ec0359a5c | 92 | void ArduinoSerial::write_char(unsigned char c) { |
shennongmin | 10:9d4ec0359a5c | 93 | int i = (unsigned int)(rx_buffer.head + 1) % ARDUINOSERIAL_BUFFER_SIZE; |
shennongmin | 10:9d4ec0359a5c | 94 | |
shennongmin | 10:9d4ec0359a5c | 95 | // if we should be storing the received character into the location |
shennongmin | 10:9d4ec0359a5c | 96 | // just before the tail (meaning that the head would advance to the |
shennongmin | 10:9d4ec0359a5c | 97 | // current location of the tail), we're about to overflow the buffer |
shennongmin | 10:9d4ec0359a5c | 98 | // and so we don't write the character or advance the head. |
shennongmin | 10:9d4ec0359a5c | 99 | if (i != rx_buffer.tail) { |
shennongmin | 10:9d4ec0359a5c | 100 | rx_buffer.buffer[rx_buffer.head] = c; |
shennongmin | 10:9d4ec0359a5c | 101 | rx_buffer.head = i; |
shennongmin | 10:9d4ec0359a5c | 102 | } |
shennongmin | 10:9d4ec0359a5c | 103 | } |