я боролся этот вопрос на некоторое время теперь, и это сводит меня с ума:Связь между C & Arduino
Я пытаюсь общаться очень просто с Arduino Mega 2560 (через USB в качестве последовательного устройства) с компьютера под управлением Linux (Knoppix на usb-dok), когда все, что я пытаюсь выполнить на этом этапе, заключается в том, что для каждого номера, отправленного ноутбуком в Arduino, сигнал «stobe» переключается на High-Low или наоборот, и я использую этот строб для включения и выключения светодиода.
шт код сторона C:
#include <stdio.h>
int main()
{
\t FILE * Device = NULL;
\t int counter = 0;
\t
\t Device = fopen("/dev/ttyACM0", "w+");
\t if(Device == NULL)
\t {
\t \t printf("could not open Device\n");
\t \t return -1;
\t }
\t while (counter < 10)
\t {
\t \t fprintf(Device, "%d\n", counter);
\t \t printf("Sent to Device: %d\n", counter);
\t \t counter++;
\t \t sleep(2);
\t }
\t fclose(Device);
return 0;
}
Arduino код:
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 выглядит разумным. Попробуйте использовать http://www.libusb.org/ для ПК. –
@SoundConception - нет, libusb здесь не логический выбор. Устройство USB обрабатывается последовательным интерфейсом ядра/модуля USB или (в данном случае) CDC/ACM. В прикладных программах должен использоваться Serial API, который пытается выполнить программа. Самая очевидная вещь, отсутствующая (и точно коррелированная с наблюдаемой проблемой), - это конфигурация порта и обычно требует дескриптора файла из open(), а не потока из fopen(). –