Ik heb een vrij specifieke vraag, ik hoop dat dit het juiste forum is. Het volgende:
Ik wil een kleine Linux server maken met twee seriele poorten. Eerder gebruikte ik een simpele consumenten pc met voor de seriele poorten een Sweet PCI kaart . Type moederbord weet ik helaas niet meer.
Nu heb ik een machine op basis van een ASRock E350M1 met een DeLock PCI Express Card. Voor de aansturing van de twee seriele poorten gebruik ik het volgende (in C):
Het probleem: als ik ttyS1 (ttyS0 is volgens mij de seriele poort op het moederbord, op de header zit geen uitvoer naar buiten) probeer te openen, hangt het programma op
Het zal ongetwijfeld komen door het feit dat dit een blocking functie is. Maar in andere situaties heeft dit altijd gewerkt. Op de vorige pc (met de Sweex kaart) had ik Fedora 17 draaien en daar werkt dit. Op de nieuwe pc heb ik Fedora 19, 17, 14 en 13 gehad maar in geen enkel geval werkt deze code.
In de voorgaande gevallen heb ik met 'lspci -v' het I/O adres van de seriele poorten opgevraagd maar dat geeft Fedora nu ook niet weer. Dus ik kan met 'setserial' de poorten ook niet instellen (in ieder geval niet zoals ik dat altijd gewend was).
Als ik gtkterm installeer kan ik beide poorten gebruiken en communiceren met een Windows pc met Hyperterminal. Het lijkt me dat de poorten dus opzich wel goed werken.
Het enige wat ik kan bedenken is dat deze code niet werkt op de gebruikte hardware maar is dat een juiste conclusie?
Iemand die hier een idee over heeft?
Ik wil een kleine Linux server maken met twee seriele poorten. Eerder gebruikte ik een simpele consumenten pc met voor de seriele poorten een Sweet PCI kaart . Type moederbord weet ik helaas niet meer.
Nu heb ik een machine op basis van een ASRock E350M1 met een DeLock PCI Express Card. Voor de aansturing van de twee seriele poorten gebruik ik het volgende (in C):
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| int SerialOpen( int port) { int fd; char device[ 80]; struct termios tio; if( fd_map[ port] != -1) ///< port already opened return SERIAL_ERROR_OPEN; sprintf( device, "/dev/ttyS%d", port); fd = open( device, O_RDWR|O_NOCTTY); if( fd <0) return SERIAL_ERROR_OPEN; fd_map[ port]= fd; bzero( &tio, sizeof(tio)); ///< clear struct for new port settings tio.c_iflag = 0; tio.c_oflag = 0; tio.c_cflag = B9600|CS8|CREAD|CLOCAL; tio.c_lflag = 0; tio.c_cc[ VTIME] = 0; ///< inter-character timer unused tio.c_cc[ VMIN] = 1; ///< blocking read until 1 character arrives tcgetattr( fd, &(oldtio[ port])); ///< save current serial port settings newtio[ port]= tio; tcflush( fd, TCIFLUSH); tcsetattr( fd, TCSANOW, &newtio[ port]); return fd; } |
Het probleem: als ik ttyS1 (ttyS0 is volgens mij de seriele poort op het moederbord, op de header zit geen uitvoer naar buiten) probeer te openen, hangt het programma op
C:
1
| fd = open( device, O_RDWR|O_NOCTTY); |
Het zal ongetwijfeld komen door het feit dat dit een blocking functie is. Maar in andere situaties heeft dit altijd gewerkt. Op de vorige pc (met de Sweex kaart) had ik Fedora 17 draaien en daar werkt dit. Op de nieuwe pc heb ik Fedora 19, 17, 14 en 13 gehad maar in geen enkel geval werkt deze code.
In de voorgaande gevallen heb ik met 'lspci -v' het I/O adres van de seriele poorten opgevraagd maar dat geeft Fedora nu ook niet weer. Dus ik kan met 'setserial' de poorten ook niet instellen (in ieder geval niet zoals ik dat altijd gewend was).
Als ik gtkterm installeer kan ik beide poorten gebruiken en communiceren met een Windows pc met Hyperterminal. Het lijkt me dat de poorten dus opzich wel goed werken.
Het enige wat ik kan bedenken is dat deze code niet werkt op de gebruikte hardware maar is dat een juiste conclusie?
Iemand die hier een idee over heeft?