Данные из COM порта

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Здравствуйте. Имею такой код. Как мне сделать, чтобы при отправке в порт, скажем, числа "13" моё условие работало и светодиод загорался.

 

int val;
int ledPin =13;
boolean ledOn=false;
void setup() {
    pinMode(ledPin, OUTPUT); 
    Serial.begin(115200);
}

void loop()
{
if (Serial.available())
{
val = Serial.read();

if (val == 110) // n = 110 in dec
{
  ledOn=!ledOn;
digitalWrite(ledPin, ledOn);
}

}
}

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Числа 13 или строки "13"?

Если числа, то в строке 15 замените 110 на 13

Если строки, то она состоит из двух байтов. Надо принять оба и сравнивать

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

В порт будет отправлено число 13

Замена в 15 строке числа 110 на 13 не работает, 110 это буква n

13 это 4951 в DEC, но даже если я пишу if (val == 4951) и отправляю в порт число 13, не работает условие.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Сергей, число 13, оно 13 и есть.

4951 - это не число. Это представление строки.

Строка состоит из двух байтов 49 и 51.

Принимайте два байта. Первый сравнивайте с 49, а следующий с 41

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Тогда почему не работает?

if (val == 13)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Потому, что Вы передаёте строку, а не число.

Я не зря спрашивал, что Вы передаёте.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

А как принять байты?

Logik
Offline
Зарегистрирован: 05.08.2014

Вы чем передаете? Ардуиновским монитором? Так он только строки шарит. Для начала перейдите на буквы, например Замените if (val == 's') и передайте. После того как заработает - открывайте учебник на разделе "Типы данных" и желаю успеха.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Передаю через php

 

<?php
echo "Com3 opening....<br/>";
$fp = fopen("com3", "w");
echo "Done.<br/>";

echo "Sending data to Arduino...<br/>";
fwrite($fp, "13");
echo "Done.<br/>";

fclose($fp);        
?>

 

Logik
Offline
Зарегистрирован: 05.08.2014

Ну это тоже строка. Замените 13 для начала на одну букву, проверте, а потом  - учится, учится и еще раз...

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

С одной буквой всё понятно, вместо буквы в php скрипте я пишу DEC число этой буквы

Logik
Offline
Зарегистрирован: 05.08.2014

Наверно и просто буквы достаточно. Хотя всякие юникоды способны внести неповторимую прелесть в это дело. Если заработало - ок. Теперь учите сишные типы данных. Без этого никак. А пыха (и др. высокоуровневые интерпретируемые языки)  дает плохой опыт в этом вопросе, она скрвает истину от програмиста.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sergeyevd пишет:

fwrite($fp, "13");

Так вот это (в кавычках) строка и есть. Вы её и передаёте. 

Принимайте два байта, а не один и сравнивайте первый с '1', а второй с '3'