FreeBSD 6.3 + /dev/cuadX + write = "Input/output error" nach einiger Zeit ?

18/03/2008 - 07:20 von Jaromir Prinzler | Report spam
Hallo !

Warscheinlich bin hier hier nicht ganz richtig, aber eine bessere deutsche
Newsgroup habe ich nicht gefunden ?

Seit ein paar Tagen versuche ich mein Serielles-Display auf meinen von Linux
auf FreeBSD umgstellten Server "sauber" anzusprechen.

Prinzipiell funktioniert das Ansprechen der seriellen Schnittstelle
unter BSD sicher genau so wie unter Linux.

Mein Problem ist nun, dass "write" erst prima funktioniert und es nach
einiger
Zeit zu "Input/output error" 5 kommt ?

Das Display funktionierte unter Linux vorher tadellos und ist
selbstverstàndlich
auch auf 9600 Baud eingestellt ;-)

Hier ein kleiner Schnipsel:


SNIP



int id = -1;
if((id = open("/dev/cuad5", O_RDWR|O_NOCTTY|O_NONBLOCK)) > -1) //
O_NONBLOCK
{
struct termios options;
if(tcgetattr(id, &options) > -1)
{
cfsetospeed(&options, B9600);

tcflush(id, TCIFLUSH);

if(tcsetattr(id, TCSANOW, &options) > -1)
{
bool bError = false;
int iWritten = 0;
char out[256] = "";

while(!bError)
{
// Screen löschen
snprintf(out,sizeof(out),"%cX", 0xFE);
bError = ((iWritten = write(id, out, 2)) == 2) ? false:true;
if(bError) { fprintf(stderr,"Error (%d)... [%d %s]", iWritten,
errno, strerror(errno));

for(int y=0; y<4 && !bError; y++)
{
// Cursor setzen
snprintf(out,sizeof(out),"%cG%c%c",0xFE,0,y);
bError = ((iWritten = write(id, out, 4)) == 4) ? false:true;
if(bError) { fprintf(stderr,"Error (%d)... [%d %s]", iWritten,
errno, strerror(errno))

// Text schreiben
bError = ((iWritten = write(id, "1234567890", 10)) == 10) ?
false:true;
if(bError) { fprintf(stderr,"Error (%d)... [%d %s]", iWritten,
errno, strerror(errno))

// Ein wenig warten
usleep(100000); // 0.1 sec
}
}
}
}

close(id);
}

exit(0);


SNIP



Hat jemand von Euch hier eine Idee ? Ob nun mit oder ohne "O_NONBLOCK"
spielt keine Rolle, der fehler bleibt ?!

Ewiger Dank sei Ihm sicher !!!


...Jaro



#!/usr/bin/perl
foreach $c (split(/ /,"4a 61 72 6f 6d 96 72 20 50 72 69 6e 7a 6c 65 72")) {
print pack("C", hex($c)); }
 

Lesen sie die antworten

#1 Jaromir Prinzler
19/03/2008 - 08:51 | Warnen spam
Mein Problem ist nun, dass "write" erst prima funktioniert und es nach
einiger
Zeit zu "Input/output error" 5 kommt ?



Die Soft- und Hardware Flusskontrolle war nicht deaktiviert ;-)

portset.c_cflag &= ~(CNEW_RTSCTS);
portset.c_iflag &= ~(IXON|IXOFF|IXANY);

Jetzt geht's !

Ähnliche fragen