Skocz do zawartości

Prośba o tutorial - komunikacja GUI <-> uC


paavo91

Pomocna odpowiedź

Witam.

Nie wiedziałem gdzie ten temat umieścić, mam nadzieje, że w razie czego ktoś przeniesie.

Pewno wiele użytkowników używa komunikacji po rs232 pomiędzy aplikacją na PC a mikrokontrolerem. Czy ktoś z użytkowników mógłby napisać krótki tutorial jak formować ramki, jak je przesyłać, jak interpretować po odpowiedniej stronie?

Myślę, że takie coś przydałoby się każdemu.\

Dzięki.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Widzę, że nikt w temat nie wniknął ale dołożę jeszcze kawałek kodu. Odnośnie samego usarta nic ponadto co wcześniej ale przy okazji tego tematu może się przyda początkującym do czegoś.

main.c

#include "_usart.h"
mainduino(void){            // ;D

usart.init(115200);                //BAUD 115200
usart.send_string(usart.txt);

while(1){
	// wysyla to co odebral z terminalu.
	// Odbiera poprawnie tylko zakres uint8 (0-255) zakonczone EOL
	if(usart_data_ready) usart.send_uint8(usart.rec_uint8());
}
}

USART.c :

/*                                          USART.c                                                     */

#include "USART.h" 

char buf_txt[_buf_size];
volatile uint8_t c_data = 0;
volatile uint8_t int_count = 0;
volatile uint8_t usart_data_ready = 0;

void usart_init(uint32_t Baud){
#define UBRRL_VALUE (((F_CPU) + 4UL * (Baud)) / (8UL * (Baud))) - 1
//gdyby jednak nie działało: pokombinować ^
#define UBRRH_VALUE (UBRRL_VALUE >> 8)
UCSRA |= (1 << U2X);
UBRRH = UBRRH_VALUE;               
UBRRL = UBRRL_VALUE;
UCSRC |= _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0);
UCSRB |= _BV(TXEN) | _BV(RXEN) | _BV(RXCIE);
sei();
}
uint8_t *usart_rec_uint8(void){
usart_data_ready = 0;
return &c_data;
}
void usart_sendS(char *string){

for(; *string; string++){
while (!(UCSRA & _BV(UDRE)));
UDR = *string;
}
}
void usart_send_uint8(uint8_t *c){
utoa(*c, buf_txt, 10);       
usart_sendS(buf_txt);
usart_sendS(" \r\n");
}
ISR(USART_RXC_vect){
int_count++;
c_data = UDR;          
if(int_count  < _buf_size){
	buf_txt[int_count - 1] = c_data;
	if(c_data == '\n'){
		buf_txt[int_count - 1] = 0;
		c_data = atoi(buf_txt);	// stdlib.h - konwertuje string do uint (string w tym wypadku to buf_txt) ~= 20us
		usart_data_ready = 1;
		int_count = 0;
	}
}else int_count = 0;
};

USART.h

/*                                         USART.h                                                 */
#ifndef _USART_H_
#define _USART_H_

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#define _NBV(pin)        ~(1<<(pin))

#define _buf_size 8

volatile uint8_t usart_data_ready;

void usart_init(uint32_t);
uint8_t *usart_rec_uint8(void);
void usart_sendS(char *);
void usart_send_uint8(uint8_t *);






#warning "on sie cieszy, ze mogl byc uzyteczny"
#define mainduino char t[29]={83,90,67,90,69,83,76,73,87,69,71,79,32,78,79,87,69,71,79,32,82,79,75,85,33,10,0};typedef struct{char *txt;void (*init)(uint32_t);void (*send_string)(char *);uint8_t *(*rec_uint8)(void);void (*send_uint8)(uint8_t *);}u_s_a_r_t;u_s_a_r_t usart={t,&usart_init,&usart_sendS,&usart_rec_uint8,&usart_send_uint8};int main
#endif

dziękuję za uwagę ;D hh

EDIT:

Edit dla schizotyków: odtyldowano.

Explano: żart rzecz jasna ;D

Z serca wszystkiego najlepszego dla wszystkich i dla każdego. Najlepiej niech każdy sam sobie odpowie czy zasłużył na tyldę. 😉

Najlepszego w nowym roku!

EDIT: optymalizacja aplikacji, minimalizacja kompromitacji

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.