|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2006
Città: TV-PD
Messaggi: 741
|
[C] Gestione I/O da ttyusb, File descriptor, mutex...
Ciao a tutti!
Sto tentando di creare un programmino in C su linux per gestire una schedina elettrica. In particolare, mandando un pacchetto a questa scheda dovrebbe restituirmi un pacchetto di risposta. Per mandare il pacchetto utilizzo la funzione write di unistd.h e per leggere il pacchetto di risposta utilizzo read dello stesso header. Come parametri a queste due funzioni, mando il file descriptor della porta /dev/ttyUSB0 opportunamente aperta, l'indirizzo dove leggere/scrivere il messaggio e la dimensione del messaggio. Riporto le definizioni da unistd.h Codice:
extern ssize_t write (int __fd, const void *__buf, size_t __n) __wur; extern ssize_t read (int __fd, void *__buf, size_t __nbytes) __wur; Le mie domande ora sono: 1. Posso utilizzare lo stesso file descriptor sia per la lettura che per la scrittura? 2. Posso iniziare la lettura subito dopo la scrittura? 3. Va bene utilizzare bloccare il mutex prima della scrittura (write()) e sbloccarlo dopo la lettura (read())? Codice:
#include <pthread.h> [...] pthread_mutex_t serial_mutex = PTHREAD_MUTEX_INITIALIZER; [write(...)...] pthread_mutex_lock(&serial_mutex); [read(...)...] pthread_mutex_unlock(&serial_mutex); Grazie a tutti quelli che mi daranno una mano! |
![]() |
![]() |
![]() |
#2 | ||||
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
che valore di ritorno ti dà l'invocazione della read? Eventualmente a cosa viene settato errno? Quote:
Quote:
Quote:
ps: come lo ottieni il file descriptor? riesci a leggere e scrivere da terminale con i redirect? disclaimer: mi diletto con il c da pochi mesi a tempo perso, non sono l'oracolo
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
||||
![]() |
![]() |
![]() |
#3 | |||||||
Senior Member
Iscritto dal: Apr 2006
Città: TV-PD
Messaggi: 741
|
Quote:
Errno lo provo domattina, non lo conoscevo. Quote:
Quote:
Quote:
Quote:
Codice:
#include <unistd.h> static int serial_fd; int serial_open(char *port) { serial_fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY); if (serial_fd == -1) { printf("Unable to open serial port write%s\n", port); return -1; } struct termios term; fcntl(serial_fd, F_SETFL, 0); // blocking read tcgetattr(serial_fd,&term); term.c_lflag = 0; term.c_cc[VTIME] = 20; // 2s timeout term.c_cc[VMIN] = 0; tcflush(serial_fd, TCIOFLUSH); cfsetispeed(&term, B57600); cfsetospeed(&term, B57600); tcsetattr(serial_fd,TCSANOW,&term); return 0; } Quote:
Quote:
Mi hai dato comunque qualche spunto su cui lavorare ed un grosso aiuto, grazie! ![]() Ultima modifica di mdr268 : 06-11-2013 alle 23:41. |
|||||||
![]() |
![]() |
![]() |
#4 | ||
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
Quote:
Codice:
L'input è un pacchetto fatto da un array di 20 uint_8, che differenza fa darli in input da terminale o dal sorgente?
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
||
![]() |
![]() |
![]() |
#5 | ||
Senior Member
Iscritto dal: Apr 2006
Città: TV-PD
Messaggi: 741
|
Quote:
Questo potrebbe essere la causa della lettura di 0 caratteri, provo a verificarlo fra poco. Quote:
![]() |
||
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2006
Città: TV-PD
Messaggi: 741
|
fcntl mi restituisce 0, quindi nessun errore.
Qui, http://www.dreamincode.net/forums/to...-f-setfl-0%3B/, spiegano cosa fa esattamente fcntl(serial_fd, F_SETFL, 0). Non credo sia quello il problema. La scheda mi restituisce un messaggio solo se prima riceve un messaggio. Forse il problema è che non riceve nulla. Questo cast a void* è corretto? Codice:
uint8_t cmd[] = { 0x16, 0x16, 0xC0} int result; result = write(serial_fd, (void*) &cmd, size); Non riesco a utilizzare redirect da terminale, se provo a fare subito dopo la scrittura Codice:
cat < /dev/ttyUSB0 |
![]() |
![]() |
![]() |
#7 | ||
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
Dipende poi dal dispositivo se ciò che hai scritto viene effettivamente scritto immediatamente o meno. Quote:
Codice:
while read line < /dev/ttyUSB0; do echo $line; done Codice:
echo "quellochetipare" >> /dev/ttyUSB0
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" Ultima modifica di Oceans11 : 07-11-2013 alle 11:46. |
||
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2006
Città: TV-PD
Messaggi: 741
|
Il programma funziona!
L'errore stava nel checksum del messaggio che veniva calcolato in maniera sbagliata e quindi la scheda non inviava la risposta al computer! ![]() ![]() Grazie dell'aiuto! ![]() ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:13.