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

📄 putchar_232.c

📁 基于Msp430的串口通信程序
💻 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 + -