⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 putchar_485.c

📁 msp430串口程序 MSP430_UART_DEMO
💻 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 + -