📄 serialcomm.c
字号:
#define SER_GLOBALS
#include "..\source\CPU_Source\includes.h"
/*
*******************************************************************************
** Uart初始化
**
**功 能:配置所使用的Uart端口
**参 数:无
**返 回 值:无
**创建日期:2009年03月10日
**修改记录:
**说 明:
*******************************************************************************
*/
void Uart_Init(void)
{
INT8U temp;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
switch(SysParam[eeprom_baud])
{
case 1200:
UBRRL=0xCF;
break;
case 2400:
UBRRL=0x67;
break;
case 4800:
UBRRL=0x33;
break;
case 9600:
UBRRL=0x19;
break;
case 19200:
UBRRL=0x0c;
break;
default:
UBRRL=0x19;
break;
}
UartRingBuf.RxCounter=0;
UartRingBuf.RxIndex=0;
UartRingBuf.RxInptr=0;
UartRingBuf.RxOutptr=0;
UartRingBuf.TxCounter=0;
for(temp=0;temp<UART_TX_BUF_SIZE;temp++)
UartRingBuf.TxBuf[temp]=0;
UartRingBuf.TxInptr=0;
UartRingBuf.TxOutptr=0;
}
/*
*********************************************************************************************************
* Rx Communication handler for uC/OS-Bms
*
* Description: This function is called by OSBms_RxISR (see OS_Bms_a.ASM) to process a received
* character interrupt.
*********************************************************************************************************
*/
void OSBms_RxISRHandler (void)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
POSMSG pmsg;
INT8U rx_status;
INT8U rx_data;
OS_ENTER_CRITICAL();
rx_status = UCSRA;
rx_data = UDR;
/* Clear interrupt source by reading Rx Data */
if(UartRingBuf.RxCounter<UART_RX_FRAME){/*缓冲区满则放弃接收*/
if (rx_status & ((1<<FE)|(1<<PE)|(1<<DOR)|(1 << RXC))) { /* Check if received character? */
UartRingBuf.RxBuf[UartRingBuf.RxInptr][UartRingBuf.RxIndex++] = rx_data;
switch(UartRingBuf.RxIndex)
{
case 1:
if(rx_data!=UART_BEGIN_STX)
UartRingBuf.RxIndex=0;
break;
case 2:
if(rx_data!=ClientAddr)
UartRingBuf.RxIndex=0;
break;
case UART_RX_FRAME_SIZE:
if(rx_data==UART_END_STX)
{
UartRingBuf.RxInptr++;
if(UartRingBuf.RxInptr==UART_RX_FRAME)
UartRingBuf.RxInptr=0;
UartRingBuf.RxCounter++;
OSSemPost(UartRxSem);
}
UartRingBuf.RxIndex=0;
break;
}
}
}
OS_EXIT_CRITICAL();
}
/*
*********************************************************************************************************
* Tx Communication handler for uC/OS-Bms
* (PORT SPECIFIC)
*
* Description: Handle transmission of a character
*
* Note(s) : 1) This function is called by OSView_UDREISR (see OS_BMS_a.ASM)
*********************************************************************************************************
*/
void OSBms_UDREISRHandler (void)
{
OS_ENTER_CRITICAL();//关中断
if(UartRingBuf.TxCounter)
{
UartRingBuf.TxCounter--;
UDR=UartRingBuf.TxBuf[UartRingBuf.TxOutptr++];
if(UartRingBuf.TxOutptr==UART_TX_BUF_SIZE)
UartRingBuf.TxOutptr=0;
}
else
{
UCSRB&=~(1<<UDRIE);
}
OS_EXIT_CRITICAL();
}
/*
*********************************************************************************************************
* Tx Communication function for uC/OS-Bms
* (PORT SPECIFIC)
*
* Description: Handle transmission of a character
*
* Note(s):
*********************************************************************************************************
*/
void Uart_PutChar(INT8U c)
{
if(UartRingBuf.TxCounter||((UCSRA & (1<<UDRE))==0))
{
OS_ENTER_CRITICAL();//关中断
if((UartRingBuf.TxCounter==0)&&((UCSRA & (1<<UDRE))==1))
{
UDR=c;
UCSRB |= (1 << UDRIE);
}
else
{
UartRingBuf.TxBuf[UartRingBuf.TxInptr++]=c;
if(UartRingBuf.TxInptr==UART_TX_BUF_SIZE)
UartRingBuf.TxInptr=0;
UartRingBuf.TxCounter++;
}
OS_EXIT_CRITICAL();
}
else
{
OS_ENTER_CRITICAL();//关中断
UDR=c;
UCSRB |= (1 << UDRIE);
OS_EXIT_CRITICAL();
}
}
void Uart_GetFrame(INT8U *buf)
{
INT8U i,index;
OS_ENTER_CRITICAL();//关中断
index=UartRingBuf.RxOutptr++;
if(UartRingBuf.RxOutptr==UART_RX_FRAME)
UartRingBuf.RxOutptr=0;
for(i=0;i<UART_RX_FRAME_SIZE;i++)
(*buf++)=UartRingBuf.RxBuf[index][i];
UartRingBuf.RxCounter--;
OS_EXIT_CRITICAL();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -