Hallo an alle!
Bin geradde hoffnungslos auf der Suche nach dem begangenen Fehler.
Möchte nämlich übern atmega16 einzelne Zeichen dem PC senden, welches
auf einer textBox in einer in c# geschriebenen formanwendung dargestellt
wird.
Ablauf: bei startreadingbuttonbetätigung öffnet sich der Port und es
soll ein char Zeichen angezeigt werden.
µC seitig habe ich folgende c-Routine:
1 | #include<avr/io.h>
|
2 | int main(void)
|
3 | {
|
4 | usartpar();//erforderlich zur USARTeinstellungsparametrisierung
|
5 |
|
6 | while(1)
|
7 | {
|
8 | putch('a');//sendet an PC ein a
|
9 | //in der textBox sollte eigentlich ein a stehen, jedoch zeigt es mir //ein "spanisches A" an, siehe angehängtes Bild(ASCII: 192), selbst, wenn ich ein anderes Zeichen schicke zeigt es immer nur dieses Zeichen an.
|
10 | }
|
11 | return 0;
|
12 | }
|
13 | void usartpar(void)
|
14 | {
|
15 | unsigned char x; // Hilfsvariable
|
16 | #ifdef UBRRL // USART-Schnittstelle
|
17 | UBRRL = (TAKT / (8 * BAUD)) - 1;
|
18 | UCSRA |= (1 << U2X);
|
19 | UCSRB |= (1 << TXEN) | (1 << RXEN);
|
20 | UCSRC |= (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
|
21 | #else // UART-Schnittstelle
|
22 | UBRR = (TAKT / (16 * BAUD)) - 1;
|
23 | UCR |= (1 << TXEN) | (1 << RXEN);
|
24 | #endif
|
25 | x = UDR; // Empfänger leeren
|
26 | }
|
27 | void putch (unsigned char x) // warten und Zeichen senden
|
28 | {
|
29 | #ifdef UCSRA
|
30 | loop_until_bit_is_set(UCSRA, UDRE); // warte bis Sender frei
|
31 | #else
|
32 | loop_until_bit_is_set(USR, UDRE); // warte bis Sender frei
|
33 | #endif
|
34 | UDR = x; // Zeichen nach Sender
|
35 | }
|
c#-mäßig sieht es so aus:
1 | sing System;
|
2 | using System.Collections.Generic;
|
3 | using System.ComponentModel;
|
4 | using System.Data;
|
5 | using System.Drawing;
|
6 | using System.Text;
|
7 | using System.Windows.Forms;
|
8 |
|
9 | namespace serialPort_test
|
10 | {
|
11 | public partial class Form1 : Form
|
12 | {
|
13 | private char x;
|
14 |
|
15 |
|
16 | public Form1()
|
17 | {
|
18 |
|
19 |
|
20 | InitializeComponent();
|
21 | serialPort1.ReadBufferSize = 256;//Größe des Lese-Puffers festgelegt
|
22 | serialPort1.WriteBufferSize = 256;//Größe des Schreib-Puffers festgelegt
|
23 |
|
24 | serialPort1.Encoding = Encoding.ASCII;//ASCII codierung aktiviert
|
25 |
|
26 |
|
27 |
|
28 | }
|
29 |
|
30 | private void richTextBox1_TextChanged(object sender, EventArgs e)
|
31 | {
|
32 |
|
33 | richTextBox1.Text= x.ToString();//Schreibe char variable in textbox
|
34 |
|
35 | }
|
36 |
|
37 | private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
|
38 | {
|
39 |
|
40 | x = (char)(serialPort1.ReadByte());//lese von COM1, konvertiere es in char(Vorsicht:c#s char ist 16 bit breit und atmegas 8, vl dort Problem?)
|
41 |
|
42 |
|
43 |
|
44 | this.Invoke(new EventHandler(richTextBox1_TextChanged));//ruft Event auf
|
45 | }
|
46 |
|
47 | private void Form1_FormClosed(object sender, FormClosedEventArgs e)
|
48 | {
|
49 | serialPort1.Close();//beim Schließen des Fensters schließt sich COM1
|
50 | }
|
51 |
|
52 | private void Stop_Click(object sender, EventArgs e)
|
53 | {
|
54 | serialPort1.Close(); //bei Betätigung des Stop buttons schließt sich der Port
|
55 | }
|
56 |
|
57 | private void Start_Click(object sender, EventArgs e)
|
58 | {
|
59 | if(!serialPort1.IsOpen)serialPort1.Open();//bei Bet. von Start und Port noch nicht offen->öffnet sich der Port
|
60 |
|
61 | }
|
62 |
|
63 |
|
64 |
|
65 | }
|
66 | }
|
Bitte um konstruktive Hilfe, bin am Rande der Verzweiflung
danke im Vorraus