第88节:单片机靠关键字快速截取有效数据串
时间:11-22
来源:互联网
点击:
- ;//数码管6的小数点是否显示的标志
- unsigned char ucDigDot5;//数码管5的小数点是否显示的标志
- unsigned char ucDigDot4;//数码管4的小数点是否显示的标志
- unsigned char ucDigDot3;//数码管3的小数点是否显示的标志
- unsigned char ucDigDot2;//数码管2的小数点是否显示的标志
- unsigned char ucDigDot1;//数码管1的小数点是否显示的标志
- unsigned char ucDigShowTemp=0; //临时中间变量
- unsigned char ucDisplayDriveStep=1;//动态扫描数码管的步骤变量
- unsigned char ucWd1Part1Update=1; //8位数码管更新显示标志
- unsigned long ulWeightCurrent=12345; //显示当前实际的重量
- void main()
- {
- initial_myself();
- delay_long(100);
- initial_peripheral();
- while(1)
- {
- usart_service();//串口接收服务程序
- display_service(); //显示的窗口菜单服务程序
- }
- }
- /* 注释一:
- * 本节内容处理串口数据是根据数据尾是否有0x0d 0x0a来判断数据串是否有效的,一旦发现有此关键字,
- * 再判断总的数据长度是否等于或者大于一串数据的固定长度,如果满足,则把相关标志位置位,通知主函数中
- * 的串口服务程序进行处理。同时也及时关闭串口中断,避免在处理串口数据期间受到串口数据的中断干扰,
- * 等串口服务程序处理完毕再打开。
- */
- void usart_receive(void) interrupt 4 //串口接收数据中断函数
- {
- if(RI==1)
- {
- RI = 0;
- ++uiRcregTotal;
- ucRcregBuf[uiRcregTotal-1]=SBUF; //将串口接收到的数据缓存到接收缓冲区里
- if(uiRcregTotal>=2&&ucRcregBuf[uiRcregTotal-2]==0x0d&&ucRcregBuf[uiRcregTotal-1]==0x0a)//一旦发现后缀是0x0d 0x0a关键字的就进去处理判断
- {
- if(uiRcregTotal
- {
- uiRcregTotal=0;
- }
- else
- {
- uiRcregTotalTemp=uiRcregTotal; //把接收到的总数据传递给一个中间变量,在主函数那边处理这个中间变量
- ucReceiveFlag=1; //通知主程序接收成功
- ES=0; // 禁止接收中断,等主函数处理完接收的数据后再打开串口中断,避免在处理串口数据期间受到串口数据的中断干扰。
- }
- }
- else if(uiRcregTotal>=const_rc_size)//超过缓冲区
- {
- uiRcregTotal=0;
- }
- }
- else //如果不是串口接收中断,那么必然是串口发送中断,及时清除发送中断的标志,否则一直发送中断
- {
- TI = 0;
- }
- }
- void usart_service(void)//串口接收服务程序,在main函数里
- {
- //加了static关键字后,此局部变量不会每次进来函数都初始化一次,这样有可能减少了一点指令消耗的时间。
- static unsigned long ulReceiveData10000; //定义成long类型,是为了方便后面换算的乘法运算,让它不会溢出而出错。
- static unsigned long ulReceiveData1000;
- static unsigned long ulReceiveData100;
- static unsigned long ulReceiveData10;
- static unsigned long ulReceiveData1;
- if(ucReceiveFlag==1)//说明有数据接收成功,进入数据处理分析
- {
- ulReceiveData10000=0;
- ulReceiveData1000=0;
- ulReceiveData100=0;
- ulReceiveData10=0;
- ulReceiveData1=0;
- /* 注释二:
- * 根据协议,倒数第9,10,11,12,13,14为有效的ASCII码数字,其中倒数第11位为固定的小数点,因此省略不写。
- */
- if(ucRcregBuf[uiRcregTotalTemp-9]>=0x30)
- {
- ulReceiveData1=ucRcregBuf[uiRcregTotalTemp-9]-0x30; //接收到的ASCII码数字减去0x30变成实际数值.
- }
- if(ucRcregBuf[uiRcregTotalTemp-10]>=0x30)
- {
- ulReceiveData10=ucRcregBuf[uiRcregTotalTemp-10]-0x30;
- ulReceiveData10=ulReceiveData10*10;
- }
- if(ucRcregBuf[uiRcregTotalTemp-12]>=0x30)
- {
- ulReceiveData100=ucRcregBuf[uiRcregTotalTemp-12]-0x30;
- ulReceiveData100=ulReceiveData100*100;
- }
- if(ucRcregBuf[uiRcregTotalTemp-13]>=0x30)
- {
- ulReceiveData1000=ucRcregBuf[uiRcregTotalTemp-13]-0x30;
- ulReceiveData1000=ulReceiveData1000*1000;
- }
- if(ucRcregBuf[uiRcregTotalTemp-14]>=0x30)
- {
- ulReceiveData10000=ucRcregBuf[uiRcregTotalTemp-14]-0x30;
- ulReceiveData10000=ulReceiveData10000*10000;
- }
- ulWeightCurrent=ulReceiveData10000+ulReceiveData1000+ulReceiveData100+ulReceiveData10+ulReceiveData1;
- ucWd1Part1Update=1; //更新显示
- uiRcregTotalTemp=0;//清零实际接收到的字节数的中间变量
- uiRcregTotal=0;//清零实际接收到的字节数
- ucRe
单片机关键字有效数据 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)