Zähl / Denk fehler?



  • Moin, moin..

    ich bin glaub ich gerade etwas blind was meinen code angeht.

    Ich Programmier ein kleines Plugin für TeamSpeak, das die Serielle schnittstelle abhört.

    Über einen Arduino uno lasse ich 2 Potentiometer und 1 Button abfragen, und sie in folgender Form über die Serielle schnittstelle ausgeben.

    "P500,P500,B0\r\n" wobei der Buchstabe für Potentiometer oder Button steht, und die zahl dahinter für den momentanen wert. am abschluss schicke ich noch CRLF hinterher, damit es auch mit z.b. Putty lesbar bleibt, und ich das Zeilenende erkenne.

    Jetz hab ich allerdings das Problem, das die Schleife die ich Programmiert hab irgendwie alle paar mal ein Drittes Potentiometer und / oder einen Zweiten Button findet. Ich werd wahnsinnig dabei das problem zu finden, da ich meiner meinung nach jedesmal wenn ein CRLF gefunden wird die momentane zeile prüfe, und anschließend lösche. Somit dürften nie mehr als die Zwei Potentiometer und ein Button in der Zeile stehen.

    hier mal der Code.

    while (1) {
    		if (serial.Open(6, 9600))
    		{
    			while (serial.ReadDataWaiting()) {
    				char* lpBuffer = new char[500];
    				int nBytesRead = serial.ReadData(lpBuffer, 500);
    				for (int i=0; i< nBytesRead; i++) {
    					if (lpBuffer[i] == '\r' && lpBuffer[i+1] == '\n') {
    							char * pch;
    							pch = strtok(line,",");
    							while (pch != NULL)
    							{
    								if (pch[0] == 'P')
    								{
    									potCount++;
    									char test[500];
    									//val = atoi(++pch);
    									//if (val >= max) {
    										sprintf(test,"Potentiometer %i: ",potCount);
    										ts3Functions.printMessageToCurrentTab(test);
    									//}
    								} else if (pch[0] == 'B') {
    									char test[500];
    									buttonCount++;
    									//val = atoi(++pch);
    									sprintf(test,"Button %i: ",buttonCount);
    									ts3Functions.printMessageToCurrentTab(test);
    								}
    								pch = strtok(NULL,",");
    
    							}
    							potCount = 0;
    							buttonCount = 0;
    							line[0] = NULL;
    					} else if (lpBuffer[i] == '\r' || lpBuffer[i] == '\n') {} else {
    					sprintf(line + strlen(line),"%c",lpBuffer[i]);
    					}
    				}
    
    				delete []lpBuffer;
    
    			}
    
    		}
    		else
    		{
    			ts3Functions.printMessageToCurrentTab("Fhler beim Öffnen des COM Ports");
    			break;
    		}
    	}
    

    Ich hoffe jemand kann mir weiter helfen..



  • Kannst du mal testweise die ankommenden Daten ausgeben, bevor du sie durch deine Verteilungsschleife schickst?
    Ansonsten sieht dein Code reichlich unübersichtlich aus - und ist (von new/delete abgesehen) reines C (und vermutlich selbst aus Sicht eines C-Programmierers katastrophal).



  • Das der Code mit sicherheit keinen Schönheits Award gewinnen wird ist mir auch bewust.

    Ich bin aber auch kein Programmierer, also kann ich damit leben 😉

    Das mit der Ausgabe hab ich auch schon Probiert, aber irgendwie schmiert das Plugin jedesmal ab, wenn ich mit printMessageToCurrentTab den lpBuffer ausgeben will.



  • kubax schrieb:

    Das der Code mit sicherheit keinen Schönheits Award gewinnen wird ist mir auch bewust.

    Ich bin aber auch kein Programmierer, also kann ich damit leben 😉

    Aber wir nicht - und wenn wir versuchen sollen dir zu helfen, müssen wir zumindest den Code verstehen können. Wenn du das (als Autor) nicht mal selber schaffst, wie soll das ein Außenstehender?

    Das mit der Ausgabe hab ich auch schon Probiert, aber irgendwie schmiert das Plugin jedesmal ab, wenn ich mit printMessageToCurrentTab den lpBuffer ausgeben will.

    Vermutlich ist der empfangene String nicht nullterminiert.


Anmelden zum Antworten