📄 serialport.c
字号:
#include "serialPort.h"
/**********************************串口初始化*****************************
**入口:无
**出口:无
**设置波特率,选择传输方式,设置RX、TX的方向,初始化接受缓冲区,发送缓冲区
**************************************************************************/
void serialPort_Initial(void)
{
uint8 tmpCtr,tmpCtr2; //循环控制
TXSTA=0x04; //选择异步高速方式传输8位数据
RCSTA=0x80; //允许串口工作
TRISC=TRISC|0x80; //RC7(RX)设置为输入
TRISC=TRISC&0xBF; //RC6(TX)设置为输出
SPBRG=conSPBRG; //设置波特率
CREN=1; //允许串口接收数据
TXEN=1; //允许串口发送数据
//接收缓冲区赋0
for(tmpCtr=0;tmpCtr<LenRecBuf;tmpCtr++)
{
recBuf[tmpCtr]=0;
}
//发送缓冲区赋0
for(tmpCtr=0;tmpCtr<serialChnNum;tmpCtr++)
{
for(tmpCtr2=0;tmpCtr2<LenSendBuf;tmpCtr2++)
{
sendBuf[tmpCtr][tmpCtr2]=0;
}
}
NumRecData=0; //已接收数据长度赋0
flagRecEnd=FALSE; //指令未接收完毕
selfAddr=eeprom_read(AddrE2SelfAddr); //读取本机地址
}
/*********************发送数据函数***************************
**入口:待发送数据(一个字节)
**出口:无
**将数据通过串口发送
************************************************************/
void sendByte(uint8 Data)
{
TXREG=Data; //发送数据
while(1) //等待发送完成
{
if(TXIF==1) break;
}
}
/**********************发送指定通道的应急时间*********************
**入口:通道号(0-3)
**出口:无
**将发送缓冲区指定通道的数据通过串口发送
*****************************************************************/
void sendChnEmerTime(uint8 ChnNo)
{
uint8 tmpCtr; //循环控制
for(tmpCtr=0;tmpCtr<LenSendBuf;tmpCtr++)
{
sendByte(sendBuf[ChnNo][tmpCtr]);
}
}
/***********************执行指令函数*****************************
**入口:无
**出口:无
**判断数据发送是否完毕,判断指令,并根据指令进行相关的操作
****************************************************************/
void DoInstru(void)
{
uint8 tmpCtr; //循环控制
uint8 ChkSum; //校验和
//指令接收完毕
if(flagRecEnd==TRUE)
{
flagRecEnd=FALSE;
if(recBuf[0]==selfAddr) //发送给本机的指令
{
//计算校验和
ChkSum=0;
for(tmpCtr=0;tmpCtr<LenRecBuf-1;tmpCtr++)
{
ChkSum+=recBuf[tmpCtr];
}
if(ChkSum==recBuf[LenRecBuf-1]) //校验和匹配
{
if(recBuf[1]==InstruSend0) //传送通道0
{
sendChnEmerTime(0);
}
else if(recBuf[1]==InstruSend1) //传送通道1
{
sendChnEmerTime(1);
}
else if(recBuf[1]==InstruSend2) //传送通道2
{
sendChnEmerTime(2);
}
else if(recBuf[1]==InstruSend3) //传送通道2
{
sendChnEmerTime(3);
}
}
else //校验和不匹配
{
return;
}
}
}
}
/***********************设置本机地址*****************************
**入口:setMode-更改方式,conAddr100: selfAddr+100,
** conAddr10:selfAddr+10
** conAddr1: selfAddr+1
**出口:无
****************************************************************/
void SetSelfAddr(uint8 setMode)
{
if(setMode==conAddr100)
{
selfAddr=selfAddr+100;
}
else if(setMode==conAddr10)
{
selfAddr=selfAddr+10;
}
else if(setMode==conAddr1)
{
selfAddr=selfAddr+1;
}
if(selfAddr>conSelfAddrMax)
{
selfAddr=conSelfAddrMin;
}
eeprom_write(AddrE2SelfAddr,selfAddr);
}
/*************************指令接收完毕***************************
**入口:无
**出口:无
**判断指令是否接收完毕
**完毕:flagRecEnd=TRUE;未完毕:flagRecEnd=FALSE;
****************************************************************/
void ChkRecEnd(void)
{
if(NumRecData==LenInstru)
{
NumRecData=0;
flagRecEnd=TRUE; //完毕
}
else
{
flagRecEnd=FALSE; //未完毕
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -