|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
programma porta RS232
ciao a tutti,
sto scrivendo per l'università un programma per spedire/ricevere dati dalla porta seriale, per pilotare un robot. penso di aver quasi finito (devo mettere una fork per gestire in parallelo l'invio e la ricezione) ma ho un problema: sto provando il programma tra due pc collegati con un cavo null modem, ma pare che quando uno dei due invia all'altro un carattere 0x0d (carriage return) questo venga trasformato in un 0x0a (newline). qualcuno sa dirmi perchè? l'ora è tarda e non riesco più a concentrarmi, magari è una cavolata! in allegato trovate il programma, il codice è coperto da licenza GPLv2 o, a vostra scelta, una versione successiva ![]()
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
ecco, ho migliorato un po' il tutto.
ora i caratteri vengono spediti e ricevuti in maniera raw. sono riuscito a trasferire un archivio tar.gz tra due pc ho aggiunto il colore per differenziare i byte spediti da quelli ricevuti ho messo i commenti al codice ho bisogno di qualche parere sulle cose che si possono migliorare. grazie http://www.gurutech.it/files/sendserial.zip
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
- Non hai indicato se intendi abilitare o meno il controllo di flusso hardwate (CRTSCTS). A meno che uno dei due nodi non lo supporta, sarebbe bene abilitarlo.
- Hai impostato l'fd come non bloccante, ma non controlli il risultato della write (potrebbe restituire -1 con errno==EAGAIN). Con una corretta gestione del flow control e dei risultati della write, potresti scrivere anche più di un byte alla volta, per una maggiore efficienza. - Perché le usleep?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
Quote:
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
A 9600 baud, considerando 8 bit/char + 1 bit di stop, occorrono almeno 940 us per trasferire un carattere...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
ecco un pezzo del manuale (niente di segreto, roba che si reperisce su internet)
Quote:
![]()
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Non so, andrebbe studiato un pò meglio. Innanzitutto la usleep causa uno sleep effettivo di almeno 1 ms, che è il tick dello scheduler; nel tuo caso, visto l'intervallo esiguo di attesa, avrebbe forse più senso un busy-loop o l'utilizzo del timer rtc (in entrambi i casi, eventualmente con scheduler RR). Metterei anche due bit di stop invece di uno, introduci a costo 0 un ulteriore ritardo di 100us tra i byte. Se non funziona, allora hai un problema da qualche altra parte!
Nota inoltre che questa condizione Quote:
Ricapitolando, per me dovresti: - due bit di stop - invio di un "telegram" intero con una unica write (se il telegram è "piccolo", di pochi byte, entra completamente nel buffer della uart; altrimenti devi usare più write con delle poll per controllare lo stato del buffer) - eventuale attesa tra l'invio di più "telegram". tcdrain può esserti di aiuto qui, per evitare usleep con valori "magici".
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 27-04-2007 alle 07:51. |
|
![]() |
![]() |
![]() |
#9 | |||
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
Quote:
questo e a quest'altro. però non so bene di cosa parla. non sono un programmatore del kernel, più che altro sono un programmatore della domenica (il mio avatar ricorda che sarò un ing. elettronico) Quote:
Quote:
per l'unica write provo e ti faccio sapere.
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
|||
![]() |
![]() |
![]() |
#10 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:36.