工序解释执行程序--工程师的成长

多年前一个项目主要做一台机器,读取文件数据并解释执行,吸合电磁阀或点亮相应的LED,提示工人操作

文件格式

A	
1	1      1
2	2      2
3	3      3
4	4      4
5	5      5
6	6      6
7	7      7
8	8      8
9	9      9
10	10     10
11	11     11
12	12     12
13	13     13
14	14     14
15	15     15
16	16     16
17	17     17
18	18     18
19	19     19
20	20     20
23	23     23
63	23     23
62	22     22
60	20     20
58	18     18
57	17     17
56	16     16
55	15     15
54	14     14
53	13     13
52	12     12
51	11     11
50	10     10
49	9      9
47	7      7

第一列表示按键序号,第二列表示LED序号,第三列表示电磁阀序号
读取第一行,点亮相应的LED,吸合电磁,等待相应的按键按下,接着执行第二行,以此类推

解释字符串并转换成相应的工序数据

#include "file.h"
#include "znFAT.h"
#include "io.h"
#include "LCD1602.h"#include <string.h>
#include <stdlib.h>struct FileInfo FileInfo;        //文件信息结构体实体FILE_T File;
STRING_T String;void FileInit( void )
{memset(&File,0,sizeof(FILE_T));File.Name[0] = '\\';
}u8 ValidChar( u8 chr )
{if( (chr>='0'&&chr<='9') || (chr>='A'&&chr<='E')|| chr=='X' || chr==' ' || chr==','|| chr==0x09 || chr==0x0a || chr==0x0d )return 1;elsereturn 0;
}//获取文件中各个工人的起始,结束地址
void InitFileInfo( void )
{UINT8 step=0,wks=0;UINT16 i=0;	memset( &File.ReadPtr,0,MAX_WORKERS );memset( &File.End,0,MAX_WORKERS );while( i<File.Len ){switch( step ){case 0:switch( File.Buf[i] ){case 'A':WorkerFlow.Flow[A].Beep = 0;while( File.Buf[i]!='\n' ){if( File.Buf[i]=='X' )WorkerFlow.Flow[A].Beep = 'X';i++;}File.ReadPtr[A] = i+1;step = 1;wks++;break;case 'B':WorkerFlow.Flow[B].Beep = 0;while( File.Buf[i]!='\n' ){if( File.Buf[i]=='X' )WorkerFlow.Flow[B].Beep = 'X';i++;}File.ReadPtr[B] = i+1;step = 2;wks++;break;case 'C':WorkerFlow.Flow[C].Beep = 0;while( File.Buf[i]!='\n' ){if( File.Buf[i]=='X' )WorkerFlow.Flow[C].Beep = 'X';i++;}File.ReadPtr[C] = i+1;step = 3;wks++;break;case 'D':WorkerFlow.Flow[D].Beep = 0;while( File.Buf[i]!='\n' ){if( File.Buf[i]=='X' )WorkerFlow.Flow[D].Beep = 'X';i++;}File.ReadPtr[D] = i+1;step = 4;wks++;break;case 'E':WorkerFlow.Flow[E].Beep = 0;while( File.Buf[i]!='\n' ){if( File.Buf[i]=='X' )WorkerFlow.Flow[E].Beep = 'X';i++;}File.ReadPtr[E] = i+1;step = 5;wks++;break;default:break;}break;case 1:if( File.Buf[i]=='B' ){File.End[A] = i-1;i--;step = 0;}else if( i==File.Len-1 )File.End[A] = i+1;else if( !ValidChar(File.Buf[i]) )File.End[A] = i-1;break;case 2:if( File.Buf[i]=='C' ){File.End[B] = i-1;i--;step = 0;}else if( i==File.Len-1 )File.End[B] = i+1;else if( !ValidChar(File.Buf[i]) )File.End[B] = i-1;break;case 3:if( File.Buf[i]=='D' ){File.End[C] = i-1;i--;step = 0;}else if( i==File.Len-1 )File.End[C] = i+1;else if( !ValidChar(File.Buf[i]) )File.End[C] = i-1;break;case 4:if( File.Buf[i]=='E' ){File.End[D] = i-1;i--;step = 0;}else if( i==File.Len-1 )File.End[D] = i+1;else if( !ValidChar(File.Buf[i]) )File.End[D] = i-1;break;case 5:if( i==File.Len-1 )File.End[E] = i+1;else if( !ValidChar(File.Buf[i]) )File.End[E] = i-1;break;default:break;}i++;}//保存工人人数WorkerFlow.Workers = wks;
}INT32 ReadLine( UINT8 worker )
{UINT16 size;UINT8 *src,*dst;src = &File.Buf[File.ReadPtr[worker]];dst = &String.Buf[0];if( NULL==dst )return -1;if( NULL==src || '\0'==*src )return -1;if( File.ReadPtr[worker]>=File.End[worker] )return -1;	size = STRING_SIZE;String.Len = 0;while( *src!='\n' && size-->0 && File.ReadPtr[worker]<File.Len ){*dst++ = *src++;File.ReadPtr[worker]++;String.Len++;}*dst++ = *src++;File.ReadPtr[worker]++;String.Len++;return 0;
} UINT8 ReadFile( INT8 *filepath ) 
{	if( !znFAT_Open_File(&FileInfo,filepath,0,1) ) //FileInfo是文件信息结构体,用来记录打开的文件的重要参数信息{File.Len=znFAT_ReadData(&FileInfo,0,FILE_SIZE,File.Buf); //读取打开的当前文件,0表示从0位置开始读,45表示读取45个字节,file_buf是数据缓冲区znFAT_Close_File(&FileInfo); //关闭文件if( FILE_SIZE == File.Len )return 2;InitFileInfo();return 0;}return 1;
}void DecodeString( UINT8 Worker )
{UINT16 i,k,seg,word;BOOL segFlag,wordFlag;char str[5];//填充其它字符为空格for( k=0; k<String.Len; k++ ){if( String.Buf[k]>='0'&&String.Buf[k]<='9' || String.Buf[k]==',' || (String.Buf[k]>='A' && String.Buf[k]<='E') || String.Buf[k]=='X' ){continue;}String.Buf[k] = ' ';}i = 0;seg = word = 0;segFlag=wordFlag=0;memset( WorkerFlow.Flow[Worker].Sign, 0, 3*MAX_ITEMS );for( k=0; k<String.Len; k++ ){if( String.Buf[k]>='0'&&String.Buf[k]<='9'){str[i++] = String.Buf[k];segFlag = 1;wordFlag = 1;}//else if(String.Buf[k]>='A' &&  String.Buf[k]<='E' )//{ //}if( (String.Buf[k]==' '||String.Buf[k]==',') && wordFlag ){wordFlag = 0;str[i++]='\n';if( seg<MAX_SEGS && word<MAX_ITEMS )WorkerFlow.Flow[Worker].Sign[seg][word] = (UINT8)atoi(str);if( word<MAX_ITEMS-1 )word ++;i = 0;}if( String.Buf[k]==' ' && segFlag ){segFlag = 0;seg ++;word = 0;}}
}
/*
BOOL SearchIndex( u8 *str,u8 *filename )
{u16 i,j,k;if( FAT32_Open_File(&FileInfo,"index.txt",0) ){File.Len=FAT32_Read_File(&FileInfo,0,FILE_SIZE,File.Buf);FAT32_File_Close(&FileInfo);while( i<File.Len ){if( strncmp((char*)str,(char*)&File.Buf[i],10)==0 ){while( (File.Buf[i++]!='=') && (i<File.Len) );j = i;while( (File.Buf[i++]!=0x0d) && (i<File.Len) );k = i-j;strncpy((char*)filename,(char*)&File.Buf[i],k);return 0;}while( (File.Buf[i++] != 0x0a) && (i<File.Len) );}}return 1;
}*/

看回去10多年前的程序,很稚嫩,还不会用太多的字符操作函数,直接字节比较,周期长不止还容易出错调试困难,后面学习不断累积新技术解决旧的问题,开发也是更加的轻而易举。

	for( k=0; k<String.Len; k++ ){if( String.Buf[k]>='0'&&String.Buf[k]<='9'){str[i++] = String.Buf[k];segFlag = 1;wordFlag = 1;}//else if(String.Buf[k]>='A' &&  String.Buf[k]<='E' )//{ //}if( (String.Buf[k]==' '||String.Buf[k]==',') && wordFlag ){wordFlag = 0;str[i++]='\n';if( seg<MAX_SEGS && word<MAX_ITEMS )WorkerFlow.Flow[Worker].Sign[seg][word] = (UINT8)atoi(str);if( word<MAX_ITEMS-1 )word ++;i = 0;}if( String.Buf[k]==' ' && segFlag ){segFlag = 0;seg ++;word = 0;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/107543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt编程,TCP编程、数据库

目录 1、TCP: QTcpServer | QTcpSocket 1、 ##TCP客户端 1、//连接成功信号 2、//连接断连信号 3、 //数据就绪信号 4、 //连接到服务器,使用服务器的IP地址和端口 5、//发送数据到服务器 6、//从服务器接收数据 2、##TCP服务器端 1、//创建TCP服务器对象 2、//新连接信号 3、…

linux之shell记录

shell属于一种很容易学习的程序设计语言&#xff0c;依赖于功能强大的命令可以编写提高开发效率的脚本。这里记录一下常用的shell相关的知识点。 持续更新中。。。 1、在linux或mac中查看使用的shell echo $SHELL /bin/bashshell是一种脚本语言&#xff0c;就会有解释器来执行…

Spring中注入的使用

目录 一、什么是注入&#xff08;Injection&#xff09; 1.1 为什么要注入 二、注入的基本使用 三、Spring注入原理分析 一、什么是注入&#xff08;Injection&#xff09; 注入就是通过Spring的配置文件&#xff0c;为所创建对象的成员变量进行赋值 1.1 为什么要注入 书接上…

Java 中实现单例模式

单例模式 单例模式&#xff0c;就是一个类在任何情况下绝对只有一个实例&#xff0c;并且提供一个全局访问点来获取该实例。 要实现单例&#xff0c;至少需要满足两个点&#xff1a; 私有化构造方法&#xff0c;防止被外部实例化造成多实例问题 提供一个静态方位作为全局访问点…

Linux:进程控制

目录 一、进程创建 写时拷贝 二、进程终止 echo $? 如何终止进程 _exit与exit 三、进程等待 进程等待的必要性 进程等待的操作 wait waitpid status 异常退出情况 status相关宏 options 四、进程程序替换 1、关于进程程序替换 2、如何进行进程程序替换 程序…

函数防抖(javaScript)

防抖说明 &#xff08;1&#xff09;防抖的目的&#xff1a; 当多次执行某一个动作的时候&#xff0c;限制函数调用的次数&#xff0c;节约资源。 &#xff08;2&#xff09;防抖的概念&#xff1a; 函数防抖&#xff08;debounce&#xff09;&#xff1a;就是指触发事件后&…

Python中图像相似性度量方法汇总

1. 引言 在当前到处充满着图像的世界里&#xff0c;测量和量化图像之间的相似性已经成为一项关键的任务。无论是图像检索、内容推荐还是视觉搜索&#xff0c;图像相似性方法在现代计算机视觉的应用中都发挥着关键的作用。 幸运的是&#xff0c;Python提供了大量的工具和库&am…

想要精通算法和SQL的成长之路 - 分割数组的最大值

想要精通算法和SQL的成长之路 - 分割数组的最大值 前言一. 分割数组的最大值1.1 二分法 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 分割数组的最大值 原题链接 首先面对这个题目&#xff0c;我们可以捕获几个关键词&#xff1a; 非负整数。非空连续子数组。 那么我…

组合数(1) 用Vector实现获取所有组合数列表的QT实现

1.工程文件 QT coreCONFIG c17 cmdline# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 # disables all the APIs deprecated before Qt 6.…

BIM轻量化技术简介

BIM轻量化技术是指在工程建筑的BIM模型建立之后&#xff08;利用专业的BIM建模软件&#xff0c;比如Autodesk Revit, Bentley MicroStation, DS Catia等&#xff09;&#xff0c;通过对BIM模型的压缩处理等技术手段&#xff0c;让BIM可以在各类WEB浏览器、移动App上被使用的技术…

【RTOS学习】优先级 | Tick | 任务状态 | 空闲任务 | 任务调度

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 优先级 | Tick | 任务状态 | 空闲任务 | 任务调度 &#x1f3c0;优先级⚽任务管理 &#x1f3c0;T…

LockSupport-park和unpark编码实战

package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.LockSupport;/*** author zhou* version 1.0* date 2023/10/16 9:11 下午*/ public class LockSupportDemo {public static void main(String[] args) {…

批处理文件(.bat)中,dir与tree命令的效果

目录 dir命令 用法 操作 效果 dir /? dir dir D:\111\111_3 dir D:\111 *.mp4 dir D:\111 /ad dir D:\111 /ar dir D:\111 /s dir D:\111\111_3 >1bat.txt dir D:\111 >>1bat.txt tree命令 用法 操作 效果 tree /? tree tree D:\111\111_3 tree…

软考高项第四版教材整合管理(第8章)重点内容

序&#xff1a;距离2023下半年软考还有18天&#xff0c;来不及看书的小伙伴看过来啦&#xff0c;一起过一下重点&#xff0c;开始之前&#xff0c;建议大家将下面的过程组矩阵图熟记&#xff01;&#xff01;&#xff01; 第8章 项目整合管理 项目整合管理包括识别、定义、组…

node教程

文章目录 1.node入门 1.node入门 node是什么&#xff1f; node.js是一个开源的&#xff0c;跨平台的JS运行环境&#xff08;其实可以理解为是一款应用程序&#xff0c;是一款软件&#xff0c;可以运行JS&#xff09; node作用&#xff1a; 1.开发服务器应用

【LeetCode热题100】--169.多数元素

169.多数元素 使用哈希表&#xff1a; class Solution {public int majorityElement(int[] nums) {int n nums.length;int m n/2;Map<Integer,Integer> map new HashMap<>(); //定义一个hashfor(int num:nums){Integer count map.get(num); //Map.get() 方法…

8、docker 安装 nginx

1、下载镜像 docker pull nginx 2、本机创建目录 1&#xff09;创建nginx挂载目录 mkdir /usr/local/nginx 2&#xff09;进入nginx目录 cd /usr/local/nginx 3&#xff09;创建 www和logs目录 mkdir -p www logs 3、创建nginx容器 此容器用于复制配置文件&#xff0c;复…

[Spring] SpringMVC 简介(三)

目录 九、SpringMVC 中的 AJAX 请求 1、简单示例 2、RequestBody&#xff08;重点关注“赋值形式”&#xff09; 3、ResponseBody&#xff08;经常用&#xff09; 4、为什么不用手动接收 JSON 字符串、转换 JSON 字符串 5、RestController 十、文件上传与下载 1、Respo…

将中文名格式化输出为英文名

要求&#xff1a; 编写Java程序&#xff0c;输入样式为&#xff1a;Zhong wen ming的人名&#xff0c;以 Ming,Zhong.W 的形式打印出来。其中.W是中间单词的首字母&#xff1b;例如输入”Willian Jefferson Clinton“,输出形式为&#xff1a;Clinton,Willian.J public static …

【仪器仪表专题】案例:测试充电芯片保护时间测试10小时后电子负载自动下线是为什么?

测试充电芯片保护时间有两种办法,一种是使用真实的电池让充电芯片一直充电(可以通过降充电电流、修改时间参数或是并电池增加容量的方式)。另一种是使用电子负载的CV模式模拟电池(需要增加一个芯片NTC电阻来避免充电芯片发生NTC错误)。 为了最完整的还原这个过程,我采取…