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);
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top