📄 serial.c
字号:
//*************************************************************************
//串口中断服务程序
//*************************************************************************
//#include "TestSerial.h"
#include <c8051f060.h> // SFR declarations
#include <stdio.h>
#define DB_SENDMAXSIZE 30 //上传最大可能长度 30 字节。
#define DB_RECMAXSIZE 9 //下传最大可能长度 9 字节。
//#define UpSize 13
#define ModuAddr 170 //= 170 ;0XAA
#define SYSCLK 24500000 //22118400 // SYSCLK frequency in Hz 24500000 //
#define BAUDRATE 9600 // 115200用户定义的timer1 波特率
unsigned char UpSize = 13 ;
bit CommRecDataOverflowFlag,FlagRecComm,SendItComm;
unsigned char Count1ms,DownSize = 3 , AddSum ;
unsigned char CommSendBufferHead, CommSendBufferTail;
unsigned char xdata CommSendBuffer[DB_SENDMAXSIZE] ;
unsigned char CommRecBufferHead, CommRecBufferTail;
unsigned char xdata CommRecBuffer[DB_RECMAXSIZE];
sbit R485 = P2^1; //P0^2 ; //P5^3; //485 接收/发送, 选择位。
void ClearCommRecBuffer(void)
{
char data old_SFRPAGE ;
old_SFRPAGE = SFRPAGE ;
SFRPAGE = 0X00 ;
CommRecBufferTail=0;
FlagRecComm=0;
CommRecBuffer[0] = 0x00;
CommRecBuffer[1] = 0x00;
CommRecBuffer[40] = 0x00;
DownSize = 3;
SFRPAGE = old_SFRPAGE ;
}
void OpenComm(void)
{
char data old_SFRPAGE ;
old_SFRPAGE = SFRPAGE ;
SFRPAGE = 0X00 ;
R485 = 0; // 0:接收数据。
// FOLLOW IS FOR TIMER0,1 INIT.
PCON |= 0x80; // 电源控制寄存器
TMOD = 0x21; // Configure Timer 0,1 for use.
CKCON |= 0x12; // Timer 1 derived from SYSCLK.
TH1 = -(SYSCLK/BAUDRATE/16); //SYSCLK = 22.1168 ,BAUDRATE/16
TR1 = 1 ; // Start Timer 1
TR0 = 1 ;
CommSendBufferHead=CommSendBufferTail=0; // set the head and tail to the base of the ring buffer
CommRecBufferHead=CommRecBufferTail=0;
FlagRecComm=0;
// FOLLOW IS FOR UART0 INIT.
SFRPAGE = UART0_PAGE;
SCON0 = 0x50; // SCON: mode 1, 8-bit UART, enable RX
SSTA0 = 0x10; // BY Timer 1 generates UART0 baud rate and
// 禁止UART0 的波特率/2 功能.
RI0=0; // Clear UART0 receive.
TI0=0; // Clear UART0 transmit.
ES0=1; // allow the serial interrupt
SendItComm=1; // enable send the data to SBUF0.
SFRPAGE = old_SFRPAGE ;
}
//---------------------------------------------------------------------
//通信预置数据
//-----------------------------------------------------------------------
void SendCommBuffer(unsigned char *base, unsigned char Len) // UpSize = 8 个上传数据
{
unsigned char i=0, AddSum ;
if (SendItComm)
{
R485 = 1; // 1;发送数据。
i = 0 ;
AddSum = 0;
while (i<Len-1) //i = 0 --- 6 为要传送的数据,放入缓冲区。
{
AddSum += base[i] ;
CommSendBuffer[i]=base[i];
i++;
}
CommSendBuffer[Len-1] = AddSum; // [7] 为ADDSUM at end, place the addsum.
}
CommSendBufferHead=0;
SBUF0=CommSendBuffer[CommSendBufferHead]; // send the first byte,开始通讯.
}
//--------------------------------------------------------------------------
//通信中断程序
//---------------------------------------------------------------------------
void CommISR(void) interrupt 4 using 3
{
unsigned char i=0;
if (TI0) //清除发送中断标志
{
TI0=0;
CommSendBufferHead++;
if (CommSendBufferHead != (UpSize) ) //UpSize = 8 则上传0--7 共8个数据 ,
{
SBUF0=CommSendBuffer[CommSendBufferHead]; // < 13 ,0--12 共13个数据被发送.send the next byte
SendItComm=0;
}
else // = 13 相等,本次通讯完成。
{
SendItComm=1; //允许进行下一次通讯。
R485 = 0; // 0:接收数据。
DownSize = 3;
}
}
if (RI0)
{
RI0=0; //清除接收中断标志
CommRecBuffer[CommRecBufferTail]=SBUF0; //receive data。
CommRecBufferTail++;
if (CommRecBufferTail >= DB_RECMAXSIZE)
{
CommRecBufferTail = 0 ; //如果接受的数据比缓冲区还长,指针清零.
}
if ( CommRecBuffer[0]== ModuAddr ) //是本设备接收的地址吗?
{
if (CommRecBufferTail==2) //先加指针,因此=2。
{
DownSize = CommRecBuffer[1]; //指针在0Xa5后第一个单元。
}
if (CommRecBufferTail>=DownSize) //本次通讯,数据已传输完了吗?
{
for (i=0; i<DownSize-1 ;i++)
{
AddSum = AddSum + CommRecBuffer[ i ] ;
}
if ( CommRecBuffer[ DownSize-1 ]== AddSum) // 累加和相等吗?
{
FlagRecComm=1; //本次通讯数据正确,通知主程序取数。
DownSize = 3; //否则只修改指针,不通知主程序取数。
REN0 = 0; //禁止UART0 接收数据,主程序取数后再打开
}
CommRecBufferTail = 0x00; //只要指针大于DownSize,将指针恢复到起始地址。
AddSum = 0; //清除累加和。
CommRecBuffer[ 0 ] = 0;
DownSize = 3;
}
}
if ( CommRecBuffer[0]!= ModuAddr )
{
CommRecBufferTail = 0x00; //第一个字符不相等,将指针恢复到起始地址。
AddSum = 0; //清除累加和。
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -