C# (Visual Studio) string erstellen.

Gast #4378365
Hallo,

ich möchte mit einer GUI einen String an einen AVR senden.

Der AVR erwartet Werte wie "0,12,124,42\n".
1
         private void button1_Click(object sender, EventArgs e)
2
        {
3
            string str;
4
            str = "0";
5
          str += Convert.ToString(trackBar1.Value);
6
            str += ",";
7
            str += Convert.ToString(trackBar2.Value);
8
            str += ",";
9
            str += Convert.ToString(trackBar2.Value);
10
            str += "\n";
11
            serialPort.WriteLine(str);
12
        }

Leider liefert mir die Funktion das nicht. Was ist da genau falsch?
Gast
Marion schrieb:
> Leider liefert mir die Funktion das nicht.

und was liefert sie?

Man kann es auch besser lesbar schreiben.
1
string str = string.Format("0,{0},{1},{2}\n", trackBar1.Value, trackBar2.Value, trackBar2.Value );
2
serialPort.WriteLine(str);
Gast
1
serialPort.WriteLine(string.Format(",{0},{1},{2}\n", trackBar1.Value, trackBar2.Value, trackBar2.Value));

Liefert nicht die Anzahl erwünschter ','. Es wird lediglich 1 ',' 
gesendet
Gast
Beachten sollte man, das WriteLine() selbst noch ein NewLine-Zeichen 
anhängt.
Beim Senden von Zeichenketten statt Bytes kann es generell nicht 
schaden, SerialPort.Encoding und SerialPort.NewLine besser auf 
gewünschte Werte zu setzen.
Gast
1
      private void button2_Click(object sender, EventArgs e)
2
        {
3
            string str = string.Format("1,{0},{1},{2}", trackBar1.Value, trackBar2.Value, trackBar3.Value);
4
            serialPort.WriteLine(str);
5
            lbSent.Items.Add(str);
6
        }

Sendet laut dem Ausgabefenster "1,0,0,255". Die Werte passen soweit, 
jedoch bekomme ich vom AVR die Antwort

"LED   1 (hue,sat,val)  : 0, 0, 0"

1
    #ifdef DEBUG_UART
2
    static char uart_puffer[32];
3
    #endif
4
    
5
    #define NUM_FIELDS  5
6
    static uint8_t fieldIndex = 0;
7
    static uint16_t values[NUM_FIELDS];
8
    static uint8_t i = 0;
9
    
10
    // RXC0 Flag gesetzt
11
    if(uart_available())
12
    {
13
      // Zeichen aus UDR0 lesen
14
      char c = uart_getc();
15

16
      if(c >= '0' && c <= '9')
17
      {
18
        if(fieldIndex < NUM_FIELDS)
19
        {
20
          values[fieldIndex] = (values[fieldIndex] * 10) + (c - '0');
21
        }
22
      }
23
      else if(c == ',')
24
      {
25
        fieldIndex++;
26
      }
27
      else
28
      {
29
        // Einzelne Led setzen
30
      //  if((values[0] >= 0x0f) && (values[0] < (0x10 + NUM_LEDS)))
31
        if(values[0] < NUM_LEDS)
32
        {
33
          #ifdef DEBUG_UART
34
          sprintf(uart_puffer, "LED %3d (hue,sat,val)\t:%3d,%3d,%3d\r\n", values[0], values[1], values[2], values[3]);
35
          uart_puts(uart_puffer);
36
          #endif
37
          hsv[values[0]].h = values[1];
38
          hsv[values[0]].s = values[2];
39
          hsv[values[0]].v = values[3];        
40
          //hsv[values[0]-0x10].h = values[1];
41
          //hsv[values[0]-0x10].s = values[2];
42
          //hsv[values[0]-0x10].v = values[3];
43
        }
44
        // Alle Leds setzen
45
      //  else if(values[0] == (0x10+NUM_LEDS))
46
        else if(values[0] == NUM_LEDS)
47
        {
48
          #ifdef DEBUG_UART
49
          sprintf(uart_puffer, "LEDS    (hue,sat,val)\t:%3d,%3d,%3d\r\n", values[1], values[2], values[3]);
50
          uart_puts(uart_puffer);
51
          #endif
52
          for(uint16_t led = 0; led < NUM_LEDS; led++)
53
          {
54
            hsv[led].h = values[1];
55
            hsv[led].s = values[2];
56
            hsv[led].v = values[3];
57
          }
58
        }
59
        else
60
        {
61
        uart_puts("ELSE\n");
62
          //not yet
63
        }
64
        // Index zuruecksetzen
65
        fieldIndex = 0;
66
        // Array loeschen
67
        for(uint8_t i = 0; i < NUM_FIELDS; i++) values[i] = 0;
68
      }
69
    }
Gast
Marion schrieb:
> Beim AVR kommt einfach kein 2. ',' an.

dann lass doch den AVR einfach mal zurückschicken, was er bekommt. Es 
müsste ja schon das erste Zeichen reichen was er nicht erkannt hat.
1
sprintf(uart_puffer, "LED %3d (hue,sat,val)\t:%3d,%3d,%3d (char=%x)\r\n", values[0], values[1], values[2], values[3], c);
Hmmm,

das Problem hab ich scheinbar an der falschen Stelle gesucht. Wieso es 
aber mit Putty geht, ist mir ein Rätsel.

Ich habe im Programm ein delay_ms(10). Davor wird ein WS2812 Strip 
beschrieben (80Leds). Nehme ich beide Teile raus, funktioniert es auch 
mit dem Visual C#.

Was kann ich da ggf. machen mit der UART Schnittstelle? Interruptbetrieb 
ist nicht möglich, da die Leds das blockieren.
1
void readUartInput(void)
2
{
3
  #define MAX    50
4
  static uint8_t strComplete = 0;
5
  static uint8_t strCount = 0;
6
  static char string[MAX+1] = "";
7
  
8
  if(uart_available())
9
  {
10
    char c = uart_getc();
11
    if(strComplete == 0)
12
    {
13
      if(c == '\n' || c == '\r' || strCount >= MAX)
14
      {
15
        string[strCount] = '\0';
16
        strCount = 0;
17
        strComplete = 1;
18
      }
19
      else
20
      {
21
        string[strCount] = c;
22
        strCount++;
23
      }
24
    }
25
  }
26
  if(strComplete == 1)
27
  {
28
    uart_puts(string);
29
    uart_puts("\r\n");
30
    strComplete = 0;
31
  }
32
}
Gast
Stefan S. schrieb:
> Was kann ich da ggf. machen mit der UART Schnittstelle? Interruptbetrieb
> ist nicht möglich, da die Leds das blockieren.

dann zeig mal das komplette Programm. Niemand weiß was hinter 
uart_available und uart_getc steckt.

> Wieso es aber mit Putty geht, ist mir ein Rätsel.
vermutlich weil du viel langsamer tippst als C# sendet.
Gast
1
uint8_t uart_getc(void)
2
{
3
  while (!(UCSR0A & (1<<RXC0)))   // warten bis Zeichen verfuegbar
4
  ;
5
  return UDR0;                   // Zeichen aus UDR an Aufrufer zurueckgeben
6
}
7

8
uint8_t uart_available(void)
9
{
10
  return ((UCSR0A & (1<<RXC0)));
11
}

Baudrate werde ich mal runterdrehen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.