For test

Dependencies:   mbed

Committer:
shennongmin
Date:
Tue Feb 03 09:10:16 2015 +0000
Revision:
14:40b1decf03f3
Parent:
12:4e4e72f18047
Child:
15:f5682fb5b315
Simple Log Okay

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shennongmin 10:9d4ec0359a5c 1 #include "ArduinoSerial.h"
shennongmin 10:9d4ec0359a5c 2
shennongmin 11:7bd1b2a67b1a 3 LinkedListNode ArduinoSerial::list_head = {NULL, NULL};
shennongmin 10:9d4ec0359a5c 4 unsigned int ArduinoSerial::instance_counter = 0;
shennongmin 10:9d4ec0359a5c 5
shennongmin 10:9d4ec0359a5c 6 void ArduinoSerial::uart_irq_callback(void) {
shennongmin 11:7bd1b2a67b1a 7 LinkedListNode *p;
shennongmin 11:7bd1b2a67b1a 8 for (p = list_head.next; p != &list_head; p = p->next) {
shennongmin 11:7bd1b2a67b1a 9 if (p->data != NULL) {
shennongmin 11:7bd1b2a67b1a 10 while(p->data->readable()) {
shennongmin 11:7bd1b2a67b1a 11 p->data->write_char(p->data->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 12:4e4e72f18047 18
shennongmin 11:7bd1b2a67b1a 19 instance_counter++;
shennongmin 11:7bd1b2a67b1a 20 if (instance_counter == 1) {
shennongmin 11:7bd1b2a67b1a 21 init_list_head_node(&list_head);
shennongmin 11:7bd1b2a67b1a 22 }
shennongmin 11:7bd1b2a67b1a 23
shennongmin 11:7bd1b2a67b1a 24 if (add_node_to_tail(&list_head, this) != NULL) {
shennongmin 14:40b1decf03f3 25 this->attach(&uart_irq_callback);
shennongmin 10:9d4ec0359a5c 26 } else {
shennongmin 10:9d4ec0359a5c 27 }
shennongmin 10:9d4ec0359a5c 28 }
shennongmin 10:9d4ec0359a5c 29
shennongmin 10:9d4ec0359a5c 30 ArduinoSerial::~ArduinoSerial(void) {
shennongmin 10:9d4ec0359a5c 31 instance_counter--;
shennongmin 11:7bd1b2a67b1a 32 if (del_node_by_data(&list_head, this) != NULL) {
shennongmin 11:7bd1b2a67b1a 33 this->attach(NULL);
shennongmin 11:7bd1b2a67b1a 34 } else {
shennongmin 10:9d4ec0359a5c 35 }
shennongmin 10:9d4ec0359a5c 36 }
shennongmin 10:9d4ec0359a5c 37
shennongmin 10:9d4ec0359a5c 38 void ArduinoSerial::begin(int baud_rate) {
shennongmin 10:9d4ec0359a5c 39 baud(baud_rate);
shennongmin 10:9d4ec0359a5c 40 flush();
shennongmin 10:9d4ec0359a5c 41 }
shennongmin 10:9d4ec0359a5c 42
shennongmin 10:9d4ec0359a5c 43 int ArduinoSerial::available(void) {
shennongmin 10:9d4ec0359a5c 44 return (unsigned int)(ARDUINOSERIAL_BUFFER_SIZE + rx_buffer.head - rx_buffer.tail) % ARDUINOSERIAL_BUFFER_SIZE;
shennongmin 10:9d4ec0359a5c 45 }
shennongmin 10:9d4ec0359a5c 46
shennongmin 10:9d4ec0359a5c 47 /* 清空接收缓冲区的数据 */
shennongmin 10:9d4ec0359a5c 48 void ArduinoSerial::flush(void)
shennongmin 10:9d4ec0359a5c 49 {
shennongmin 10:9d4ec0359a5c 50 memset(&rx_buffer, 0, sizeof(rx_buffer));
shennongmin 10:9d4ec0359a5c 51 }
shennongmin 10:9d4ec0359a5c 52
shennongmin 10:9d4ec0359a5c 53 char ArduinoSerial::read_char(void) {
shennongmin 10:9d4ec0359a5c 54 // if the head isn't ahead of the tail, we don't have any characters
shennongmin 10:9d4ec0359a5c 55 if (rx_buffer.head == rx_buffer.tail) {
shennongmin 10:9d4ec0359a5c 56 return (char)-1;
shennongmin 10:9d4ec0359a5c 57 } else {
shennongmin 10:9d4ec0359a5c 58 unsigned char c = rx_buffer.buffer[rx_buffer.tail];
shennongmin 10:9d4ec0359a5c 59 rx_buffer.tail = (unsigned int)(rx_buffer.tail + 1) % ARDUINOSERIAL_BUFFER_SIZE;
shennongmin 10:9d4ec0359a5c 60 return c;
shennongmin 10:9d4ec0359a5c 61 }
shennongmin 10:9d4ec0359a5c 62 }
shennongmin 10:9d4ec0359a5c 63
shennongmin 10:9d4ec0359a5c 64 void ArduinoSerial::setTimeout(unsigned long millisecond) {
shennongmin 10:9d4ec0359a5c 65 find_timeout = millisecond;
shennongmin 10:9d4ec0359a5c 66 }
shennongmin 10:9d4ec0359a5c 67
shennongmin 10:9d4ec0359a5c 68 /* 在超时之前, 如果在串口接收数据缓冲区中找到了定长字符串 str 就返回 true, 如果超时, 返回 false */
shennongmin 10:9d4ec0359a5c 69 bool ArduinoSerial::find(const char *str) {
shennongmin 10:9d4ec0359a5c 70 bool ret = false;
shennongmin 10:9d4ec0359a5c 71 String data;
shennongmin 10:9d4ec0359a5c 72 char c;
shennongmin 10:9d4ec0359a5c 73 unsigned long i;
shennongmin 10:9d4ec0359a5c 74 for (i = 0; i < find_timeout; i++) {
shennongmin 10:9d4ec0359a5c 75 while(available() > 0) {
shennongmin 10:9d4ec0359a5c 76 c = read_char();
shennongmin 10:9d4ec0359a5c 77 data += c;
shennongmin 10:9d4ec0359a5c 78 }
shennongmin 10:9d4ec0359a5c 79 if (data.indexOf(String(str)) != -1) {
shennongmin 10:9d4ec0359a5c 80 ret = true;
shennongmin 10:9d4ec0359a5c 81 break;
shennongmin 10:9d4ec0359a5c 82 }
shennongmin 10:9d4ec0359a5c 83 delay(1);
shennongmin 10:9d4ec0359a5c 84 }
shennongmin 10:9d4ec0359a5c 85 return ret;
shennongmin 10:9d4ec0359a5c 86 }
shennongmin 10:9d4ec0359a5c 87
shennongmin 10:9d4ec0359a5c 88 size_t ArduinoSerial::write(uint8_t data) {
shennongmin 10:9d4ec0359a5c 89 putc(data);
shennongmin 10:9d4ec0359a5c 90 return 1;
shennongmin 10:9d4ec0359a5c 91 }
shennongmin 10:9d4ec0359a5c 92
shennongmin 10:9d4ec0359a5c 93 void ArduinoSerial::write_char(unsigned char c) {
shennongmin 10:9d4ec0359a5c 94 int i = (unsigned int)(rx_buffer.head + 1) % ARDUINOSERIAL_BUFFER_SIZE;
shennongmin 10:9d4ec0359a5c 95
shennongmin 10:9d4ec0359a5c 96 // if we should be storing the received character into the location
shennongmin 10:9d4ec0359a5c 97 // just before the tail (meaning that the head would advance to the
shennongmin 10:9d4ec0359a5c 98 // current location of the tail), we're about to overflow the buffer
shennongmin 10:9d4ec0359a5c 99 // and so we don't write the character or advance the head.
shennongmin 10:9d4ec0359a5c 100 if (i != rx_buffer.tail) {
shennongmin 10:9d4ec0359a5c 101 rx_buffer.buffer[rx_buffer.head] = c;
shennongmin 10:9d4ec0359a5c 102 rx_buffer.head = i;
shennongmin 10:9d4ec0359a5c 103 }
shennongmin 10:9d4ec0359a5c 104 }
shennongmin 11:7bd1b2a67b1a 105
shennongmin 11:7bd1b2a67b1a 106 LinkedListNode *ArduinoSerial::init_list_head_node(LinkedListNode *head) {
shennongmin 11:7bd1b2a67b1a 107 if (head == NULL) {
shennongmin 11:7bd1b2a67b1a 108 return NULL;
shennongmin 11:7bd1b2a67b1a 109 }
shennongmin 11:7bd1b2a67b1a 110 head->data = NULL;
shennongmin 11:7bd1b2a67b1a 111 head->next = head;
shennongmin 11:7bd1b2a67b1a 112 return head;
shennongmin 11:7bd1b2a67b1a 113 }
shennongmin 11:7bd1b2a67b1a 114
shennongmin 11:7bd1b2a67b1a 115 LinkedListNode *ArduinoSerial::add_node_to_tail(LinkedListNode *head, ArduinoSerial* data) {
shennongmin 11:7bd1b2a67b1a 116 LinkedListNode *p;
shennongmin 11:7bd1b2a67b1a 117 LinkedListNode *node = (LinkedListNode *)malloc(sizeof(LinkedListNode));
shennongmin 11:7bd1b2a67b1a 118 if (node == NULL) {
shennongmin 11:7bd1b2a67b1a 119 return NULL;
shennongmin 11:7bd1b2a67b1a 120 }
shennongmin 11:7bd1b2a67b1a 121 /* 设置该节点的值 */
shennongmin 11:7bd1b2a67b1a 122 node->data = data;
shennongmin 11:7bd1b2a67b1a 123 node->next = head;
shennongmin 11:7bd1b2a67b1a 124
shennongmin 11:7bd1b2a67b1a 125 /* 在末尾插入该节点 */
shennongmin 11:7bd1b2a67b1a 126 for(p = head; p->next != head; p = p->next);
shennongmin 11:7bd1b2a67b1a 127 p->next = node;
shennongmin 11:7bd1b2a67b1a 128
shennongmin 11:7bd1b2a67b1a 129 return head;
shennongmin 11:7bd1b2a67b1a 130 }
shennongmin 11:7bd1b2a67b1a 131 LinkedListNode *ArduinoSerial::del_node_by_data(LinkedListNode *head, ArduinoSerial* data) {
shennongmin 11:7bd1b2a67b1a 132 LinkedListNode *p;
shennongmin 11:7bd1b2a67b1a 133 LinkedListNode *prev;
shennongmin 11:7bd1b2a67b1a 134
shennongmin 11:7bd1b2a67b1a 135 if (head == NULL) {
shennongmin 11:7bd1b2a67b1a 136 return NULL;
shennongmin 11:7bd1b2a67b1a 137 }
shennongmin 11:7bd1b2a67b1a 138
shennongmin 11:7bd1b2a67b1a 139 prev = head, p = head->next;
shennongmin 11:7bd1b2a67b1a 140 while(p != head) {
shennongmin 11:7bd1b2a67b1a 141 if (p->data == data) {
shennongmin 11:7bd1b2a67b1a 142 prev->next = p->next;
shennongmin 11:7bd1b2a67b1a 143 free(p);
shennongmin 11:7bd1b2a67b1a 144 p = prev->next;
shennongmin 11:7bd1b2a67b1a 145 } else {
shennongmin 11:7bd1b2a67b1a 146 prev = p;
shennongmin 11:7bd1b2a67b1a 147 p = p->next;
shennongmin 11:7bd1b2a67b1a 148 }
shennongmin 11:7bd1b2a67b1a 149 }
shennongmin 11:7bd1b2a67b1a 150 return head;
shennongmin 11:7bd1b2a67b1a 151 }
shennongmin 11:7bd1b2a67b1a 152 LinkedListNode *ArduinoSerial::find_node_by_data(LinkedListNode *head, ArduinoSerial* data) {
shennongmin 11:7bd1b2a67b1a 153 LinkedListNode *p;
shennongmin 11:7bd1b2a67b1a 154 if (head == NULL) {
shennongmin 11:7bd1b2a67b1a 155 return NULL;
shennongmin 11:7bd1b2a67b1a 156 }
shennongmin 11:7bd1b2a67b1a 157
shennongmin 11:7bd1b2a67b1a 158 for (p = head->next; p != head; p = p->next) {
shennongmin 11:7bd1b2a67b1a 159 if (p->data == data) {
shennongmin 11:7bd1b2a67b1a 160 return p;
shennongmin 11:7bd1b2a67b1a 161 }
shennongmin 11:7bd1b2a67b1a 162 }
shennongmin 11:7bd1b2a67b1a 163 return NULL;
shennongmin 11:7bd1b2a67b1a 164 }