Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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.

  • 5 miesiące później...

Takie coś widziałem w DS od atmegi 🙂

Generalnie do usarta ładuje się 8bitowe stringi bo to z założenia komunikacja tekstowa w większości wypadków.

EDIT: redukcja offtopu.

  • 2 tygodnie później...

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

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...