For test

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }