⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serialport.c

📁 采用PICC18编写的单片机源代码
💻 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 + -