《2022年F串口通讯程序 .pdf》由会员分享,可在线阅读,更多相关《2022年F串口通讯程序 .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、F串口通讯程序/*- 串口通讯程序方式:半双工通讯方式并在中断中实现发送接收优点:对相邻两个字节的通讯间隔加入检测,提高通讯效率-*/ #include <c8051f020.h> #include "Data.h" #define uchar unsigned char #define uint unsigned int sbit R_W=P30; / 接收、发送转换#define OCTLLEN 7 / 控制响应输出长度#define OTSTLEN 14 / 测试响应输出长度#define ILEN 7 / 输入缓冲区长度#define CMD_CTRL
2、1 #define CMD_TEST 2 #define CMD_CREP 3 #define CMD_TREP 4 #define STX 2 #define EOF 3 / 串口状态值#define COM_START 0 #define COM_RUNNING 1 #define COM_READY 2 #define COM_SEND 3 / 串口超时检测#define TMINTERVAL 5 / 检测时间间隔为5 毫秒/ 串口缓冲区及校验uchar OutLen=0; / 发送字节长度uchar InLen=0; / 接收字节长度uchar SendLen=0; / 需发送的长度,
3、对于控制响应为7,测试响应为14 uint sum=0; / 用于计算和校验uchar InBufILEN; / 输入缓冲区uchar OutBufOTSTLEN; / 输出缓冲区名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - uchar ComStatu=0; / 串口状态/ 重置 UART0 void ResetSerial() uchar BAND_L; if(ComStatu=COM_START && m
4、_DataInfo.bResetUART=1) m_DataInfo.bResetUART=0; / 先禁止所有UART中断ES0=0;TI0=0;RI0=0; SCON0 = 0 x50; / 串口 0,方式 1:8 位数据位SCON0 &= 0 xFC;/,清除所有中断防止干扰/ 使用 T2作为波特率发生器,且其默认值为9600 T2CON = 0 x34; / Timer 2 Control Register / 清除缓冲区BAND_L=SBUF0; switch(m_DataInfo.BandNum) case 0: /2.4,0XFF10 BAND_L=0 x10; brea
5、k; case 1: /4.8,0XFF88 BAND_L=0 x88; break; case 2: /9.6,0XFFC4 BAND_L=0 xc4; break; case 3: /14400: 0XFFD8 BAND_L=0 xd8; break; case 4: /19200: 0XFFE2 BAND_L=0 xe2; break; case 5: /28800: 0XFFEC BAND_L=0 xec; break; case 6: /38400: 0XFFF1 BAND_L=0 xf1; break; case 7: /57600: 0XFFF6 BAND_L=0 xf6; br
6、eak; case 8: /115200: 0XFFFB 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - BAND_L=0 xfb; break; default: /9.6,0XFFC4 BAND_L=0 xc4; break; RCAP2H = 0 xff; / RCAP2L = BAND_L; / TH2 = 0 xff; / TL2 = BAND_L; / / 启动中断ES0=1; / 该函数为主函数调用的公用函数,在此
7、判断是否有数据发送且对所发送的数据类型判定void ScanSerialData() / 调用串口设置程序以适应在运行中改变设置ResetSerial(); if(ComStatu=COM_START ) if(GetTimeout(CLK_SERIAL)=1)/接收到无效数据 sum=0;InLen=0; R_W=0; return; if(ComStatu=COM_READY && GetTimeout(CLK_SERIAL)=1) if(InBuf1!=m_DataInfo.Addr) ComStatu=COM_START; return; / 不为本机数据 / 在此准备
8、数据/ 数据头及地址SetTimer(CLK_SERIAL,TMINTERVAL,DISABLE);/ 停止计时ComStatu=COM_SEND; R_W=1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - OutBuf0=STX; OutBuf1=m_DataInfo.Addr; if(InBuf2=CMD_CTRL) SendLen=OCTLLEN; OutBuf2=CMD_CREP; / 在此对遥控进行判断,如果未在通
9、讯遥控状态,则返回错误信息OutBuf3=(InBuf3 & 0 x0f); if(m_DataInfo.LocalOrRemote!=CTRL_COMM) OutBuf3+=0 x10; else if(InBuf3 & 0 x0f)<6) if(InBuf3 & 0 x0f)>=m_DataInfo.CurGrade0) m_DataInfo.tmpGrade=m_DataInfo.CurGrade0; else m_DataInfo.tmpGrade=InBuf3 & 0 x0f; OutBuf4=0;/ 保留字 else if(InBuf2=
10、CMD_TEST) SendLen=OTSTLEN; OutBuf2=CMD_TREP; OutBuf3=m_DataInfo.Grade;/光级/ 电流OutBuf4=m_DataInfo.CurVal && 0 xff; OutBuf5=(m_DataInfo.CurVal>>8) & 0 xff; / 电压OutBuf6=m_DataInfo.VolVal && 0 xff; OutBuf7=(m_DataInfo.VolVal>>8) & 0 xff; / 绝缘检测OutBuf8=m_DataInfo.Insul
11、&& 0 xff; OutBuf9=(m_DataInfo.Insul>>8) & 0 xff; / 状态OutBuf10=m_DataInfo.RunStatus; OutBuf11=0;/ 保留字 / 发送第一个字节SBUF0=STX; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - /*-/ /- 串口中断程序/-*/ void serial () interrupt 4 uchar r
12、ev; if(RI0) / 如果接收到一个字节 rev=SBUF0; RI0=0; / 先禁止字节间隔的检测SetTimer(CLK_SERIAL,TMINTERVAL,DISABLE); / 接收到一帧数据开始if(rev=STX && ComStatu=COM_START) ComStatu=COM_RUNNING; sum=0;InLen=0; / 清除原来数据 if(ComStatu=COM_RUNNING) InBufInLen=rev; if( InLen < (ILEN-2) ) sum=(sum+rev); else if(InLen= (ILEN-2)
13、) / 当接收到校验值时进行存储sum=(sum & 0 xff)-2; else if(InLen=ILEN-1) / 接收数据完毕/ 校验正确 ,放在定时器中ComStatu=(sum=(uint)InBufILEN-2 && rev=EOF) ? COM_READY : COM_START; InLen=ILEN-1;/ 保证数组不越界,多接收的字节全部放在最后一个字节/ sum=sum+1;/ 时间片检测中需用到该数。 InLen+; / 启动检测SetTimer(CLK_SERIAL,TMINTERVAL,ENABLED); if(TI0) / 一个字节发送完
14、毕 TI0=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - if(ComStatu=COM_SEND) / 发送的第一个字节sum=0; ComStatu=COM_RUNNING; OutLen=1; if(OutLen>=SendLen)/ 最后一个字节发送完毕 R_W=0; ComStatu=COM_START; return; if(OutLen<(SendLen-2) sum+=OutBufOutLen; else if(OutLen=(SendLen-2) OutBufOutLen=sum & 0 xff; if(OutLen=(Se ndLen-1) / 发送完毕OutBufOutLen=EOF; SBUF0=OutBufOutLen; OutLen+; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -