第45节:主机的串口收发综合程序框架
时间:11-22
来源:互联网
点击:
- ucReceiveStatus=0;//返回的数据状态清零
- ucSendStep=1;//切换到下一个步骤,等待返回的数据
- break;
- case 1: //通讯过程1判断返回的指令
- if(ucReceiveStatus==1)//校验正确
- {
- ucErrorCnt=0; //累计校验错误总数清零
- ucSendTotal++;//累加当前发送了多少串数据
- if(ucSendTotal>=4) //已经发送完全部4串数据,结束
- {
- ucStatus=0;//切换到结束时的待机状态
- }
- else//还没发送完4串数据,则继续发送下一串新数据
- {
- ucSendStep=0;//返回上一个步骤,继续发送新数据
- }
- }
- else if(ucReceiveStatus==2||uiSendTimeOutCnt>const_send_time_out)//校验出错或者超时出错
- {
- ucErrorCnt++; //累计错误总数
- if(ucErrorCnt>=3)//累加重发次数3次以上,则报错
- {
- ucStatus=2;//切换到出错报警状态
- }
- else//重发还没超过3次,继续返回重发
- {
- ucSendStep=0;//返回上一个步骤,重发一次数据
- }
- }
- break;
- }
- }
- }
- void status_service(void)//状态显示的应用程序
- {
- if(ucStatus!=0) //处于非待机的状态,Led闪烁
- {
- if(uiLedCnt
- {
- led_dr=1;//前半秒亮
- if(ucStatus==2)//处于发送数据出错的状态,则蜂鸣器间歇鸣叫报警
- {
- ucVoiceLock=1;//原子锁加锁,保护主函数与中断函数的共享变量uiVoiceCnt
- uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
- ucVoiceLock=0;//原子锁解锁,保护主函数与中断函数的共享变量uiVoiceCnt
- }
- }
- else if(uiLedCnt
- {
- led_dr=0; //前半秒灭
- }
- else
- {
- ucLedLock=1; //原子锁加锁
- uiLedCnt=0; //延时计时器清零,让Led灯处于闪烁的反复循环中
- ucLedLock=0; //原子锁解锁
- }
- }
- else//处于待机状态,Led一直亮
- {
- led_dr=1;
- }
- }
- void usart_service(void)//串口接收服务程序,在main函数里
- {
- unsigned int i;
- if(uiSendCnt>=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来
- {
- ucSendLock=0; //处理一次就锁起来,不用每次都进来,除非有新接收的数据
- //下面的代码进入数据协议解析和数据处理的阶段
- uiRcMoveIndex=0; //由于是判断数据头,所以下标移动变量从数组的0开始向最尾端移动
- while(uiRcregTotal>=5&&uiRcMoveIndex<=(uiRcregTotal-5))
- {
- if(ucRcregBuf[uiRcMoveIndex+0]==0xeb&&ucRcregBuf[uiRcMoveIndex+1]==0x00&&ucRcregBuf[uiRcMoveIndex+2]==0x55)//数据头eb 00 55的判断
- {
- ucRcType=ucRcregBuf[uiRcMoveIndex+3]; //数据类型一个字节
- uiRcSize=ucRcregBuf[uiRcMoveIndex+4]; //数据长度两个字节
- uiRcSize=uiRcSize<8;
- uiRcSize=uiRcSize+ucRcregBuf[uiRcMoveIndex+5];
- ucRcCy=ucRcregBuf[uiRcMoveIndex+6+uiRcSize]; //记录最后一个字节的校验
- ucRcregBuf[uiRcMoveIndex+6+uiRcSize]=0;//清零最后一个字节的累加和变量
- for(i=0;i<(3+1+2+uiRcSize);i++) //计算校验累加和
- {
- ucRcregBuf[uiRcMoveIndex+6+uiRcSize]=ucRcregBuf[uiRcMoveIndex+6+uiRcSize]+ucRcregBuf[uiRcMoveIndex+i];
- }
- if(ucRcCy==ucRcregBuf[uiRcMoveIndex+6+uiRcSize])//如果一串数据校验正确,则进入以下数据指令的判断
- {
- switch(ucRcType) //根据不同的数据类型来做不同的数据处理
- {
- case 0xf5: //返回的是正确的校验指令
- ucReceiveStatus=1;//代表校验正确
- break;
- case 0xfa: //返回的是错误的校验指令
- ucReceiveStatus=2;//代表校验错误
- break;
- }
- }
- break; //退出循环
- }
- uiRcMoveIndex++; //因为是判断数据头,游标向着数组最尾端的方向移动
- }
- uiRcregTotal=0;//清空缓冲的下标,方便下次重新从0下标开始接受新数据
- }
- }
- void eusart_send(unsigned char ucSendData) //发送一个字节,内部自带每个字节之间的delay延时
- {
- ES = 0; //关串口中断
- TI = 0; //清零串口发送完成中断请求标志
- SBUF =ucSendData; //发送
主机串口收发程序框 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)