C ++ Serial Port Só Respondendo uma vez usando Write ()
-
05-07-2019 - |
Pergunta
Todo o código abaixo funciona. Meus responde dispositivo, C, 7 é um reset. Quando eu executar este a segunda vez ele não responde. Se eu desligar manualmente o dispositivo ligado e desligado, em seguida, executar este script novamente ele funciona. Mas não se eu pressionar o botão para executar o script pela segunda vez.
RS232: 57600,8, N, 1
Todas as idéias ?? Há mais informações necessárias para resolver isso?
* Também quando eu começar este trabalho eu vou ter que usar a função de leitura () para obter as respostas dispositivos. Alguém sabe o formato correto eu preciso usar, com base no código abaixo? Desculpe, eu sou novo para C ++ ... Eu sou mais um cara PHP.
* Eu também não sei se 1024 é certo, mas parece funcionar tão eh ...
#include <termios.h>
int fd;
struct termios options;
fd=open("/dev/tty.KeySerial1", O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, 0);
tcgetattr(fd,&options);
options.c_ispeed=57600;
options.c_ospeed=57600;
options.c_cflag |= (CLOCAL | CREAD);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_cflag &= ~CSTOPB;
options.c_lflag &= ~ECHO;
options.c_oflag &= ~ECHO;
options.c_oflag &= ~OPOST;
options.c_cflag |= CS8;
options.c_cflag |= CRTSCTS;
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] =10;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&options);
write(fd, "C,7\r\n", 1024);
close(fd);
Solução
A 1024 pode ser de fato o seu problema. O terceiro parâmetro para a função write()
indica o número de bytes a ser escrita:
ssize_t write(int fildes, const void *buf, size_t nbyte);
Veja a página man para write () para mais detalhes.
No seu caso, o número deve ser de 5, desde que você está enviando 5 caracteres ( 'C' '' '7' '\ r' e '\ n').
Ao fornecer um valor de 1024, na verdade você está enviando mais 1019 caracteres de lixo ao longo do canal serial.
atualização:
A função read()
tem quase os mesmos argumentos:
ssize_t read(int fildes, void *buf, size_t nbyte);
Observe que você deve fornecer um buffer gravável como o segundo parâmetro. Por exemplo, para ler 12 bytes você usaria:
char someData[12];
read(fd, someData, 12);
Eu não estou muito certo como determinar o número de caracteres que você precisa para ler, mas o número ssize_t
retornado pela função irá dizer-lhe quantos foram realmente ler.