C语言的应用范围 发展前途.docx
- 文档编号:5665287
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:16
- 大小:17.87KB
C语言的应用范围 发展前途.docx
《C语言的应用范围 发展前途.docx》由会员分享,可在线阅读,更多相关《C语言的应用范围 发展前途.docx(16页珍藏版)》请在冰豆网上搜索。
C语言的应用范围发展前途
C语言的应用范围,发展前途.txt﹃根网线''尽赚了多少人的青春い有时候感动的就是身边微不足道的小事。
﹎破碎不是最残酷的最残酷的是踩着这些碎片却假装不疼痛固执的寻找﹎将来就算我遇见再怎么完美的人,都有一个缺点,他不是你,_____下辈子要做男生,娶一个像我这样的女生。
C一般用来底层开发,如操作系统,嵌入式开发。
或者要求效率,高可移植性的地方。
C对人要求很高,程序员要考虑的地方太多。
他的特点就是每一个字节都可以精确控制,不象C++,编译器为你自动加的东西太多,效率也就低了。
windows就是用它来开发的,linux很多程序也用它来写
例如:
用C语言编写简单的接口程序.在当今,流行的编程软件种类繁多,它们编程方便、易于维护,但是在与硬件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地。
C语言作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高效和高级语言的方便。
在通讯中,为了保证行运安全可靠,标准的串行口必须具有许多握手信号和状态信息。
这是因为通讯的各个计算机CPU速度不一样(这会导致“错帧”)以及发送机发送数据速度比接收机接收速度快(这会导致“过冲”)。
为解决这个问题,我们采用一个简单的握手信号,即发送机每次仅发送半个字节(低4位)的数据,而另外半个字节(高4位)则用来传送信息。
我们可以对信息位(高4位)进行如下简单的编码:
0H:
发送的是新的半个字节数据
1H:
重新发送上次传送错误的数据
2H:
文件名结束
3H:
文件结束
这样,每当发送机发送一个字节以后,就等待接受机发回送信号,这回送信号就
是发送机发送过来的那个字节。
发送机接收到回送信号后,把它与刚发送的字节
相比较,如果相同,就发送新的半个字节,否则就重新发送。
新数据与旧数据通
过信息位来区分。
下面就是我用C语言编写控制串行口的程序。
我们以一个发送文件的程序为例,介绍一下用C语言实现对接口的控制。
源程序
用C语言编写简单的接口程序源代码
#include"dos.h"/*c的特点在于只要有头文件,就能和任意文件接上*/
#include"stdlib.h"
#include"stdio.h"
#definePORT0
voidSendFile(charfname);/*发送文件*/
voidSend(ints);/*发送一个字节*/
voidSendFileName(charfname);/*发送文件名*/
voidReceiveFile();/*接收文件*/
voidGetFileName(charf);/*接收文件名*/
voidInitPort(intport,unsignedcharpara);/*初始化端口*/
voidSendPort(intport,charc);/*端口发送*/
intReadPort(intport);/*读端口字节*/
intCheckState(intport);/*检查端口状态*/
intReceive(intport,intG);/*接收一个字节*/
main(argc,argv)
intargc;
char*argv[];
{
if(argc<2){
printf("PleaseinputR(receive)orS(sent)parametre:
");
exit
(1);
}
InitPort(PORT,231);
if(argv[1]=='S')/*检查选择的有效性*/
SendFile(argv[2]);
elseif(argv[1]=='R')
ReceiveFile();
else{
printf("Errorparament.Pleaseinputagain.");
exit
(1);
}
}
voidSendFile(fname)
char*fname;
{
FILE*fp;
intch,s;
if(!
(fp=fopen(fname,"rb"))){
printf("Can'topenthefile.\n");
exit
(1);
}
SendFileName(fname);
do{
ch=(int)getc(fp);
if(ferror(fp)){
printf("Errorreadingfile.\n");
break;
}
s=ch%16;/*取文件中一个字节的低4位*/
Send(s);
s=ch/16;/*取文件中一个字节的高4位*/
Send(s);
}while(!
feof(fp));
s=46;/*发送文件结束信息*/
Send(s);
Send(s);
fclose(fp);
}
voidSend(s)
ints;
{
intG;
SendPort(PORT,s);
G=ReadPort(PORT);/*等待握手信号*/
if(s!
=G)
s=s+16;
do{
SendPort(PORT,s);
G=ReadPort(PORT);/*等待握手信号*/
}while(s!
=G);
}
voidSendFileName(fname)
char*fname;
{
ints,ch;
printf("Nowtransmitthefile.Pleasewait...");
while(*fname){
ch=(int)fname++;
s=ch%16;/*取文件名中一个字节的低4位*/
Send(s);
s=ch/16;
Send(s);/*取文件名中一个字节的低4位*/
}
s=32;/*发送文件名结束标志*/
Send(s);
Send(s);
}
voidReceiveFile(){
FILE*fp;
charch;
intG1,G2,G3;
charfname[15];
GetFileName(fname);
printf("Receivingfile%s.\n",fname);
remove(fname);
if(!
(fp=fopen(fname,"wb"))){
printf("Can'topenoutputfile.\n");
exit
(1);
}
/*循环为检测每次接受的数据是否为新数据,如果不是,*/
/*则用此次接收的数据覆盖上次接收的数据*/
G1=ReadPort(PORT);
G2=Receive(PORT,&G1);
do{
G3=Receive(PORT,&G2);
ch=(char)(G1%16+G2*16);/*恢复分开的数据,组合高4位和低4位*/
putc(ch,fp);
if(ferror(fp)){
printf("\nErrorwritingfile.");
exit
(1);
}
G2=Receive(PORT,&G3);
G1=G3;
}while(G1/16!
=48);
printf("\nTransmitfinished.");
fclose(fp);
}
intReceive(port,G)
intport,*G;
{
intGM;
SendPort(port,*G);
GM=ReadPort(port);
if(GM/16==0)
returnGM;
elseif(GM/16==1){
do{
*G=GM;
SendPort(port,GM);
GM=ReadPort(port);
}while(GM/16==1);
}
returnGM;
}
voidGetFileName(f)
char*f;
{
intG1,G2,G3;
charch;
G1=ReadPort(PORT);
G2=ReadPort(PORT);
do{
G3=Receive(PORT,&G3);
ch=(char)(G1%16+G2/16);
*f=ch;
*f++;
G2=Receive(PORT,&G3);
G1=G3;
}while(G1/16!
=32);
printf("Filenametransmitfinished.\n");
}
voidInitPort(port,para)
intport;
unsignedcharpara;
{
unionREGSreg;
reg.x.dx=port;
reg.h.ah=0;
reg.h.al=para;
int86(0x14,?
?
);
}
voidSendPort(port,c)
intport;
charc;
{
unionREGSreg;
reg.x.dx=port;
reg.h.al=c;
reg.h.ah=1;
int86(0x14,?
?
);
if(reg.h.ah&128){
printf("\nSendmistakes!
");
exit
(1);
}
}
intReadPort(port)
intport;
{
unionREGSreg;
while(!
(CheckState(port)&256)){
if(kbhit()){/*如端口长期无数据可人为终止等待*/
printf("Pressanykeytoexit.");
getch();
exit
(1);
}
}
reg.x.dx=port;
reg.h.ah=2;
int86(0x14,?
?
);
if(reg.h.ah&128){
printf("\nReadmistake!
");
exit
(1);
}
returnreg.h.al;
}
intCheckState(port)
intport;
{
unionREGSreg;
reg.x.dx=port;
reg.h.ah=3;
int86(0x14,?
?
);
returnreg.x.ax;
}
以上程序可传送各种格式的文件,也有一定的自动纠错能力,但对于异常情况的
处理能力比较弱,读者可以自己改进。
由于篇幅限制,对于中断14H的功能、入
口参数及返回参数的意义请读者自己查有关资料。
**********************************
附录:
现在大多数串行口都遵循RS-232标准,以下是最常用的RS-232信号:
名称针号含义
RTS 4 Requesttosend(请求发送)
CTS 5 Cleartosend(清除发送)
DSR 6 Datasetready(数据设备准备好)
DTR 20 Dataterminalready(数据终端准备好)
TXD 2 Transmitdata(发送数据)
RXD 3 Receivedata(接收数据)
GRD 7 Ground(接地)
----------------------------------------------------------------
附:
经站长调试后在TC2.0下通过的代码
#include"dos.h"
#include"stdlib.h"
#include"stdio.h"
#definePORT0
voidSendFile(char*fname);/*发送文件*/
voidSend(ints);/*发送一个字节*/
voidSendFileName(char*fname);/*发送文件名*/
voidReceiveFile();/*接收文件*/
voidGetFileName(char*f);/*接收文件名*/
voidInitPort(intport,unsignedcharpara);/*初始化端口*/
voidSendPort(intport,charc);/*端口发送*/
intReadPort(intport);/*读端口字节*/
intCheckState(intport);/*检查端口状态*/
intReceive(intport,int*G);/*接收一个字节*/
main(intargc,char*argv[])
{
if(argc<2){
printf("PleaseinputR(receive)orS(sent)parametre:
");
exit
(1);
}
InitPort(PORT,231);
if(*argv[1]=='S')/*检查选择的有效性*/
SendFile(argv[2]);
elseif(*argv[1]=='R')
ReceiveFile();
else{
printf("Errorparament.Pleaseinputagain.");
exit
(1);
}
}
voidSendFile(char*fname)
{
FILE*fp;
intch,s;
if((fp=fopen(fname,"rb"))==NULL)
{
printf("Can'topenthefile.\n");
exit
(1);
}
SendFileName(fname);
do{
ch=(int)getc(fp);
if(ferror(fp)){
printf("Errorreadingfile.\n");
break;
}
s=ch%16;/*取文件中一个字节的低4位*/
Send(s);
s=ch/16;/*取文件中一个字节的高4位*/
Send(s);
}while(!
feof(fp));
s=46;/*发送文件结束信息*/
Send(s);
Send(s);
fclose(fp);
}
voidSend(s)
ints;
{
intG;
SendPort(PORT,s);
G=ReadPort(PORT);/*等待握手信号*/
if(s!
=G)
s=s+16;
do{
SendPort(PORT,s);
G=ReadPort(PORT);/*等待握手信号*/
}while(s!
=G);
}
voidSendFileName(fname)
char*fname;
{
ints,ch;
printf("Nowtransmitthefile.Pleasewait...");
while(*fname){
ch=(int)fname++;
s=ch%16;/*取文件名中一个字节的低4位*/
Send(s);
s=ch/16;
Send(s);/*取文件名中一个字节的低4位*/
}
s=32;/*发送文件名结束标志*/
Send(s);
Send(s);
}
voidReceiveFile(){
FILE*fp;
charch;
intG1,G2,G3;
charfname[15];
GetFileName(fname);
printf("Receivingfile%s.\n",fname);
remove(fname);
if((fp=fopen(fname,"wb"))==NULL)
{
printf("Can'topenoutputfile.\n");
exit
(1);
}
/*循环为检测每次接受的数据是否为新数据,如果不是,*/
/*则用此次接收的数据覆盖上次接收的数据*/
G1=ReadPort(PORT);
G2=Receive(PORT,&G1);
do{
G3=Receive(PORT,&G2);
ch=(char)(G1%16+G2*16);/*恢复分开的数据,组合高4位和低4位*/
putc(ch,fp);
if(ferror(fp)){
printf("\nErrorwritingfile.");
exit
(1);
}
G2=Receive(PORT,&G3);
G1=G3;
}while(G1/16!
=48);
printf("\nTransmitfinished.");
fclose(fp);
}
intReceive(port,G)
intport,*G;
{
intGM;
SendPort(port,*G);
GM=ReadPort(port);
if(GM/16==0)
returnGM;
elseif(GM/16==1){
do{
*G=GM;
SendPort(port,GM);
GM=ReadPort(port);
}while(GM/16==1);
}
returnGM;
}
voidGetFileName(char*f)
{
intG1,G2,G3;
charch;
G1=ReadPort(PORT);
G2=ReadPort(PORT);
do{
G3=Receive(PORT,&G3);
ch=(char)(G1%16+G2/16);
*f=ch;
*f++;
G2=Receive(PORT,&G3);
G1=G3;
}while(G1/16!
=32);
printf("Filenametransmitfinished.\n");
}
voidInitPort(port,para)
intport;
unsignedcharpara;
{
unionREGSreg;
reg.x.dx=port;
reg.h.ah=0;
reg.h.al=para;
int86(0x14,?
?
);
}
voidSendPort(port,c)
intport;
charc;
{
unionREGSreg;
reg.x.dx=port;
reg.h.al=c;
reg.h.ah=1;
int86(0x14,?
?
);
if(reg.h.ah&128){
printf("\nSendmistakes!
");
exit
(1);
}
}
intReadPort(port)
intport;
{
unionREGSreg;
while(!
(CheckState(port)&256)){
if(kbhit()){/*如端口长期无数据可人为终止等待*/
printf("Pressanykeytoexit.");
getch();
exit
(1);
}
}
reg.x.dx=port;
reg.h.ah=2;
int86(0x14,?
?
);
if(reg.h.ah&128){
printf("\nReadmistake!
");
exit
(1);
}
returnreg.h.al;
}
intCheckState(port)
intport;
{
unionREGSreg;
reg.x.dx=port;
reg.h.ah=3;
int86(0x14,?
?
);
returnreg.x.ax;
}
本文来自CSDN博客,转载请标明出处:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言的应用范围 发展前途 语言 应用 范围
![提示](https://static.bdocx.com/images/bang_tan.gif)