汽车行驶记录仪C语言编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汽车黑匣子项目说明
1.汽车黑匣子简介
汽车黑匣子〃又称汽车工作信息记录仪〃汽车安全信息记录仪〃也有人将其形象地称为汽车电子警察。它能够完整、准确地记录汽车行驶状态下的有关情况〃并通过专用软件在电脑上再现。本项目只是实现的是它的软件部分。
2.项目要求
1.记录汽车运行时的日期〃时间和速度;
2.经可能的多存一些信息:使用位段;
3.每满10次(可根据用户要求更改)记录向文件中存一次;
4.文件大小只有1.2K(可根据用户要求更改);
3.分析建模
本次项目主要的关键点有不断的采集数据直到汽车停止〃将采集到了数据存入到一个大小固定的文件中(此文件大小可以根据用户要求改变)〃将文件里的数据读出查看汽车行驶时采集到的数据。
3.1采集数据集存储
通过调用time 和localtime函数来采集日期和时间〃(由于目前没有采集速度的设备所以速度采用手动从键盘输
入);
程序如下;
void input(PPER new)
{
int n=0;
printf("请输入卡车行驶的速度\n");
scanf("%d",&n);
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
new->year=(1900+p->tm_year);
new->mouth=(1+p->tm_mon);
new->day=p->tm_mday;
new->hour=p->tm_hour;
new->fen=p->tm_min;
new->second=p->tm_sec;
new->speed=n;
new->next=NULL;
}
由于每条数据有比较多的信息所以我们定义一个结构体来
存储采集到的每条数据〃数据采用位段存储省空间;
程序如下:
typedef struct car
{
unsigned int year:12;
unsigned int mouth:4;
unsigned int day:5;
unsigned int hour:5;
unsigned int fen:6;
unsigned int second:6;
unsigned int speed:9;
struct car * next;
}PER,*PPER;
由于存储的数据条数比较多且条数不固定所以采用链表将这些结构体链接起来〃来的数据往链表末尾一挂
程序如下:
PPER addlink(PPER head)
{
int i=0;
PPER ps=head;
while(1)
{
PPER new=calloc(1,sizeof(PER));
input(new);
if(NULL==head)
{
head=new;
ps=head;
i++;
}
else
{
head->next=new;
if(0==new->speed)
return ps;
head=head->next;
i++;
}
if(i>=N)
return ps;
}
}
3.2将数据存入文件中
每一次存储数据在文件的位置都要从上一次结束的位置开始〃我们定义一个变量n来记录每次文件存储结束的位置〃并存入文件的开头〃第二次要存储数据的时候先读取n的数据就知道上一次存在哪里〃然后接着往后面存;
文件的大小我们宏定义一个FILEMAX来控制每一次剩余文件的大小不能存储一条数据时将文件跳到n后面开始存储程序如下:
void inputfile(PPER head)
{
int n=sizeof(int);
FILE *fp=fopen("xiangmu.txt","r+");
if(NULL==fp)
{
fp=fopen("xiangmu.txt","w");
fwrite(&n,sizeof(int),1,fp);
}
else
{
fread(&n,sizeof(int),1,fp);
fseek(fp,n,SEEK_SET);
}
while(1)
{
if(NULL==head)
break;
if((FILEMAX-ftell(fp))>sizeof(PER))
{
fwrite(head,sizeof(PER),1,fp);
head=head->next;
}
else
fseek(fp,sizeof(int),SEEK_SET);
}
n=ftell(fp);
rewind(fp);
fwrite(&n,sizeof(int),1,fp);
fclose(fp);
}
3.3显示文件
由于文件是以二进制代码方式存储〃人类无法直接查看所以要先将文件的内容调入PC机内存中显示在显示器上才好查看〃
文件到内存放在链表中存储
程序如下:
PPER outputfile(PPER head)
{
FILE *fp=fopen("xiangmu.txt","r");
if(NULL==fp)