Я работаю над проектом, в котором мой компьютер взаимодействует с платой arduino, которая считывает вывод датчика и помещает его в последовательный порт только в том случае, если получено «t». Arduino код, как показано ниже, работает.Чтение из последовательного порта после его записи
const int inputPin = 0;
void setup(){
Serial.begin(9600);
pinMode(13, OUTPUT);}
void loop(){
if (Serial.available() > 0){
char c=Serial.read();
if(c=='t'){
int value = analogRead(inputPin);
float celsius = (5.0 * value * 100.0)/1024.0;
Serial.println(celsius);
}
}
}
Моя проблема в коде C, когда я пытаюсь прочитать, что Arduino ставит на последовательный порт. Мой код C:
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<unistd.h>
#include<fcntl.h>
int main(){
int STATE_OK=0;
int STATE_WARNING=1;
int STATE_CRITICAL=2;
char tempbuf[10];
int fd=open("/dev/ttyACM0",O_RDWR | O_NOCTTY | O_NONBLOCK);
if(fd == -1){
printf("Unable to open /dev/ttyACM0\n");
return STATE_WARNING;
} else {
fcntl(fd, F_SETFL, FNDELAY);
int w=write(fd, "t", 1);
printf("The number of bytes written to the serial port is %d \n",w);
fprintf(stderr, "fd = %d.\n", fd);
sleep(10);
int n=read(fd,tempbuf,5);
printf("%d,%s \n",n,strerror(errno));
if(n>0){
float temp=atof(tempbuf);
printf("Temperature is: %f Celsius\n", temp);
if (temp>27){
return STATE_CRITICAL;
}else{
printf("The temperature is %f Celsius and checked 10 seconds ago\n",temp);
return STATE_OK;
}
}
}
close(fd);
return 0;
}
n всегда = 0, и я не могу понять, в чем проблема. Спасибо заранее.
Является ли сон достаточным для ответа? – suspectus
Я уже пытался сменить его (1000), но n still = 0, и я думаю, этого достаточно, потому что у arduino есть быстрый ответ. –
По крайней мере, используйте программу типа Putty для проверки того, что ваш ПК может получать данные из последовательного порта. Ошибки проводки, конечно, являются объяснением, а не заботой об установлении связи - это другое. Используя O_NONBLOCK, число 5 и не настраивая параметры порта, такие как скорость передачи данных, также являются хорошими способами, чтобы попасть в проблему. –