2015-12-01 4 views
0

Уважаемые коллеги! Я пытаюсь написать программу C для Linux для записи последовательного порта (Arduino) и ждать ответа. Я знаю, было много вопросов об этом на форуме, но все, что я пробовал, имеет ту же проблему - успешно писать, но не читать ответ. Например, here и here. Я нашел два отдельных файла для write и для read.Linux C написать серийный порт (Arduino) и ждать ответа

Я компилирую и запускаю файл чтения в одном окне терминала и записываю файл в другой. Прекрасно работает. Но я не могу объединить их в один файл, чтобы писать, а затем ждать ответа. Та же проблема - писать, но не читать.

Вот как я попробовал:

#include <stdio.h> 
#include <fcntl.h> 
#include <termios.h> 
#include <unistd.h> 
#include <errno.h> 
void main(void) 
{ 
int fd; 
fd = open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_SYNC); 
if(fd == -1) 
     printf("\n Error! in Opening ttyUSB0 "); 
else 
     printf("\n ttyS0 Opened Successfully "); 
struct termios SerialPortSettings; 
tcgetattr(fd, &SerialPortSettings); 
cfsetispeed(&SerialPortSettings,B9600); 
cfsetospeed(&SerialPortSettings,B9600); 
     /* 8N1 Mode */ 
SerialPortSettings.c_cflag &= ~PARENB; 
SerialPortSettings.c_cflag &= ~CSTOPB; 
SerialPortSettings.c_cflag &= ~CSIZE; 
SerialPortSettings.c_cflag |= CS8; 
SerialPortSettings.c_cflag &= ~CRTSCTS; 
SerialPortSettings.c_cflag |= CREAD | CLOCAL; 
SerialPortSettings.c_iflag &= ~(IXON | IXOFF | IXANY); 
SerialPortSettings.c_iflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
SerialPortSettings.c_oflag &= ~OPOST;/*No Output Processing*/ 
     /* Setting Time outs */ 
SerialPortSettings.c_cc[VMIN] = 10; /* Read at least 10 characters */ 
SerialPortSettings.c_cc[VTIME] = 0; /* Wait indefinetly */ 
if((tcsetattr(fd,TCSANOW,&SerialPortSettings)) != 0) 
    printf("\n ERROR ! in Setting attributes"); 
else 
    printf("\n BaudRate = 9600 \n StopBits = 1 \n Parity = none"); 

char write_buffer[] = "Hello/n"; 
int bytes_written = 0; 
printf("\n %s written to ttyUSB0",write_buffer); 
printf("\n %d Bytes written to ttyUSB0", bytes_written); 
printf("\n +----------------------------------+\n\n");   
//tcflush(fd, TCIFLUSH); /* Discards old data in the rx buffer   */ 
char read_buffer[32]; 
int bytes_read = 0; 
int i = 0; 

write(fd,write_buffer,sizeof(write_buffer));/* use write() to send data to port */ 
usleep ((8 + 25) * 100);   /* Delay */ 
read(fd,&read_buffer,32);   /* Read the data     */ 
printf("\n\n Bytes Rxed -%d", bytes_read); /* Print the number of bytes read */ 
printf("\n\n "); 
for(i=0;i<bytes_read;i++) /*printing only the received characters*/ 
     printf("%c",read_buffer[i]); 
printf("\n +----------------------------------+\n\n\n"); 
close(fd); /* Close the serial port */ 
} 

Спасибо за вашу помощь, Иметь хороший день.

+3

У вас есть переменная 'bytes_read', который инициализируется в '0'. Ничто в коде не меняет это значение. – user3386109

+0

«Это не работает» - что происходит вместо этого? – immibis

+1

Не игнорируйте результат системных вызовов. В частности, не игнорируйте результат, возвращаемый read(). –

ответ

0

У вас есть переменная с именем bytes_read, которая инициализируется значением 0. Ничто в коде не меняет это значение. –   user3386109

Заявление read(fd,&read_buffer,32) должно быть исправлено в bytes_read = read(fd, read_buffer, 32) ... –   опилками