📄 seriele.c
字号:
#ifndef _SERIAL_H
#define _SERIAL_H
#include <P8XC5X2.H>
#include <intrins.h>
#include <string.h>
//数据类型定义
#define uchar unsigned char
#define ulong unsigned long
#define uint unsigned int
//串口状态定义
#define RCV_IDH 0 //接收描述符的高8位
#define RCV_IDL 1 //接收id的低3位+rtr位+dlc(4位)
#define RCV_DATA 2 //接收数据
uchar data Rcv_Status=0; //接收状态字节
uchar data Rcv_Point =0; //接收计数
uchar data Send_Point=0; //发送计数
uchar idata RcvBuf[0x10]; //接收数据缓冲区
uchar idata SendBuf[0x10]; //发送数据缓冲区
extern uchar data DispBuf[5];
bit UartRcvGood;
void InitUart(void); //初始化串口
void Exe_Scon(uchar cmd,uchar dlc,uchar *databuf);//串口发送函数
/*-------------------------------------------------------------------------------------------
串口中断函数
-------------------------------------------------------------------------------------------*/
void Uart_Val(void) interrupt 4 using 3
{
uchar TempData; //临时变量
if(_testbit_(RI))
{
TempData=SBUF;
switch(Rcv_Status)
{
case RCV_IDH:
RcvBuf[0]=TempData;
Rcv_Status++;
break;
case RCV_IDL:
RcvBuf[1]=TempData;
if((RcvBuf[1]&0x10)!=0) //远程帧
{
Rcv_Status=0;
UartRcvGood=1;
}
else //数据帧
{
Rcv_Point=2;//TempData&0x0f; //取数据长度
Rcv_Status++;
}
break;
case RCV_DATA:
RcvBuf[Rcv_Point]=TempData;
Rcv_Point++;
if((Rcv_Point-2)==(RcvBuf[1]&0x0f))
{
Rcv_Point=0;
Rcv_Status=0;
UartRcvGood=1;
}
break;
default:
break;
}
} //结束if(_testbit(RI))
if(_testbit_(TI))
{
Send_Point++;
if(Send_Point<(SendBuf[2]+4)) //未发送完毕,继续发送
SBUF=SendBuf[Send_Point];
else
{
Send_Point=0;
}
}//结束if(_testbit(TI))
}
/*-------------------------------------------------------------------------------------------
函数原型: void InitUart(void)
参数说明: 无
返回值: 无
说明: 用于初始化串口
-------------------------------------------------------------------------------------------*/
void InitUart(void)
{
SCON = 0x50; //串口工作方式1
TMOD |= 0x20; //T1,初值自动重装
TH1 = 0xfd; //波特率9600bps @ 11,0592M
TL1 = 0xfd;
TR1 = 1; //开始计数
IE |= 0x90; //开放串口中断
}
//
void Exe_Scon(uchar cmd,uchar dlc,uchar *databuf)
{
uchar i,bcc=0;
SendBuf[0] = 0x00;
SendBuf[1] = cmd;
SendBuf[2] = dlc;
memcpy(&(SendBuf+3),databuf,dlc);
for(i=0; i<dlc+3;i++)
bcc^=SendBuf[i];
SendBuf[dlc+3] = bcc;
Send_Point=0;
SBUF = SendBuf[0];
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -