Warum ist mein serial so langsam?

  • Warum ist mein serial so langsam?

    Hi,

    ich komuniziere über einen USB2Serial Adapter mit einem Gerät. Dazu öffne ich ganz normal die serielle Schnitstelle mit folgenden Parametern:

    Quellcode

    1. -(bool)openSerialPort:(NSString *)devicePath
    2. {
    3. [self closeSerialPort];
    4. struct termios options;
    5. if ((self.fileDescriptor = open([devicePath cStringUsingEncoding:NSASCIIStringEncoding], O_RDWR | O_NOCTTY | O_NONBLOCK)) == -1)
    6. {
    7. myLog(@"SerialPort: Error open port at path: %@",devicePath);
    8. [self closeSerialPort];
    9. return NO;
    10. }
    11. if (fcntl(fileDescriptor, F_SETFL, 0) == -1)
    12. {
    13. myLog(@"SerialPort: Error cleaning no block");
    14. [self closeSerialPort];
    15. return NO;
    16. }
    17. if (tcgetattr(fileDescriptor, &originalOptions) == -1)
    18. {
    19. myLog(@"SerialPort: Error retreiving originalOptions");
    20. [self closeSerialPort];
    21. return NO;
    22. }
    23. options = originalOptions;
    24. cfmakeraw(&options);
    25. options.c_cc[VMIN] = 0;
    26. options.c_cc[VTIME] = 2;
    27. cfsetspeed(&options, B57600);
    28. options.c_cflag |= (CS8 | CLOCAL);
    29. if (tcsetattr(fileDescriptor, TCSANOW, &options) == -1)
    30. {
    31. myLog(@"SerialPort: Error setting new options");
    32. [self closeSerialPort];
    33. return NO;
    34. }
    35. return YES;
    36. }
    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.

    Quellcode

    1. -(NSData *)serialData:(NSString *)command reply:(uint8_t)reply
    2. {
    3. char tempBuffer[2048];
    4. NSMutableData *data=[NSMutableData data];
    5. ssize_t numBytes; // Number of bytes read or written
    6. if(command) // Initiales Kommando zum Anfordern der Datei
    7. {
    8. numBytes = write(self.fileDescriptor, [command cStringUsingEncoding:NSASCIIStringEncoding], command.length);
    9. if (numBytes == -1)
    10. {
    11. myLog(@"Error writing to modem - %s(%d).\n", strerror(errno), errno);
    12. return nil;
    13. }
    14. if (numBytes < command.length)
    15. return nil;
    16. }
    17. else // bestätigen des Datenblockes mit einem Byte
    18. {
    19. numBytes = write(self.fileDescriptor, &reply,1);
    20. if (numBytes == -1)
    21. {
    22. myLog(@"Error writing to modem - %s(%d).\n", strerror(errno), errno);
    23. return nil;
    24. }
    25. if (numBytes < command.length)
    26. return nil;
    27. }
    28. do
    29. {
    30. if(canceled) // Abbruch Button gedrückt?
    31. return nil;
    32. tempBuffer[0]=0;
    33. numBytes = read(self.fileDescriptor, &tempBuffer, 2048);
    34. if (numBytes == -1)
    35. {
    36. myLog(@"Error reading from modem - %s(%d).\n", strerror(errno), errno);
    37. return nil;
    38. }
    39. else
    40. {
    41. if (numBytes > 0)
    42. [data appendBytes:tempBuffer length:numBytes];
    43. }
    44. }
    45. while (numBytes>0);
    46. if(data.length)
    47. return data;
    48. return nil;
    49. }
    Alles anzeigen


    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 :)
  • Kann das externe Gerät nicht mehr als 57600?

    Ansonsten kann das viele verschiedene Gründe haben. Nutzt das andere Programm exakt das gleiche Protokoll?

    Falls Du einen Logic Analyzer hast (oder jemanden mit einem kennst) würde ich den mal dran hängen, um zu sehen, was auf der Leitung los ist. Ansonsten würde ich etwas profilen um zu versuchen, die Verzögerungen einzugrenzen und noch etwas mit seriellen Parametern spielen, ist aber ohne Sicht auf die echte Kommunikation etwas blind.
    Multigrad - 360°-Produktfotografie für den Mac
  • Hi Mattik,

    das Protokoll ist durch das Gerät festgelegt und kann nicht variiert werden. Baud sind auch gleich. Ich werde mal ein paar logs reinmachen wo genau die Zeit eigentlich verloren geht. Aber wie Du schon sagt, selbst wenn ich es weiß wird es mir nicht viel nutzen.

    Danke

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)