📄 putchar_485.c
字号:
#include "device.h"
#include "putchar_485.h"
#include <string.h>
__interrupt void USART0_TX_sir(void);
__interrupt void USART0_RX_isr(void);
int putchar_485(int c)
{
if (c == 0x0D) // Convert EOL to CR/LF
RS485TXChar_485(0x0A);
RS485TXChar_485(c);
return c;
}
#define TX_INT_DISABLE_485 IE2 &= ~UTXIE1
#define TX_INT_ENABLE_485 IE2 |= UTXIE1
#define RX_INT_DISABLE_485 IE2 &= ~URXIE1
#define RX_INT_ENABLE_485 IE2 |= URXIE1
unsigned char ucRXBuffer_485[RXBUFSIZE_485]; // receive buffer
// receive buffer indexes :
unsigned char ucRXReadIndex_485 =0, ucRXWriteIndex_485 =0;
// count of received bytes:
volatile unsigned int ucRXCharCount_485 =0;
unsigned char ucTXBuffer_485[TXBUFSIZE_485]; // transmit buffer
// transmit buffer indexes:
unsigned char ucTXReadIndex_485 =0, ucTXWriteIndex_485 =0;
// not yet transmitted bytes:
volatile unsigned char ucTXCharCount_485 =0;
#define BUFFER_EMPTY 1 // 1: nothing to send
unsigned char bTXBufferEmpty_485; // flag for synchronization
void RS485Init (void)
{
P3SEL |= 0xC0; // P3.6,7 = USART1 option select
P3DIR |= 0x40; // P3.6 = output direction
ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
UCTL1 |= CHAR; // 8-bit character
UTCTL1 |= SSEL1; // UCLK = ACLK
UBR01 = 0xA0; // 4M/9600 - 3.41
UBR11 = 0x01; //
UMCTL1 = 0xEB; // Modulation
UCTL1 &= ~SWRST; // Initialize USART state machine
IE2 |= URXIE1 + UTXIE1; // Enable USART1 RX interrupt
}
//////////////////////////////////////////////////////////////
// Name: RS485TXChar
// 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 RS485TXChar_485 (char cByte)
{
ucTXBuffer_485[ucTXWriteIndex_485++] = cByte; // load byte to buffer and inc index
ucTXWriteIndex_485 &= TXBUFSIZE_485-1; // adjust index to borders of buffer
TX_INT_DISABLE_485; // disable transmit interrupt (in IE2)
ucTXCharCount_485++; // new char, inc count
TX_INT_ENABLE_485; // enable interrupt (in IE2)
if (bTXBufferEmpty_485 && ucTXCharCount_485) // buffer had been empty
{
bTXBufferEmpty_485 = !BUFFER_EMPTY; // reset empty flag
TXBUF0 = ucTXBuffer_485[ucTXReadIndex_485++]; // load tx register, inc index
ucTXReadIndex_485 &= TXBUFSIZE_485-1; // adjust index
ucTXCharCount_485--; // char sent, dec count
}
}
//////////////////////////////////////////////////////////////
// Name: TXInterrupt
// Description: Transmit interrupt service routine called by transmit register
// empty
// Parameter: -
// Returns: -
//////////////////////////////////////////////////////////////
#pragma vector=USART1TX_VECTOR
__interrupt void USART1_TX_sir(void)
{
if (ucTXCharCount_485)
{ // send if chars are in buffer
TXBUF0 = ucTXBuffer_485[ucTXReadIndex_485++]; // load tx register, inc index
ucTXReadIndex_485 &= TXBUFSIZE_485-1; // adjust index
ucTXCharCount_485--; // char sent, dec count
}
else // buffer empty, nothing to do
{
bTXBufferEmpty_485 = BUFFER_EMPTY; // set empty flag
}
}
//////////////////////////////////////////////////////////////
// Name: RXInterrupt
// Description: Receive interrupt service routine called by receive register
// full
// Parameter: -
// Returns: -
//////////////////////////////////////////////////////////////
#pragma vector=USART1RX_VECTOR
__interrupt void USART1_RX_isr(void)
{
ucRXBuffer_485[ucRXWriteIndex_485++] = RXBUF0; // store received byte and
// inc receive index
ucRXWriteIndex_485 &= RXBUFSIZE_485-1; // reset index
ucRXCharCount_485++; // received, inc count
//LPM3_EXIT;
}
//////////////////////////////////////////////////////////////
// Name: ucRS485RXBufferCount
// Description: How many chars are stored in RX buffer ?
// if main routine wants to read chars, it has
// to check first if ucRS485RXBufferCount() returns !=0
// Parameter: -
// Returns: number of chars in receive buffer
//////////////////////////////////////////////////////////////
unsigned char RS485RXBufferCount_485 (void)
{
return (ucRXCharCount_485);
}
//////////////////////////////////////////////////////////////
// Name: cRS485GetChar
// Description: Get one char from RX buffer. Multiple calls will
// return all chars.
// Parameter: -
// Returns: next valid char in receive buffer
//////////////////////////////////////////////////////////////
char RS485GetChar_485 (void)
{
char Byte;
if (ucRXCharCount_485)
{ // char still available
Byte = ucRXBuffer_485[ucRXReadIndex_485++]; // get byte from buffer
ucRXReadIndex_485 &= RXBUFSIZE_485-1; // adjust index
RX_INT_DISABLE_485; // disable rx interrupt (IE2)
ucRXCharCount_485--; // one char read, dec count
RX_INT_ENABLE_485; // done, enable int (IE2)
return (Byte);
}
else
return (0); // if there is no new char
}
char RS485GetByte_485 (void)
{
char Byte;
if (ucRXCharCount_485)
{ // char still available
Byte = ucRXBuffer_485[ucRXReadIndex_485++]; // get byte from buffer
ucRXReadIndex_485 &= RXBUFSIZE_485-1; // adjust index
RX_INT_DISABLE_485; // disable rx interrupt (IE2)
ucRXCharCount_485--; // one char read, dec count
RX_INT_ENABLE_485; // 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 rs485_send_bytes_485(char *bytes,int len)
{
unsigned int i;
for(i = 0;i < len;i++)
{
RS485TXChar_485(bytes[i]);
}
return(i);
}
int rs485_send_string_485(char *string)
{
unsigned int i,str_len;
str_len = strlen(string);
for(i = 0;i < str_len;i++)
{
putchar_485(string[i]);
}
putchar_485(0x0D);
return(i);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -