Hallo,
Ik zit met het probleem dat ik mijn karakter dat ik uitstuur met de PIC niet uitgelezen krijg (received) op mijn computer ... .
Mijn pin-connecties zijn als volgt;
DE-9----------------MAX232N--------------PIC16f690
pin3 (Txd)---------pin14
pin2 (Rxd)--------pin13
pin5 (GND)-------pin15(GND)------------pin20(GND)
-
----------------------pin11 (Tx)---------------pin10 (RB7/TX)
-----------------------pin12 (Rx)--------------pin12 (RB5/RX)
In mijn c-code kan je zien dat ik met een knop, aangesloten op RC2, het karakter A wil versturen met daarna een \r. de initialisatie van de UART staat in de functie uart_init().
De code die ik gebruik in de pic om een char door te sturen is als volgt;
De code die ik gebruik om dan de karakter uit te lezen is in XAML (WPF) en zou eigenlijk eerst in een MessageBox moeten weergegeven worden.
De serial poort is gedeclareerd als sp1. De thread "myThread(Read)" is een eerste poging om de karakter uit te lezen.
De nieuwe instantie sp1_DataReceived is een betere vorm om iets in te lezen bij ontvangen van data over de geselecteerde COM poort. Ik heb er de 2manieren erbij geplaatst om aan te tonen dat ik deze 2 heb geprobeerd (zonder resultaat echter
)
Natuurlijk de functie Text_InLabel() doet nog niet wat zijn benaming weergeeft, eerst wil ik dit testen in een MessageBox.
Wanneer ik dit programma run, dan verkrijg ik geen error, maar ook geen MessageBox
!
Alvast dank ik jullie voor het lezen van deze topic, en natuurlijk hoop ik op een reactie dat mij duidelijk kan maken wat hier juist mis loopt.
Mocht het nu wel plots werken, dan meld ik dit natuurlijk !
Groeten,
Wim
Ik zit met het probleem dat ik mijn karakter dat ik uitstuur met de PIC niet uitgelezen krijg (received) op mijn computer ... .
Mijn pin-connecties zijn als volgt;
DE-9----------------MAX232N--------------PIC16f690
pin3 (Txd)---------pin14
pin2 (Rxd)--------pin13
pin5 (GND)-------pin15(GND)------------pin20(GND)
-
----------------------pin11 (Tx)---------------pin10 (RB7/TX)
-----------------------pin12 (Rx)--------------pin12 (RB5/RX)
In mijn c-code kan je zien dat ik met een knop, aangesloten op RC2, het karakter A wil versturen met daarna een \r. de initialisatie van de UART staat in de functie uart_init().
De code die ik gebruik in de pic om een char door te sturen is als volgt;
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & UNPROTECT & BORDIS & IESODIS & FCMDIS); // Using Internal Clock of 8 MHz #define FOSC 8000000L //----------------------------------WRITE AND READ-------------------------------------------- void send_char(unsigned char data) { // Send Data when TXIF bit is ready while(!TXIF) continue; TXREG = data; } unsigned char get_char(void) { // Get Data when RCIF bit is ready while(!RCIF) continue; return RCREG; } //--------------------------------------UART------------------------------------------------- void uart_init() { TRISB5 = 1; // Set Port B5 and B7 for UART Tx and Rx TRISB7 = 0; #define BAUD_RATE 9600 SPBRG = (int)(FOSC/(64UL * BAUD_RATE) - 1); //datasheet TXSTA = 0b00100000; // Async, 8 bit and Enable Transmit (TXEN=1) RCSTA = 0b10010000; // Serial Port Enable, Async,8-bit and Enable Receipt (CREN=1) BAUDCTL=0; //Baud Rate Control } //----------------------------------MAIN----------------------------------------------------- void main(void) { OSCCON=0x70; // Select 8 MHz internal clock TRISC = 0b00000100; // 2 LED's (reveiving and transmitting) and 1 input rc2 PORTC = 0x00; // Turn all Off PORTC ANSEL = 0x00; // Set PORT AN0, AN3, AN4, AN5 and AN6 as digital input ANSELH = 0x00; // Set PORT AN8 to AN11 as Digital I/O GIE = 1; // Global interrupt enable // Initialize UART uart_init(); while(1 == 1) //loop forever { if ( RC2 == 1) { send_char('A'); // sending my char to pc send_char('\r'); // or '0x0D' (13 in decimal) -> This one is called "Carriage return" (CR). } //else if (here code for receiving ... ) first get some char on my screen! } } |
De code die ik gebruik om dan de karakter uit te lezen is in XAML (WPF) en zou eigenlijk eerst in een MessageBox moeten weergegeven worden.
De serial poort is gedeclareerd als sp1. De thread "myThread(Read)" is een eerste poging om de karakter uit te lezen.
De nieuwe instantie sp1_DataReceived is een betere vorm om iets in te lezen bij ontvangen van data over de geselecteerde COM poort. Ik heb er de 2manieren erbij geplaatst om aan te tonen dat ik deze 2 heb geprobeerd (zonder resultaat echter
Natuurlijk de functie Text_InLabel() doet nog niet wat zijn benaming weergeeft, eerst wil ik dit testen in een MessageBox.
Wanneer ik dit programma run, dan verkrijg ik geen error, maar ook geen MessageBox
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
| public partial class Window1 : Window { static SerialPort sp1; //if serialport is open dan connection = true static bool connection = false; //thread for reading static Thread myThread = new Thread(Read); public Window1() { InitializeComponent(); set_ComPort(); Text_InLabel(); } //connection with COM3 static void set_ComPort() { try { sp1 = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One); connection = true; } catch (Exception e) { MessageBox.Show("COM3 niet geselecteerd of aangesloten!\n" + e); connection = false; } } static void Text_InLabel() { sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived); if (sp1.IsOpen == false) { //open port for communication try { sp1.Open(); connection = true; } catch (InvalidOperationException i) { MessageBox.Show("\n\nCOM3 aangesloten? \nError: Kijk bij apparaatbeheer of kijk kabel na."); Console.WriteLine(i); } } else { MessageBox.Show("Serieële poort is bezet."); connection = false; return; } } //manier 1 om uit te lezen public static void Read() { while (connection == true) { try { string message = sp1.ReadChar().ToString(); //this.label1.content = message; MessageBox.Show("Bericht: " + message); } catch (TimeoutException t) { MessageBox.Show("Time out\n\n" + t); } } } //manier 2 om uit te lezen BETER deze manier static void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e) { //MessageBox.Show(e.ToString()); //MessageBox.Show(sender.ToString()); MessageBox.Show("Bericht: " + sp1.ReadChar().ToString()); } } |
Alvast dank ik jullie voor het lezen van deze topic, en natuurlijk hoop ik op een reactie dat mij duidelijk kan maken wat hier juist mis loopt.
Mocht het nu wel plots werken, dan meld ik dit natuurlijk !
Groeten,
Wim