From: Marcelo B. <md...@ma...> - 2000-11-21 01:48:37
|
Oi amigos Coders, beleza? Bom, vocês lembram daquele primeiro programinha modem que eu tinha mandado? Funcionou sem problemas né? Ai estava eu a implementar o resto das funções. (vão vendo o fonte, modem.c, em anexo) Comecei mudando a função openport, para torná-la mais genérica. Antes estava: int openport(char port) Mudei para: int openport(char *port) Assim, ela pode receber um parametro de porta mais abrangente que apenas o numero da ttyS, podendo receber por exemplo "/dev/modem". Beleza né? Bom, aqui no meu sistema, tenho permissão pra abrir as ttyS 1 e 3. Se voces compilarem e rodarem gcc -Wall modem.c -o modem verão que ocorre algo estranho... Tipo, quando o programa consegue abrir a primeira porta, tudo corre normal, até a hora da instrução close(canal); em main() Tipo, o programa parece que trava na hora de dar o close, e fica preso. Aqui, por exemplo, dá nisso: [marcelo@arise modem]$ ./modem Modem Seek and Destroy - versão 0.2 Seek modem at /dev/ttyS0: unable to open port Seek modem at /dev/ttyS1: (0)(1)(2) ...nothing :( fechando canal E fica parado nisso: o primeiro fd que ele abre ele não consegue fechar. Pois bem, encontrei duas soluções para isso: 1) Vejam na função main(), a seguinte linha (comentada): int main (int argc, char **argv) { char serial; int canal; int status; char device[15]; printf("Modem Seek and Destroy - versão %s\n\n", VERSION); for (serial = 0; serial < 4; serial++) { sprintf(device, "/dev/ttyS%d", serial); printf("Seek modem at %s: ", device); /* fflush(stdout); */ ^^^^^^^^^^^^^^^^^ Se voces descomentarem essa linha, e recompilarem/rodarem de novo, verão que o problema some! Ai executa normalmente aqui: [marcelo@arise modem]$ ./modem Modem Seek and Destroy - versão 0.3 Seek modem at /dev/ttyS0: unable to open port Seek modem at /dev/ttyS1: (0)(1)(2) ...nothing :( fechando canal Seek modem at /dev/ttyS2: unable to open port Seek modem at /dev/ttyS3: (0)[9] ...modem found!!! :) fechando canal Beleza não? 2) Outra mudança que faz o programa misteriosamente funcionar, é a seguinte: Vejam na função openport(): int openport(char *port) { int fd; <----------------- int status; struct termios options, optionsold; speed_t BaudRate; tcflag_t Control; Notem a posição da declaração de int fd; Pois bem, se voces mudarem a posição da declaração, por exemplo para: int openport(char *port) { int status; int fd; <--------------- struct termios options, optionsold; speed_t BaudRate; tcflag_t Control; E recompilarem/rodarem, verão que dessa forma também dá o problema (pelo menos aqui continuou dando :( Bom, mas agora, se vocês alterarem para: int openport(char *port) { int status; struct termios options, optionsold; speed_t BaudRate; tcflag_t Control; int fd; E recompilarem/rodarem, verão que... funciona!!! [marcelo@arise modem]$ ./modem Modem Seek and Destroy - versão 0.3 Seek modem at /dev/ttyS0: unable to open port Seek modem at /dev/ttyS1: (0)(1)(2) ...nothing :( <--- abriu canal fechando canal <--- fechou canal Seek modem at /dev/ttyS2: unable to open port Seek modem at /dev/ttyS3: (0)[9] ...modem found!!! :) fechando canal ------8<------------- Bom, esses mesmos testes eu fiz tb no 386, com CL3.0 Guarani, kernel 2.0.36, e tb ocorreu o mesmo comportamento... Tá, consegui resolver o problema e fazer funcionar... Mas, qual era o problema exatamente? Isso é que eu não consegui entender? Como é que a colocação daquele fflush() no main, ou a alteração da ordem de declaração de int fd; em openport() faz com que dê ou não dê esse problema no fechamento do canal ( instrução close(canal); em main() ) Isso me deixou muito intrigado... Será que eu estou fazendo alguma besteira com algum ponteiro ou vetor ? Eu dei uma olhada de novo nos fontes, mas não consegui identificar algum problema desse tipo. Seria algum problema do gcc? Quanto a instrução fflush em main(): o que é que um fflush feito em stdout tem a ver com o file descriptor aberto na comunicação serial?? Bom, em anexo vão dois fontes no tarball: modem.c : o programa mais novo, no qual foram detectados esse problemas "malucos" modem-1.c: o programa original que eu havia enviado antes pra lista, o qual funciona corretamente, diferindo do mais novo apenas na implementação/mudanças em openport() Bom, por enquanto é isso ai, se souberem ou desconfiarem de algo que possa estar causando esse problema fico muito grato. Abraçao, -- #=-=[ ser...@us... ]=-=+=#=--------------=# | Marcelo D. Beckmann --user[]="#173935"-- | | CL5 2.2.14 | md...@ma... UIN [53189692]----+ | Slack 7 2.2.13 # - =-#--=[ http://marcelobeckmann.cjb.net ]=--#-==-==-==-==-==-# + .~. | 233MMX 32MB 8.4+3.2GB Quantum Fireball ] /V\ #------------------466.94----[ OPL3SAx TGUI9680 2MB 33600 ] /(.)\ "Estamos de volta aos tempos em que os homens eram homens ] ^`~´^ e programavam seus próprios drivers de dispositivo."L.T. ] #-====-#----=[ serialcoder ]=- + -=[ http://wm.themes.org ]=-----' RTS-[CTS]-DLE-STX-17-39-35-CRC-F6-66-DLE-ETX-/RTS-[/CTS-RTS]-CTS-[ACK] |