📄 485.c
字号:
/****************************************************************************
* 文件名:RcvData.C ---串口1接RS485
* 功能:向串口0 串口1发送数据,并接受1个字节的数据。
* 说明:使用外部11.0592MHz晶振,根据CONFIG.H文件配置,Fpclk=11.0592MHz;
* 通讯波特率9600,8位数据位,1位停止位,无奇偶校验。
* P1.24 方向控制--485DIR COM1
* P0.10 方向控制--485DIR COM0
****************************************************************************/
#include "config.h"
#define UART_BPS 9600 /* 定义通讯波特率 */
#define DIRECT0 (1<<23) //P1.23
#define DIRECT1 (1<<10) //P0.10
volatile uint8 rcv_new; // 接收新数据标志
uint8 rcv_buf[1]; // UART1数据接收缓冲区
extern volatile uint8 cRcvEnter; // 接收回车标志
extern volatile uint8 cRcvSpace; // 接收空格标志
volatile uint8 cRcvKeyNum; // 接收数据标志
volatile uint8 cRcvKeyNum1; // 接收空格标志
uint16 rcv_byte_num;
uint8 const SEND_STRING[] = "System Init OK!\n";
volatile uint8 cRcv_Stat1=0;
volatile uint8 cRcv_Stat0=0;
extern volatile uint8 cData485_Valid1;
extern volatile uint8 cData485_Valid0;
uint16 iRcv_Nmb1,iRcv_Nmb_Max;
uint16 iRcv_Nmb0,iRcv_Nmb_Max0;
extern uint8 work_mode;
union zhongjian2
{
uint16 i;
uint8 ii[2];
}exchange_data2;
extern uint8 cTData[2]; //温度数据,2个字节
extern uint8 cHData; //湿度数据,1个字节
/****************************************************************************
* 名称:fnDelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void fnDelay(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<5000; i++);
}
/****************************************************************************
* 名称:InitAllPort()
* 功能:初始化所有P0 P1端口,设置功能为第一功能或第二功能
* 入口参数:无
* 出口参数:无
****************************************************************************/
void InitAllPort(void)
{
PINSEL0 = 0x00050005; // 设置I/O P0.0-P0.15 UART0 P0.0 TXD P0.1 RXD UART1 P0.8 TXD P0.9 RXD
PINSEL1 = 0x00000000; // 设置I/O P0.16-P0.31 A0-A3
}
/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
volatile uint8 cRcv_Data0[500];
void __irq IRQ_UART0(void)
{
uint16 i;
uint8 static new_data,last_data,last_last_data;
if(work_mode==0)//增加"硬件测试程序"--开始
{
if( 0x04==(U0IIR&0x0F) )
rcv_new = 1;// 设置接收到新的数据标志
for(i=0; i<1; i++)
{ rcv_buf[i] = U0RBR; // 读取FIFO的数据,并清除中断标志
}
cRcvKeyNum=0;
cRcvEnter=0;
switch(U0RBR)
{
case 0x0d:
cRcvEnter=1;
break;
case 0x20://空格 返回主菜单
cRcvKeyNum=20;
break;
case 0x31:
cRcvKeyNum=1;
break;
case 0x32:
cRcvKeyNum=2;
break;
case 0x33:
cRcvKeyNum=3;
break;
case 0x34:
cRcvKeyNum=4;
break;
case 0x35:
cRcvKeyNum=5;
break;
case 0x36:
cRcvKeyNum=6;
break;
case 0x37:
cRcvKeyNum=7;
break;
case 0x38:
cRcvKeyNum=8;
break;
case 0x39:
cRcvKeyNum=9;
break;
case 0x1B://ESC键
cRcvKeyNum=10;
cRcvKeyNum1=10;
break;
default:
break;
}
}
else
{
//VICIntEnClr=VICIntEnClr|(1<<7);
switch(cRcv_Stat0)
{
case 0:
if( 0x04==(U0IIR&0x0F) );
new_data=U0RBR;
if(last_last_data==0x00 && last_data==0x02 && new_data==0xa6)
{
cRcv_Data0[5]=new_data;
cRcv_Data0[4]=last_data;
cRcv_Data0[3]=last_last_data;
cRcv_Data0[2]=0x00;
cRcv_Data0[1]=0x00;
cRcv_Data0[0]=0x00;
iRcv_Nmb0=6;
cRcv_Stat0=1; //是帧头
//UART0_SendStr((uint8 *)"接收帧头正确!");
//g_iTimer1=0; //启动接收定时器
}
else //
{
last_last_data=last_data;
last_data=new_data;
cRcv_Stat0=0;
}
break;
case 1:
if( 0x04==(U0IIR&0x0F) );
cRcv_Data0[iRcv_Nmb0]=U0RBR; //帧数据
if(iRcv_Nmb0==6)
exchange_data2.ii[1]=cRcv_Data0[iRcv_Nmb0];
if(iRcv_Nmb0==7)
exchange_data2.ii[0]=cRcv_Data0[iRcv_Nmb0];//计算有效数据长度,以此作为帧判断的第一步
//UART0_SendStr((uint8 *)"接收帧头正确!");
if(iRcv_Nmb0==exchange_data2.i+11) //判长度---1
{
iRcv_Nmb_Max0=iRcv_Nmb0; //接收完一帧
cRcv_Stat0=0; //准备下一帧的接收
iRcv_Nmb0=0;
if((cRcv_Data0[iRcv_Nmb_Max0]==0x0a)&&(cRcv_Data0[iRcv_Nmb_Max0-1]==0x0d))//判结束字---2
{
for(i=0;i<=iRcv_Nmb_Max0;i++) //接收数据回送,以便调试
{
//URRcvData.cData[i]=cRcv_Data1[i]; //将接收到得数据赋值给接收缓冲区结构体 URRcvData.cData[i] 便于解析
//UART0_SendByte(cRcv_Data1[i]);
}
cData485_Valid0=0x55; //建立已接收485标志
}
else
{
cRcv_Stat0=0;
}
}
else
{
if(iRcv_Nmb0>500)
{
cRcv_Stat0=0;
}
iRcv_Nmb0++; //帧数据
}
break;
default:
cRcv_Stat0=0;
break;
}
//VICVectAddr = 0x00; // 中断处理结束
//VICIntEnable = VICIntEnable|(1<<7);
}
//增加"硬件测试程序"--结束
VICVectAddr = 0x00; // 中断处理结束
}
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
* 入口参数:无
* 出口参数:无
****************************************************************************/
void UART0_Ini(void)
{ uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
U0FCR = 0x01; // 使能FIFO,并设置触发点为1字节 0000 0001
U0IER = 0x01; // 允许RBR中断,即接收中断
/* 设置中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl6 = VICVectCntl6|0x26; // UART1中断通道分配到IRQ slot 0,即优先级最高 0010 0111
VICVectAddr6 = (int)IRQ_UART0; // 设置UART1向量地址
VICIntEnable = VICIntEnable|0x00000040; // 使能UART1中断 1000 0000 参考P63页中断源表
}
/****************************************************************************
* 名称:UART0_SendByte()
* 功能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void UART0_SendByte(uint8 data)
{ U0THR = data; // 发送数据
IO1SET = DIRECT0; // P1.23 = 1
while( (U0LSR&0x40)==0 ); // 等待数据发送完毕
IO1CLR = DIRECT0; // P1.23 = 0
}
/****************************************************************************
* 名称:UART0_SendStr()
* 功能:向串口发送一字符串
* 入口参数:srt 要发送的字符串的指针
* 出口参数:无
****************************************************************************/
void UART0_SendStr(uint8 const *str)
{ while(1)
{ if( *str == '\0' ) break;
UART0_SendByte(*str++); // 发送数据
}
}
/****************************************************************************
* 名称:ISendBuf()
* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void ISendBuf0(void)
{
uint8 i;
for(i=0; i<1; i++) UART0_SendByte(rcv_buf[i]);
while( (U0LSR&0x20)==0 ); // 等待数据发送
rcv_byte_num=0;
}
/****************************串口1-start*************************************/
/****************************串口1-start*************************************/
/****************************************************************************
* 名称:IRQ_UART1()
* 功能:串口UART1接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_UART1(void)
{
uint16 i;
uint8 static new_data,last_data,last_last_data;
uint8 static cRcv_Data1[500];
switch(cRcv_Stat1)
{
case 0:
if( 0x04==(U1IIR&0x0F) );
new_data=U1RBR;
if(last_last_data==0x00 && last_data==0x02 && new_data==0xa6)
{
cRcv_Data1[5]=new_data;
cRcv_Data1[4]=last_data;
cRcv_Data1[3]=last_last_data;
cRcv_Data1[2]=0x00;
cRcv_Data1[1]=0x00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -