📄 uart.c
字号:
/************************************************
uart.c - Routines for a buffered UART.
*************************************************/
#include <iom8.h>
#include "uart.h"
#include "buffer.h"
#define UART_BAUD_RATE 115200
#define UART_UBRR 3//((F_CPU / 16 / UART_BAUD_RATE)-1)
bsCircBuffer g_receiveBuffer;
bsCircBuffer g_transmitBuffer;
// serInit() - Initialises the serial port routines
void serInit(void)
{ buInitBuffer(&g_receiveBuffer);
buInitBuffer(&g_transmitBuffer);
UCSRB = 0xD8;
UBRRL = UART_UBRR;
}
// ISR : RX - When a byte is received, throw it into the receive buffer.
#pragma vector = USART_RXC_vect
__interrupt void USART_RX_Complete(void)
{ unsigned char nByte;
nByte = UDR;
buWriteByte(&g_receiveBuffer, nByte);
}
// ISR : TX - When the data buffer is empty, transmit a byte if possible, otherwise disable
// this interrupt.
#pragma vector = USART_UDRE_vect
__interrupt void USART_UDR_Empty(void)
{ if(!buIsBufferEmpty(&g_transmitBuffer))
{ unsigned char nData;
nData = buReadByte(&g_transmitBuffer);
UDR = nData;
}
else UCSRB_Bit5 = 0;
}
// serHasBytesBeenReceived() - Returns whether or not bytes have been received.
// Returns:
// 0 - Input buffer empty
// else - Bytes are available
unsigned char serHasBytesBeenReceived(void)
{ return (buIsBufferEmpty(&g_receiveBuffer) ? 0 : 1);
}
// serReadByte() - Returns a received byte from the buffer. Ensure that there
// is data in the buffer first by reading serGetBytesReceived() first.
// Returns:
// A byte from the receive buffer
unsigned char serReadByte(void)
{ return buReadByte(&g_receiveBuffer);
}
// serWriteByte() - Puts a byte into the transmit buffer, and enable the transmit
// interrupt.
// Returns:
// The number of bytes written into the buffer.
unsigned char serWriteByte(unsigned char nData)
{ unsigned char nBytesInBuffer;
if(buWriteByte(&g_transmitBuffer, nData) != 0) nBytesInBuffer = 0;
else
{ nBytesInBuffer = 1;
UCSRB_Bit5 = 1;
}
return nBytesInBuffer;
}
// serGetTransmitBufferFull() - Indicates if the output buffer is full or not
// Returns:
// 0 - Transmit buffer is not full
// 1 - Transmit buffer is full
unsigned char serGetTransmitBufferFull(void)
{ return buIsBufferFull(&g_transmitBuffer);
}
// serWriteFromSRAM() - Writes a string to the serial port from SRAM.
// pString - A pointer to SRAM
// nLength - The number of characters in the string
// Returns:
// The number of bytes written to the transmit buffer
unsigned char serWriteFromSRAM(const unsigned char *pString, unsigned char nLength)
{ unsigned char nBytesInBuffer;
nBytesInBuffer = 0;
for( ; nLength > 0; nLength--)
{ if(buWriteByte(&g_transmitBuffer, *pString) != 0) break;
nBytesInBuffer++;
pString++;
}
UCSRB_Bit5 = 1;
return nBytesInBuffer;
}
// serGetTransmitBufferEmpty() - Returns whether or not the transmit buffer
// is emtpy.
// Returns:
// 0 - Transmit buffer not empty
// else - Transmit buffer empty
unsigned char serGetTransmitBufferEmpty(void)
{ return buIsBufferEmpty(&g_transmitBuffer);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -