📄 putchar_232.c
字号:
#include "device.h"
#include "putchar_232.h"
#include <string.h>
__interrupt void USART0_TX_sir(void);
__interrupt void USART0_RX_isr(void);
int putchar_232(int c)
{
if (c == 0x0D) // Convert EOL to CR/LF
RS232TXChar_232(0x0A);
RS232TXChar_232(c);
return c;
}
#define TX_INT_DISABLE_232 IE1 &= ~UTXIE0
#define TX_INT_ENABLE_232 IE1 |= UTXIE0
#define RX_INT_DISABLE_232 IE1 &= ~URXIE0
#define RX_INT_ENABLE_232 IE1 |= URXIE0
unsigned char ucRXBuffer_232[RXBUFSIZE_232]; // receive buffer
// receive buffer indexes :
unsigned char ucRXReadIndex_232 =0, ucRXWriteIndex_232 =0;
// count of received bytes:
volatile unsigned int ucRXCharCount_232 =0;
unsigned char ucTXBuffer_232[TXBUFSIZE_232]; // transmit buffer
// transmit buffer indexes:
unsigned char ucTXReadIndex_232 =0, ucTXWriteIndex_232 =0;
// not yet transmitted bytes:
volatile unsigned char ucTXCharCount_232 =0;
#define BUFFER_EMPTY 1 // 1: nothing to send
unsigned char bTXBufferEmpty_232; // flag for synchronization
void RS232Init (void)
{
P3SEL |= 0x30; // P3.4,5 = USART1 option select
P3DIR |= 0x10; // P3.4 = output direction
ME1 |= UTXE0 + URXE0; // Enable USART1 TXD/RXD
UCTL0 |= CHAR; // 8-bit character
UTCTL0 |= SSEL1; // UCLK = ACLK
UBR00 = 0xA0; // 4M/9600 - 3.41
UBR10 = 0x01; //
UMCTL0 = 0xEB; // Modulation
UCTL0 &= ~SWRST; // Initialize USART state machine
IE1 |= URXIE0 + UTXIE0; // Enable USART1 RX interrupt
}
//////////////////////////////////////////////////////////////
// Name: RS232TXChar
// Description: stores one char in TX buffer. If it's the first one,
// send it immediately. Rest is sent by TXInterrupt automatically
// Parameter: char cByte (to store in buffer)
// Returns: -
//////////////////////////////////////////////////////////////
void RS232TXChar_232 (char cByte)
{
ucTXBuffer_232[ucTXWriteIndex_232++] = cByte; // load byte to buffer and inc index
ucTXWriteIndex_232 &= TXBUFSIZE_232-1; // adjust index to borders of buffer
TX_INT_DISABLE_232; // disable transmit interrupt (in IE2)
ucTXCharCount_232++; // new char, inc count
TX_INT_ENABLE_232; // enable interrupt (in IE2)
if (bTXBufferEmpty_232 && ucTXCharCount_232) // buffer had been empty
{
bTXBufferEmpty_232 = !BUFFER_EMPTY; // reset empty flag
TXBUF0 = ucTXBuffer_232[ucTXReadIndex_232++]; // load tx register, inc index
ucTXReadIndex_232 &= TXBUFSIZE_232-1; // adjust index
ucTXCharCount_232--; // char sent, dec count
}
}
//////////////////////////////////////////////////////////////
// Name: TXInterrupt
// Description: Transmit interrupt service routine called by transmit register
// empty
// Parameter: -
// Returns: -
//////////////////////////////////////////////////////////////
#pragma vector=USART0TX_VECTOR
__interrupt void USART0_TX_sir(void)
{
if (ucTXCharCount_232)
{ // send if chars are in buffer
TXBUF0 = ucTXBuffer_232[ucTXReadIndex_232++]; // load tx register, inc index
ucTXReadIndex_232 &= TXBUFSIZE_232-1; // adjust index
ucTXCharCount_232--; // char sent, dec count
}
else // buffer empty, nothing to do
{
bTXBufferEmpty_232 = BUFFER_EMPTY; // set empty flag
}
}
//////////////////////////////////////////////////////////////
// Name: RXInterrupt
// Description: Receive interrupt service routine called by receive register
// full
// Parameter: -
// Returns: -
//////////////////////////////////////////////////////////////
#pragma vector=USART0RX_VECTOR
__interrupt void USART0_RX_isr(void)
{
ucRXBuffer_232[ucRXWriteIndex_232++] = RXBUF0; // store received byte and
// inc receive index
ucRXWriteIndex_232 &= RXBUFSIZE_232-1; // reset index
ucRXCharCount_232++; // received, inc count
//LPM3_EXIT;
}
//////////////////////////////////////////////////////////////
// Name: ucRS232RXBufferCount
// Description: How many chars are stored in RX buffer ?
// if main routine wants to read chars, it has
// to check first if ucRS232RXBufferCount() returns !=0
// Parameter: -
// Returns: number of chars in receive buffer
//////////////////////////////////////////////////////////////
unsigned char RS232RXBufferCount_232 (void)
{
return (ucRXCharCount_232);
}
//////////////////////////////////////////////////////////////
// Name: cRS232GetChar
// Description: Get one char from RX buffer. Multiple calls will
// return all chars.
// Parameter: -
// Returns: next valid char in receive buffer
//////////////////////////////////////////////////////////////
char RS232GetChar_232 (void)
{
char Byte;
if (ucRXCharCount_232)
{ // char still available
Byte = ucRXBuffer_232[ucRXReadIndex_232++]; // get byte from buffer
ucRXReadIndex_232 &= RXBUFSIZE_232-1; // adjust index
RX_INT_DISABLE_232; // disable rx interrupt (IE2)
ucRXCharCount_232--; // one char read, dec count
RX_INT_ENABLE_232; // done, enable int (IE2)
return (Byte);
}
else
return (0); // if there is no new char
}
char RS232GetByte_232 (void)
{
char Byte;
if (ucRXCharCount_232)
{ // char still available
Byte = ucRXBuffer_232[ucRXReadIndex_232++]; // get byte from buffer
ucRXReadIndex_232 &= RXBUFSIZE_232-1; // adjust index
RX_INT_DISABLE_232; // disable rx interrupt (IE2)
ucRXCharCount_232--; // one char read, dec count
RX_INT_ENABLE_232; // done, enable int (IE2)
return (Byte);
}
else
return (0); // if there is no new char
}
//////////////////////////////////////////////////////////////
// Name: send_bytes
// Description: 发送特定长度的字符到发送缓冲区
// return 实际发送的字节数.
// Parameter: char *bytes,发送字符串的首地址。int len,发送字符长度
//////////////////////////////////////////////////////////////
int rs232_send_bytes_232(char *bytes,int len)
{
unsigned int i;
for(i = 0;i < len;i++)
{
RS232TXChar_232(bytes[i]);
}
return(i);
}
int rs232_send_string_232(char *string)
{
unsigned int i,str_len;
str_len = strlen(string);
for(i = 0;i < str_len;i++)
{
putchar_232(string[i]);
}
putchar_232(0x0D);
return(i);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -