Я боролся с этой проблемой некоторое время, и это сводит меня с ума:
Я пытаюсь очень просто связаться с Arduino Mega 2560 (через USB в качестве последовательного устройства) с ПК под управлением Linux (Knoppix на USB-док), когда все, что я пытаюсь сделать на этом этапе, это то, что для каждого числа, отправленного ноутбук к Arduino, сигнал «стоба» будет переключаться с высокого на низкий или наоборот, и я использую этот стробоскоп для включения и выключения светодиода.
C-код на стороне ПК:
#include <stdio.h>
int main ()
{
FILE * Device = NULL;
int counter = 0;
Device = fopen("/dev/ttyACM0", "w+");
if(Device == NULL)
{
printf("could not open Device\n");
return -1;
}
while (counter < 10)
{
fprintf(Device, "%d\n", counter);
printf("Sent to Device: %d\n", counter);
counter++;
sleep(2);
}
fclose(Device);
return 0;
}
Код Ардуино:
int cnt = 0;
int strobe = 0;
int num;
int ValidInput = 0;
char intBuffer[12];
String intData = "";
int delimiter = (int) '\n';
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(3, OUTPUT);
}
int input;
void loop()
{
while(num = Serial.available())
{
delay(5);
// Serial.println(num);
int ch = Serial.read();
if(ch == delimiter)
{
ValidInput = 1;
break;
}
else
{
intData += (char) ch;
}
}
int intLen = intData.length() + 1;
intData.toCharArray(intBuffer, intLen);
intData = "";
int i = atoi(intBuffer);
if(ValidInput)
{
if(i == 0)
{
strobe = 0;
Serial.print("Initializing strobe");
}
else
{
strobe = !strobe;
}
digitalWrite(3, (strobe) ? HIGH : LOW);
Serial.println(i);
ValidInput = 0;
}
}
Проблемы, которые у меня есть:
- Не уверен, является ли fopen правильным способом связи с последовательным устройством в Linux, и если да, то в каком режиме?
- Это основная проблема — я испытываю недетерминированное поведение: если я запускаю этот код прямо перед открытием «Последовательного монитора» редактора Arduino, он не работает, как я объяснил выше, вместо этого он включит светодиод, а затем выключится сразу, на каждый входящий новый номер. но как только я открою «Последовательный монитор», он будет действовать так, как я хочу, - меняя состояние светодиода для каждого нового входящего номера.
Я думаю, что это как-то связано со сбросом Arduino или чем-то в этом роде.
Я просмотрел много тем здесь и на других форумах и не нашел решения этой проблемы.
Я был бы очень признателен за ваше понимание.