第44节:从机的串口收发综合程序框架
时间:11-22
来源:互联网
点击:
- char ucWd=1;//本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。
- unsigned intuiSetData1=0;//本程序中需要被设置的参数1
- unsigned intuiSetData2=0;//本程序中需要被设置的参数2
- unsigned intuiSetData3=0;//本程序中需要被设置的参数3
- unsigned intuiSetData4=0;//本程序中需要被设置的参数4
- unsigned char ucTemp1=0;//中间过渡变量
- unsigned char ucTemp2=0;//中间过渡变量
- unsigned char ucTemp3=0;//中间过渡变量
- unsigned char ucTemp4=0;//中间过渡变量
- //根据原理图得出的共阴数码管字模表
- code unsigned char dig_table[]=
- {
- 0x3f,//0 序号0
- 0x06,//1 序号1
- 0x5b,//2 序号2
- 0x4f,//3 序号3
- 0x66,//4 序号4
- 0x6d,//5 序号5
- 0x7d,//6 序号6
- 0x07,//7 序号7
- 0x7f,//8 序号8
- 0x6f,//9 序号9
- 0x00,//无 序号10
- 0x40,//- 序号11
- 0x73,//P 序号12
- };
- void main()
- {
- initial_myself();
- delay_long(100);
- initial_peripheral();
- while(1)
- {
- key_service(); //按键服务的应用程序
- usart_service();//串口服务程序
- display_service(); //显示的窗口菜单服务程序
- status_service();//状态显示的应用程序
- }
- }
- 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
- {
- uiLedCnt=0; //延时计时器清零,让Led灯处于闪烁的反复循环中
- }
- }
- 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 0x01: //设置参数1
- ucStatus=1; //从设置参数1开始,表示当前处于正在发送数据的状态
- uiSetData1=ucRcregBuf[uiRcMoveIndex+6];//把两个字节合并成一个int类型的数据
- uiSetData1=uiSetData1<8;
- uiSetData1=uiSetData1+ucRcregBuf[uiRcMoveIndex+7];
- ucWd1Update=1; //窗口1更新显示
- break;
- case 0x02: //设置参数2
- uiSetData2=ucRcregBuf[uiRcMoveIndex+6];//把两个字节合并成一个int类型的数据
- uiSetData2=uiSetData2<8;
- uiSetData2=uiSetData2+ucRcregBuf[uiRcMoveIndex+7];
- ucWd2Update=1; //窗口2更新显示
- break;
- case 0x03: //设置参数3
- uiSetData3=ucRcregBuf[uiRcMoveIndex+6];//把两个字节合并
从机串口收程序框 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)