Сообщение от Fangir
|
|
while(*str != '\0')
|
а если "\0" вдруг чего-то не придёт?
Функция void usart0_put(char *str) 7 мсек - не много?
Надо контроль ошибок сделать.
Начало сообщения обозначить может быть.
вообще понадёжнее как-то.
Читайте про Модбас, там вроде минималка для нормального обмена.
Стандартная библиотека USART чем не нравится? Там получше обработка будет.
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1‹‹FE)
#define PARITY_ERROR (1‹‹UPE)
#define DATA_OVERRUN (1‹‹OVR)
#define DATA_REGISTER_EMPTY (1‹‹UDRE)
#define RX_COMPLETE (1‹‹RXC)
// USART0 Receiver buffer
#define RX_BUFFER_SIZE0 16
char rx_buffer0[RX_BUFFER_SIZE0];
#if RX_BUFFER_SIZE0‹256
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
#else
unsigned int rx_wr_index0,rx_rd_index0,rx_counter0;
#endif
// This flag is set on USART0 Receiver buffer overflow
bit rx_buffer_overflow0;
char rx_errors=0;
// USART0 Receiver interrupt service routine
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer0[rx_wr_index0]=data;
if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
if (++rx_counter0 == RX_BUFFER_SIZE0)
{
rx_counter0=0;
rx_buffer_overflow0=1;
};
}else {rx_errors++;};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART1 Transmitter buffer
#define TX_BUFFER_SIZE1 255
unsigned char tx_message [TX_BUFFER_SIZE1];
unsigned char tx_counter1=0;
unsigned char tx_len=0;
// USART1 Transmitter interrupt service routine
//перед этим первый байт отправить вручную и tx_len длину сообщения определить.
interrupt [USART1_TXC] void usart1_tx_isr(void)
{
tx_counter1++;
while ((UCSR1A & DATA_REGISTER_EMPTY)==0){};
if (tx_counter1‹tx_len)
{
UDR1=tx_message [tx_counter1];
}
}