📄 485.c
字号:
cRcv_Data1[0]=0x00;
iRcv_Nmb1=6;
cRcv_Stat1=1; //是帧头
//UART0_SendStr((uint8 *)"接收帧头正确!");
//g_iTimer1=0; //启动接收定时器
}
else //
{
last_last_data=last_data;
last_data=new_data;
cRcv_Stat1=0;
}
break;
case 1:
if( 0x04==(U1IIR&0x0F) );
cRcv_Data1[iRcv_Nmb1]=U1RBR; //帧数据
if(iRcv_Nmb1==6)
exchange_data2.ii[1]=cRcv_Data1[iRcv_Nmb1];
if(iRcv_Nmb1==7)
exchange_data2.ii[0]=cRcv_Data1[iRcv_Nmb1];//计算有效数据长度,以此作为帧判断的第一步
//UART0_SendStr((uint8 *)"接收帧头正确!");
if(iRcv_Nmb1==exchange_data2.i+11) //判长度---1
{
iRcv_Nmb_Max=iRcv_Nmb1; //接收完一帧
cRcv_Stat1=0; //准备下一帧的接收
iRcv_Nmb1=0;
if((cRcv_Data1[iRcv_Nmb_Max]==0x0a)&&(cRcv_Data1[iRcv_Nmb_Max-1]==0x0d))//判结束字---2
{
for(i=0;i<=iRcv_Nmb_Max;i++) //接收数据回送,以便调试
{
//URRcvData.cData[i]=cRcv_Data1[i]; //将接收到得数据赋值给接收缓冲区结构体 URRcvData.cData[i] 便于解析
//UART0_SendByte(cRcv_Data1[i]);
}
//UART0_SendStr((uint8 *)"接收数据帧正确!");
cData485_Valid1=0x55; //建立已接收485标志
cTData[0]=cRcv_Data1[iRcv_Nmb_Max-6]; //温度数据
cTData[1]=cRcv_Data1[iRcv_Nmb_Max-5];
cHData=cRcv_Data1[iRcv_Nmb_Max-4]; //湿度数据
}
else
{
cRcv_Stat1=0;
//UART0_SendStr((uint8 *)"数据帧不对");
}
}
else
{
if(iRcv_Nmb1>500)
{
cRcv_Stat1=0;
//UART0_SendStr((uint8 *)"缓冲区溢出,是乱帧\r\n");
}
iRcv_Nmb1++; //帧数据
}
break;
default:
cRcv_Stat1=0;
break;
}
VICVectAddr = 0x00; // 中断处理结束
}
/****************************************************************************
* 名称:UART1_Ini()
* 功能:初始化串口1。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
* 入口参数:无
* 出口参数:无
****************************************************************************/
void UART1_Ini(void)
{ uint16 Fdiv;
U1LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U1DLM = Fdiv / 256;
U1DLL = Fdiv % 256;
U1LCR = 0x03;
U1FCR = 0x01; // 使能FIFO,并设置触发点为1字节 0000 0001
U1IER = 0x01; // 允许RBR中断,即接收中断
/* 设置中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl7 = VICVectCntl7|0x27; // UART1中断通道分配到IRQ slot 0,即优先级最高 0010 0111
VICVectAddr7 = (int)IRQ_UART1; // 设置UART1向量地址
VICIntEnable = VICIntEnable|0x00000080; // 使能UART1中断 1000 0000 参考P63页中断源表
}
/****************************************************************************
* 名称:UART1_SendByte()
* 功能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void UART1_SendByte(uint8 data)
{ U1THR = data; // 发送数据
IO0SET = DIRECT1; // P0.10 = 1
while( (U1LSR&0x40)==0 ); // 等待数据发送完毕
IO0CLR = DIRECT1; // P0.10 = 0
}
/****************************************************************************
* 名称:UART1_SendStr()
* 功能:向串口发送一字符串
* 入口参数:srt 要发送的字符串的指针
* 出口参数:无
****************************************************************************/
void UART1_SendStr(uint8 const *str)
{ while(1)
{ if( *str == '\0' ) break;
UART1_SendByte(*str++); // 发送数据
}
}
/****************************************************************************
* 名称:ISendBuf()
* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void ISendBuf1(void)
{ uint8 i;
for(i=0; i<1; i++) UART1_SendByte(rcv_buf[i]);
while( (U1LSR&0x20)==0 ); // 等待数据发送
rcv_byte_num=0;
}
/****************************************************************************
* 名称:void UART1_SendData(uint32 xxx)
* 功能:串口发送数据
* 入口参数: xxx:需要在计算机串口上显示的数据
* 出口参数:无
****************************************************************************/
void UART1_SendData(uint32 xxx)
{
uint8 a,b,c,d,e;
if(xxx>=100000)
{
UART1_SendByte(0x20);
UART1_SendStr((uint8 *)"NC");
// UART1_SendByte(0x20);
}
else if(xxx>=10000&xxx<100000)
{
a=xxx/10000;
b=(xxx-a*10000)/1000;
c=(xxx-a*10000-b*1000)/100;
d=(xxx-a*10000-b*1000-c*100)/10;
e=(xxx-a*10000-b*1000-c*100-d*10);
UART1_SendByte(a+0x30);
UART1_SendByte(b+0x30);
UART1_SendByte(c+0x30);
UART1_SendByte(d+0x30);
UART1_SendByte(e+0x30);
// UART1_SendByte(0x20);
}
else if(xxx>=1000&xxx<10000)
{
a=xxx/1000;
b=(xxx-a*1000)/100;
c=(xxx-a*1000-b*100)/10;
d=(xxx-a*1000-b*100-c*10);
UART1_SendByte(a+0x30);
UART1_SendByte(b+0x30);
UART1_SendByte(c+0x30);
UART1_SendByte(d+0x30);
// UART1_SendByte(0x20);
}
else if(xxx>=100&xxx<1000)
{
a=xxx/100;
b=(xxx-a*100)/10;
c=(xxx-a*100-b*10);
UART1_SendByte(a+0x30);
UART1_SendByte(b+0x30);
UART1_SendByte(c+0x30);
// UART1_SendByte(0x20);
}
else if(xxx>=10&xxx<100)
{
a=xxx/10;
b=(xxx-a*10);
UART1_SendByte(a+0x30);
UART1_SendByte(b+0x30);
// UART1_SendByte(0x20);
}
else if(xxx>0&xxx<10)
{
a=xxx;
UART1_SendByte(a+0x30);
// UART1_SendByte(0x20);
}
}
/****************************************************************************
* 名称:void UART0_SendData(uint32 xxx)
* 功能:串口发送数据
* 入口参数: xxx:需要在计算机串口上显示的数据
* 出口参数:无
****************************************************************************/
void UART0_SendData(uint32 xxx)
{
uint8 a,b,c,d,e;
if(xxx>=100000)
{
UART0_SendByte(0x20);
UART0_SendStr((uint8 *)"NC");
// UART1_SendByte(0x20);
}
else if(xxx>=10000&xxx<100000)
{
a=xxx/10000;
b=(xxx-a*10000)/1000;
c=(xxx-a*10000-b*1000)/100;
d=(xxx-a*10000-b*1000-c*100)/10;
e=(xxx-a*10000-b*1000-c*100-d*10);
UART0_SendByte(a+0x30);
UART0_SendByte(b+0x30);
UART0_SendByte(c+0x30);
UART0_SendByte(d+0x30);
UART0_SendByte(e+0x30);
// UART1_SendByte(0x20);
}
else if(xxx>=1000&xxx<10000)
{
a=xxx/1000;
b=(xxx-a*1000)/100;
c=(xxx-a*1000-b*100)/10;
d=(xxx-a*1000-b*100-c*10);
UART0_SendByte(a+0x30);
UART0_SendByte(b+0x30);
UART0_SendByte(c+0x30);
UART0_SendByte(d+0x30);
// UART1_SendByte(0x20);
}
else if(xxx>=100&xxx<1000)
{
a=xxx/100;
b=(xxx-a*100)/10;
c=(xxx-a*100-b*10);
UART0_SendByte(a+0x30);
UART0_SendByte(b+0x30);
UART0_SendByte(c+0x30);
// UART1_SendByte(0x20);
}
else if(xxx>=10&xxx<100)
{
a=xxx/10;
b=(xxx-a*10);
UART0_SendByte(a+0x30);
UART0_SendByte(b+0x30);
// UART1_SendByte(0x20);
}
else if(xxx>0&xxx<10)
{
a=xxx;
UART0_SendByte(a+0x30);
// UART1_SendByte(0x20);
}
}
/****************************串口1end****************************************/
/****************************************************************************
* 名称:main()
* 功能:初始化串口,并等待接收到串口数据。
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
/*
int main(void)
{
int j;
PINSEL0 = 0x00050005; // 设置I/O连接到UART1 P0.8 TXD P0.9 RXD
PINSEL1 = 0x00000000;
PINSEL2 = PINSEL2 & 0xFFFFFFF7; // 设置P1口为GPIO
IO1DIR = DIRECT0; // 置P1.16为输出口,RS485方向控制
IO1CLR = DIRECT0; // P1.16 = 0
IO0DIR = DIRECT1; // 置P0.10为输出口,RS485方向控制
IO0CLR = DIRECT1; // P0.10 = 0
rcv_new=0;
UART0_Ini();
UART1_Ini();
for(j=0;j<3;j++)
{ UART0_SendStr(SEND_STRING);
DelayNS(10);
}
for(j=0;j<3;j++)
{ UART1_SendStr(SEND_STRING);
DelayNS(10);
}
rcv_byte_num=0;
while(!rcv_new);
UART0_SendStr((uint8 *)"开始进行下一项测试\r\n");
while(1) // 等待中断
{ if(1==rcv_new)
{ ISendBuf0(); // 将接收到的数据发送回主机
ISendBuf1(); // 将接收到的数据发送回主机
rcv_new = 0;
}
}
return(0);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -