Hi,
ich komuniziere über einen USB2Serial Adapter mit einem Gerät. Dazu öffne ich ganz normal die serielle Schnitstelle mit folgenden Parametern:
Alles anzeigen
Nun schicke ich eine Anfrage an das Gerät mir Daten zu schicken und dieses schickt mir dann einen Datenblock zurück. Diesen muss ich mit einem Byte quittieren, dann kommt der nächste Block etc etc. Das klappt auch super, nur brauche ich für eine komplette Datei ca 30sekunden, wo ein anderes Programm in 4 Sekunden fertig ist. Ich brauche für einen Datenblock, der ca 180 Bytes groß ist ca. 250ms. Das ist ein wenig viel. Aber warum?
Hier ist mal meine Routine die die einen Datenblock abholt. Ich wüßte nicht was es da zu optimieren gibt.
Alles anzeigen
Jemand eine Idee warum ich so langsam bin?
Gruß
Claus
ich komuniziere über einen USB2Serial Adapter mit einem Gerät. Dazu öffne ich ganz normal die serielle Schnitstelle mit folgenden Parametern:
Quellcode
- -(bool)openSerialPort:(NSString *)devicePath
- {
- [self closeSerialPort];
- struct termios options;
- if ((self.fileDescriptor = open([devicePath cStringUsingEncoding:NSASCIIStringEncoding], O_RDWR | O_NOCTTY | O_NONBLOCK)) == -1)
- {
- myLog(@"SerialPort: Error open port at path: %@",devicePath);
- [self closeSerialPort];
- return NO;
- }
- if (fcntl(fileDescriptor, F_SETFL, 0) == -1)
- {
- myLog(@"SerialPort: Error cleaning no block");
- [self closeSerialPort];
- return NO;
- }
- if (tcgetattr(fileDescriptor, &originalOptions) == -1)
- {
- myLog(@"SerialPort: Error retreiving originalOptions");
- [self closeSerialPort];
- return NO;
- }
- options = originalOptions;
- cfmakeraw(&options);
- options.c_cc[VMIN] = 0;
- options.c_cc[VTIME] = 2;
- cfsetspeed(&options, B57600);
- options.c_cflag |= (CS8 | CLOCAL);
- if (tcsetattr(fileDescriptor, TCSANOW, &options) == -1)
- {
- myLog(@"SerialPort: Error setting new options");
- [self closeSerialPort];
- return NO;
- }
- return YES;
- }
Nun schicke ich eine Anfrage an das Gerät mir Daten zu schicken und dieses schickt mir dann einen Datenblock zurück. Diesen muss ich mit einem Byte quittieren, dann kommt der nächste Block etc etc. Das klappt auch super, nur brauche ich für eine komplette Datei ca 30sekunden, wo ein anderes Programm in 4 Sekunden fertig ist. Ich brauche für einen Datenblock, der ca 180 Bytes groß ist ca. 250ms. Das ist ein wenig viel. Aber warum?
Hier ist mal meine Routine die die einen Datenblock abholt. Ich wüßte nicht was es da zu optimieren gibt.
Quellcode
- -(NSData *)serialData:(NSString *)command reply:(uint8_t)reply
- {
- char tempBuffer[2048];
- NSMutableData *data=[NSMutableData data];
- ssize_t numBytes; // Number of bytes read or written
- if(command) // Initiales Kommando zum Anfordern der Datei
- {
- numBytes = write(self.fileDescriptor, [command cStringUsingEncoding:NSASCIIStringEncoding], command.length);
- if (numBytes == -1)
- {
- myLog(@"Error writing to modem - %s(%d).\n", strerror(errno), errno);
- return nil;
- }
- if (numBytes < command.length)
- return nil;
- }
- else // bestätigen des Datenblockes mit einem Byte
- {
- numBytes = write(self.fileDescriptor, &reply,1);
- if (numBytes == -1)
- {
- myLog(@"Error writing to modem - %s(%d).\n", strerror(errno), errno);
- return nil;
- }
- if (numBytes < command.length)
- return nil;
- }
- do
- {
- if(canceled) // Abbruch Button gedrückt?
- return nil;
- tempBuffer[0]=0;
- numBytes = read(self.fileDescriptor, &tempBuffer, 2048);
- if (numBytes == -1)
- {
- myLog(@"Error reading from modem - %s(%d).\n", strerror(errno), errno);
- return nil;
- }
- else
- {
- if (numBytes > 0)
- [data appendBytes:tempBuffer length:numBytes];
- }
- }
- while (numBytes>0);
- if(data.length)
- return data;
- return nil;
- }
Jemand eine Idee warum ich so langsam bin?
Gruß
Claus
2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.
Pre-Kaffee-Posts sind mit Vorsicht zu geniessen
Pre-Kaffee-Posts sind mit Vorsicht zu geniessen
