В этой короткой статье мы разберём аспекты приёма команд из последовательного COM порта при помощи платы Arduino и научимся их обрабатывать. Хотя эта задача не является особо сложной, она может вызвать сложности у многих новичков.
Итак, наша задача поэтапно:
- принять данные в буфер Serial.read()
- обработать данные, то есть разделить буфер на составляющие протокола
- обработать команды платой (мы будем зажигать и гасить светодиод)
Мы будем использовать нехитрый протокол:
- unitID – номер устройства, по которому можно обратиться к нему
- command – сама команда
- data – данные для программы, если необходимы
Итак, вот и код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#include <string.h> char unitID_in[10]; char command_in[10]; char data_in[100]; void setup() { // открываем порт Serial.begin(9600); } void loop() { int i=0; char buffer[100]; //если есть данные - считаем их if(Serial.available()){ delay(100); //сохраним прочитанное в буфер while( Serial.available() && i< 99) { buffer[i++] = Serial.read(); } //закрываем массив buffer[i++]='�'; } //если вдруг буфер наполнен if(i>0){ //разобьем его на части, отделенные запятой sscanf(buffer, "%[^','],%[^','],%s", &unitID_in, &command_in, &data_in); } //Исполнительная часть программы //Проверяем, к какому устройству пришли данные //Тестовое устройство 001 if ((String)unitID_in == "001"){ //test serial read Serial.print("001,arduino recive: unit "); Serial.print(unitID_in); Serial.print("n"); Serial.print("command: "); Serial.print(command_in); Serial.print("n"); Serial.print("data: "); Serial.print(data_in); Serial.print("n"); unitID_in [0] = '�'; command_in [0] = '�'; } //пример выполнения команды устройством 013 if ((String)unitID_in == "013"){ if ((String)command_in == "on"){ digitalWrite(13, HIGH);} if ((String)command_in == "off"){ digitalWrite(13, LOW);} Serial.print("001,arduino recive: unit "); Serial.print(unitID_in); Serial.print(" command "); Serial.print(command_in); Serial.print("n"); unitID_in [0] = '�'; command_in [0] = '�'; } } |
Для разбора строки используется функция sscanf, которая, несмотря на кучу плюсов, имеет большой и жирный минус – занимает много программного места.
Таким образом, теперь вы знаете, как организовать «цивилизованное» общение ПК с платой Arduino.
Смотрите также
- Функция Serial.read()
- Функция Serial.print()
- Функция Serial.printIn()