📄 usart.c
字号:
{
if(comnum==COM1)//选择COM1
{
while ((IFG1&URXIFG0)==0); //查询是否发送完毕
return RXBUF0;//TXBUF0=databyte;//TXBUF0=*pBuffer;
}
if(comnum==COM2)//选择COM2
{
while ((IFG2&URXIFG1)==0); //查询是否发送完毕
return RXBUF1;//TXBUF1=databyte;//TXBUF0=*pBuffer;
}
return 0;
}
/*****************************************************************************
发送字节函数。采用查询方式。
* comnum:输入:COM1 :初始化com1 port.
* 输入:COM2 :初始化com2 port.
pBuffer:指向发送数据缓冲区的指针
databyte:发送的字节
******************************************************************************/
void SendUartByte(uint8 comnum,uint8 databyte)
{
if(comnum==COM1)//选择COM1
{
while ((IFG1&UTXIFG0)==0); //查询是否发送完毕
TXBUF0=databyte;//TXBUF0=*pBuffer;
}
if(comnum==COM2)//选择COM2
{
while ((IFG2&UTXIFG1)==0); //查询是否发送完毕
TXBUF1=databyte;//TXBUF0=*pBuffer;
}
}
/*****************************************************************************
//发送字符串函数
void SendUartChar(uint8 comnum,uint8 DataChar)
{
SendUartByte(comnum,DataChar);
}
******************************************************************************/
/*****************************************************************************/
//发送字符串函数
void SendUartString(uint8 comnum,uint8 *datastring)
{
while (*datastring) // 写显示字符
{
SendUartByte(comnum,*datastring);
datastring++;
}
}
/******************************************************************************/
void UsartNewLine( uint8 comnum, uchar n )//回车 换 N 行
{
while(n--)
{
SendUartByte(comnum, 0x0d );
SendUartByte(comnum, 0x0a );
}
}
/******************************************************************************/
void Usart_N_Space(uint8 comnum, uchar n )// N 个空格
{
while(n--)
{
SendUartByte(comnum, ' ' );
}
}
/*****************************************************************************
发送函数。采用查询方式。
* comnum:输入:COM1 :初始化com1 port.
* 输入:COM2 :初始化com2 port.
pBuffer:指向发送数据缓冲区的指针
n_byte:发送的字节数
******************************************************************************/
void SendUart(uint8 comnum,uint8 *pBuffer,uint8 n_byte)//,uint8 n_byte
{
unsigned char q0;
RS485_Set(ConstManageIC, RS485_TRAN);//485设置 为发送
if(comnum==COM1)//选择COM1
{
for(q0=0;q0<n_byte;q0++)//while(*pBuffer)//直到发送完毕
{
while ((IFG1&UTXIFG0)==0); //查询是否发送完毕
TXBUF0=*pBuffer;//TXBUF0=*pBuffer;
pBuffer++;
}
}
if(comnum==COM2)//选择COM2
{
for(q0=0;q0<n_byte;q0++)//while(*pBuffer)//直到发送完毕
{
while ((IFG2&UTXIFG1)==0); //查询是否发送完毕
TXBUF1=*pBuffer;//TXBUF0=*pBuffer;
pBuffer++;
}
}
RS485_Set(ConstManageIC, RS485_REC);//485设置 为接收
}
/*****************************************************
//取消USART的中断操作
Stop_COM(COM1,UsartRXD) //stop COM1's RXD
Stop_COM(COM2,UsartRXD) //stop COM2's RXD
*****************************************************/
void Stop_COM(uint8 comnum,uint8 UsartTXDorRXD)//stop COMX's TXD or RXD
{
if(comnum==COM1)//选择COM1
{
if(UsartTXDorRXD==UsartTXD)
{IE1 &= ~UTXIE0;} //取消UART1的TX中断
else if(UsartTXDorRXD==UsartRXD)
{IE1 &= ~URXIE0;} //取消UART1的RX中断
else if(UsartTXDorRXD==UsartAll)
{IE1 &= ~UTXIE0; IE1 &= ~URXIE0;} //取消UART1的RX和TX中断
}
if(comnum==COM2)//选择COM2
{
if(UsartTXDorRXD==UsartTXD)
{IE2 &= ~UTXIE1;} //取消UART1的TX中断
else if(UsartTXDorRXD==UsartRXD)
{IE2 &= ~URXIE1;} //取消UART1的RX中断
else if(UsartTXDorRXD==UsartAll)
{IE2 &= ~UTXIE1; IE2 &= ~URXIE1;} //取消UART1的RX和TX中断
}
}
/*****************************************************
//取消USART的中断操作
Start_COM(COM1,UsartRXD) //start COM1's RXD
Start_COM(COM2,UsartRXD) //start COM2's RXD
*****************************************************/
void Start_COM(uint8 comnum,uint8 UsartTXDorRXD)//start COMX's TXD or RXD
{
if(comnum==COM1)//选择COM1
{
if(UsartTXDorRXD==UsartTXD)
{IE1 |= UTXIE0;} //取消UART1的TX中断
else if(UsartTXDorRXD==UsartRXD)
{IE1 |= URXIE0;} //取消UART1的RX中断
else if(UsartTXDorRXD==UsartAll)
{IE1 |= UTXIE0; IE1 |= URXIE0;} //取消UART1的RX和TX中断
}
if(comnum==COM2)//选择COM2
{
if(UsartTXDorRXD==UsartTXD)
{IE2 |= UTXIE1;} //取消UART1的TX中断
else if(UsartTXDorRXD==UsartRXD)
{IE2 |= URXIE1;} //取消UART1的RX中断
else if(UsartTXDorRXD==UsartAll)
{IE2 |= UTXIE1; IE2 |= URXIE1;} //取消UART1的RX和TX中断
}
}
//HEX型转CHAR型函数
void SendUartHextoChar(uint8 comnum, uchar datt)
{
SendUartString( comnum, "0x" );
SendUartByte( comnum, Tab_Char[datt/16] );
SendUartByte( comnum, Tab_Char[datt%16] );
Usart_N_Space( comnum, 4 );//4个空格
}
//数组元素的HEX型转String型函数
void SendUartHextoString(uint8 comnum,uint8 *datastring)
{
while (*datastring) // 写显示字符
{
SendUartHextoChar(comnum,*datastring);
datastring++;
}
}
//多机通信 //地址位多机通信模式
void InitCom_MutiMode( uint8 comnum, uint8 MutiMode )
{
if(comnum==COM1)//选择COM1
{
if(MutiMode == MutiMode_Addr) //地址位多机协议
{
UCTL0 = CHAR+MM+SWRST; //8位数据,1位停止位,地址位多机协议
U0RCTL |= URXWIE; //只有地址字符使URXIFG置位
UCTL0 &= ~SWRST; //设置结束
}
if(MutiMode == MutiMode_Idle) //空闲位多机协议
{
UCTL0 = CHAR+SWRST; //8位数据,1位停止位,地址位多机协议
UCTL0 &= ~MM;
U0RCTL |= URXWIE; //只有地址字符使URXIFG置位
UCTL0 &= ~SWRST; //设置结束
}
}
if(comnum==COM2)//选择COM2
{
if(MutiMode == MutiMode_Addr) //地址位多机协议
{
UCTL1 = CHAR+MM+SWRST; //8位数据,1位停止位,地址位多机协议
U1RCTL |= URXWIE; //只有地址字符使URXIFG置位
UCTL1 &= ~SWRST; //设置结束
}
if(MutiMode == MutiMode_Idle) //空闲位多机协议
{
UCTL1 = CHAR+SWRST; //8位数据,1位停止位,地址位多机协议
UCTL1 &= ~MM;
U1RCTL |= URXWIE; //只有地址字符使URXIFG置位
UCTL1 &= ~SWRST; //设置结束
}
}
}
/******************************************************************
//检测引导码
uchar COM2_Lead_flag=0;
void UartTestLead(void)
{
if(RXBUF1 == 0xf0)//如果检测到数据都是0XF0,则不做处理
{
//COM2_Lead_flag = 1;
COM2_Lead_cnt++;
if(COM2_Lead_cnt>=4)
{
COM2_R_Data_flag = 1;
}
else
{
COM2_R_Data_flag = 0;
}
}
else
{
//COM2_Lead_flag = 2;
if(COM2_R_Data_flag == 1)
COM2_Lead_cnt=0;
}
}
//串口接收函数
{
g_aRecvBuf[g_bRxdPos++]=RXBUF1;
if(g_bRxdPos >= RecDataLen)
{
g_bRxdPos=0;
COM2_R_flag=1;
}
}
******************************************************************/
/********************关于RS485方面*******************************/
void RS485_Set(uchar ucIC, uchar ucT_or_R)
{
//delay_nms(50);//延迟一点
if(ucIC == ConstManageIC)
{
P5_GPIOInit(BIT1,OUT);
if(ucT_or_R == RS485_TRAN)
{
P5OUT |=BIT1;
}
if(ucT_or_R == RS485_REC)
{
P5OUT &=~BIT1;
}
}
if(ucIC == RotManageIC)
{
P4_GPIOInit(BIT0,OUT);
if(ucT_or_R == RS485_TRAN)
{
P4OUT |=BIT0;
}
if(ucT_or_R == RS485_REC)
{
P4OUT &=~BIT0;
}
}
delay_nms(1000);//延迟一点
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -