C语言的应用范围和发展前途简介

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"
#define PORT 0
void SendFile(char fname); /* 发送文件*/
void Send(int s); /*发送一个字节*/
void SendFileName(char fname); /*发送文件名*/
void ReceiveFile(); /*接收文件*/
void GetFileName(char f); /*接收文件名*/
void InitPort(int port,unsigned char para); /*初始化端口*/
void SendPort(int port,char c); /*端口发送*/
int ReadPort(int port); /*读端口字节*/
int CheckState(int port); /*检查端口状态*/
int Receive(int port,int G); /*接收一个字节*/
main(argc,argv)
int argc;
char *argv[];
{
if(argc<2){
printf("Please input R(receive) or S(sent) parametre:");
exit(1);
}
InitPort(PORT,231);
if(argv[1]=='S') /*检查选择的有效性*/
SendFile(argv[2]);
else if(argv[1]=='R')
ReceiveFile();
else{
printf("Error parament.Please input again.");
exit(1);
}
}
void SendFile(fname)
char *fname;
{
FILE *fp;
int ch,s;
if(!(fp=fopen(fname,"rb"))){
printf("Can't open the file.\n");
exit(1);
}
SendFileName(fname);
do{
ch=(int)getc(fp);
if(ferror(fp)){
printf("Error reading file.\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);
}
void Send(s)
int s;
{
int G;
SendPort(PORT,s);
G=ReadPort(PORT); /*等待握手信号*/
if(s!=G)
s=s+16;
do{
SendPort(PORT,s);
G=ReadPort(PORT);/*等待握手信号*/
}while(s!=G);
}
void SendFileName(fname)
char *fname;
{
int s,ch;
printf("Now transmit the file.Please wait...");
while(*fname){
ch=(int)fname++;
s=ch%16; /*取文件名中一个字节的低4位*/
Send(s);
s=ch/16;
Send(s); /*取文件名中一个字节的低4位*/
}
s=32; /*发送文件名结束标志*/
Send(s);
Send(s);
}
void ReceiveFile(){
FILE *fp;
char ch;
int G1,G2,G3;
char fname[15];
GetFileName(fname);
printf("Receiving file %s.\n",fname);
remove(fname);
if(!(fp=fopen(fname,"wb"))){
printf("Can't open output file.\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("\nError writing file.");
exit(1);
}
G2=Receive(PORT,&G3);
G1=G3;
}while(G1/16!=48);
printf("\nTransmit finished.");
fclose(fp);
}
int Receive(port,G)
int port,*G;
{
int GM;
SendPort(port,*G);
GM=ReadPort(port);
if(GM/16==0)
return GM;
else if(GM/16==1){
do{
*G=GM;
SendPort(port,GM);
GM=ReadPort(port);
}while(GM/16==1);
}
return GM;
}
void GetFileName(f)
char *f;
{
int G1,G2,G3;
char ch;
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("File name transmit finished.\n");
}
void InitPort(port,para)
int port;
unsigned char para;
{
union REGS reg;
reg.x.dx=port;
reg.h.ah=0;
reg.h.al=para;
int86(0x14,?,?);
}
void SendPort(port,c)
int port;
char c;
{
union REGS reg;
reg.x.dx=port;
reg.h.al=c;
reg.h.ah=1;
int86(0x14,?,?);
if(reg.h.ah&128){
printf("\nSend mistakes!");
exit(1);
}
}
int ReadPort(port)
int port;
{
union REGS reg;
while(!(CheckState(port)&256)){
if(kbhit()){/*如端口长期无数据可人为终止等待*/
printf("Press any key to exit.");
getch();
exit(1);
}
}
reg.x.dx=port;
reg.h.ah=2;
int86(0x14,?,?);
if(reg.h.ah&128){
printf("\nRead mistake!");
exit(1);
}
return reg.h.al;
}
int CheckState(port)
int port;
{
union REGS reg;
reg.x.dx=port;
reg.h.ah=3;
int86(0x14,?,?);
return reg.x.ax;
}

以上程序可传送各种格式的文件,也有一定的自动纠错能力,但对于异常情况的处理能力比较弱,读者可以自己改进。由于篇幅限制,对于中断14H的功能、入口参数及返回参数的意义请读者自己查有关资料。
**********************************
附录:现在大多数串行口都遵循RS-232标准,以下是最常用的RS-232信号:
名称 针号 含义
RTS 4  Request to send(请求发送)
CTS 5  Clear to send(清除发送)
DSR 6  Data set ready(数据设备准备好)
DTR 20  Data terminal ready(数据终端准备好)
TXD 2  Transmit data(发送数据)
RXD 3  Receive data(接收数据)
GRD 7  Ground(接地)

----------------------------------------------------------------
附:经站长调试后在TC2.0下通过的代码

#include "dos.h"
#include "stdlib.h"
#include "stdio.h"
#define PORT 0
void SendFile(char *fname); /* 发送文件*/
void Send(int s); /*发送一个字节*/
void SendFileName(char *fname); /*发送文件名*/
void ReceiveFile(); /*接收文件*/
void GetFileName(char *f); /*接收文件名*/
void InitPort(int port,unsigned char para); /*初始化端口*/
void SendPort(int port,char c); /*端口发送*/
int ReadPort(int port); /*读端口字节*/
int CheckState(int port); /*检查端口状态*/
int Receive(int port,int *G); /*接收一个字节*/
main(int argc,char *argv[])
{
if(argc<2){
printf("Please input R(receive) or S(sent) parametre:");
exit(1);
}
InitPort(PORT,231);
if(*argv[1]=='S') /*检查选择的有效性*/
SendFile(argv[2]);
else if(*argv[1]=='R')
ReceiveFile();
else{
printf("Error parament.Please input again.");
exit(1);
}
}
void SendFile(char *fname)
{
FILE *fp;
int ch,s;
if((fp=fopen(fname,"rb"))==NULL)
{
printf("Can't open the file.\n");
exit(1);
}
SendFileName(fname);
do{
ch=(int)getc(fp);
if(ferror(fp)){
printf("Error reading file.\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);
}
void Send(s)
int s;
{
int G;
SendPort(PORT,s);
G=ReadPort(PORT); /*等待握手信号*/
if(s!=G)
s=s+16;
do{
SendPort(PORT,s);
G=ReadPort(PORT);/*等待握手信号*/
}while(s!=G);
}
void SendFileName(fname)
char *fname;
{
int s,ch;
printf("Now transmit the file.Please wait...");
while(*fname){
ch=(int)fname++;
s=ch%16; /*取文件名中一个字节的低4位*/
Send(s);
s=ch/16;
Send(s); /*取文件名中一个字节的低4位*/
}
s=32; /*发送文件名结束标志*/
Send(s);
Send(s);
}
void ReceiveFile(){
FILE *fp;
char ch;
int G1,G2,G3;
char fname[15];
GetFileName(fname);
printf("Receiving file %s.\n",fname);
remove(fname);
if((fp=fopen(fname,"wb"))==NULL)
{
printf("Can't open output file.\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("\nError writing file.");
exit(1);
}
G2=Receive(PORT,&G3);
G1=G3;
}while(G1/16!=48);
printf("\nTransmit finished.");
fclose(fp);
}
int Receive(port,G)
int port,*G;
{
int GM;
SendPort(port,*G);
GM=ReadPort(port);
if(GM/16==0)
return GM;
else if(GM/16==1){
do{
*G=GM;
SendPort(port,GM);
GM=ReadPort(port);
}while(GM/16==1);
}
return GM;
}
void GetFileName(char *f)
{
int G1,G2,G3;
char ch;
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("File name transmit finished.\n");
}
void InitPort(port,para)
int port;
unsigned char para;
{
union REGS reg;
reg.x.dx=port;
reg.h.ah=0;
reg.h.al=para;
int86(0x14,?,?);
}
void SendPort(port,c)
int port;
char c;
{
union REGS reg;
reg.x.dx=port;
reg.h.al=c;
reg.h.ah=1;
int86(0x14,?,?);
if(reg.h.ah&128){
printf("\nSend mistakes!");
exit(1);
}
}
int ReadPort(port)
int port;
{
union REGS reg;
while(!(CheckState(port)&256)){
if(kbhit()){/*如端口长期无数据可人为终止等待*/
printf("Press any key to exit.");
getch();
exit(1);
}
}
reg.x.dx=port;
reg.h.ah=2;
int86(0x14,?,?);
if(reg.h.ah&128){
printf("\nRead mistake!");
exit(1);
}
return reg.h.al;
}
int CheckState(port)
int port;
{
union REGS reg;
reg.x.dx=port;
reg.h.ah=3;
int86(0x14,?,?);
return reg.x.ax;
}

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

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

相关文章

css控制div等比高度

在移动端开发中&#xff0c;在banner轮播图未加载出来之前&#xff0c;banner层是不占文档流高度的&#xff0c;当从服务器获取完banner数据&#xff0c;展示的时候&#xff0c;banner层因为有了内容 所以会撑开&#xff0c;导致banner层下面的内容也随之移动&#xff0c;为解决…

2018杭州云栖大会,梁胜博士的演讲PPT来啦!

2019独角兽企业重金招聘Python工程师标准>>> 2018杭州云栖大会已经结束&#xff0c;Rancher作为阿里云的紧密合作伙伴&#xff0c;Rancher Labs联合创始人兼CEO梁胜博士&#xff0c;在9月21日上午受邀出席大会并作题为**“如何能让每个人都用Kubernetes和Service Me…

No Identifier specified for entity的解决办法

见&#xff1a;http://blog.csdn.net/u011617875/article/details/18550305 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 No Identifier specified for entity的错误IdGeneratedVal…

利用jquery修改elment的自定义组件多选框el-select(修改多选框的颜色)

先上图片 一实现逻辑 我们知道element颜色默认为灰色&#xff0c;首先便签名称是唯一的&#xff0c;我的实现逻辑是后端传给前端 含有颜色&#xff0c;名称的数组&#xff0c;然后vue记录一个对象{名称 > 颜色}&#xff0c;当用户选择标签之后&#xff0c;触发 点击事件&…

怎样在C语言程序中使用功能键和箭头键?

在程序中使用功能键和箭头键可以使程序更容易使用。箭头键可用来移动光标&#xff0c;而功能键使用户能做一些特殊的事情&#xff0c;还可用来替代一些经常要键入的字符序列。然而&#xff0c;与其它“特殊”功能一样&#xff0c;C语言本身并没有提供读入功能键和箭头键的标准方…

中文地址

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/u/2935389/blog/2209087

python+selenium十:selenium的二次封装

pythonselenium十&#xff1a;基于原生selenium的二次封装 from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.select import Sele…

TDD开发模式实现代码功能逻辑(自己总结,持续更新)

1.先写测试 2.要使程序尽快的通过&#xff08;及早交付&#xff09; 3.优化程序结构&#xff0c;尽量使程序尽量快的运行 4.不要怕修改&#xff0c;单元测试会保证接口的正常运行 5.能通过测试后再去重构&#xff08;消除冗余&#xff0c;优化程序设计&#xff09; 6.用尽…

Intellij IDEA Debug调试技巧

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1、这里以一个web工程为例&#xff0c;点击图中按钮开始运行web工程。 2、设置断点 3、使用postman发送http请求 4、请求发送之后会自动…

15行代码让苹果设备崩溃,最新的iOS 12也无法幸免

安全研究人员Sabri Haddouche发现了一个只需几行代码就可以让iPhone崩溃并重启的方法。\\Sabri Haddouche在GitHub上发布了一个示例网页&#xff0c;只有15行代码&#xff0c;如果在iPhone或iPad上访问这个页面&#xff0c;就会崩溃并重启。在macOS上使用Safari打开该页面也会出…

appium更新到1.8.2,不能打开运行的解决办法

1、更新下载appium 1.8.2 打开运行 一直是这个界面。很烦躁&#xff0c;重启电脑或者卸载后重新安装还是没有用。 解决版本&#xff1a; 1、查看老版本和新版本的安装位置 老版本默认是 C:\Program Files (x86)/appium安装新的版本后&#xff0c;地址是&#xff1a;C:\Users…

C语言运算符及其优先级汇总表口诀

C语言运算符及其优先级汇总表口诀圆下箭头一顿号非凡增减富强针地长三乘除&#xff0c;四加减&#xff0c;五移位千万别把鱼忘记&#xff0c;它在盛饭的厨子里小灯大灯灯灯不等爸喂鱼&#xff0c;舅疑惑&#xff0c;裸鸡也疑惑十三姨&#xff0c;十四父&#xff0c;十五逗&…

laraval如何使用tdd

1.首先新建一个laravel birdboard项目 composer create-project --prefer-dist birdboard 2.新建单元测试 php artisan make:test ProjectTest 3.书写单元测试 对于初学着来说&#xff0c;最好先预测tdd即将要出现的错误&#xff0c;然后进行测试&#xff0c;判断是否和自…

让你页面速度飞起来 Web前端性能优化

百度网盘下载 第1章 课程简介对课程做简单的介绍。第2章 资源合并与压缩通过本章&#xff0c;我们学习和理解了web前端的概念&#xff0c;以及性能优化的意义所在&#xff0c;并且通过实战中的压缩与合并&#xff0c;深入理解了减少http请求数和减少http请求资源大小两个优化要…

spring-data-JPA使用JpaRepository注解自定义SQL查询数据库多表查询

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一. 首先在Entity注解的类里面要写好外键关系. 这个 ManyToOne 注解可以建立外键关系, 不要在自己傻傻的写一个 private int grades_id…

工厂示例

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; using System.Reflection;namespace Common.DALFactory {/// <summary>/// 数据层对象实例创建/// </summary>public partial class DbFacto…

手把手教你如何优化C语言程序

程序进行优化&#xff0c;通常是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个予盾的统一&#xff0c;一般是优化了代码的尺寸&#xff0c;就会带来执行时间的增加&#xff0c;如果优化了程序的执行速度&#xff0c;通常会带来代码增加的副作用&#xff0c;很…

posman使用教程

1.新建文件夹 2.新建请求&#xff0c;右击文件夹&#xff0c; 3.点开测试文件&#xff0c;有get,put,post方法&#xff0c;我经常使用的是put方法&#xff0c;区别我就不讲了 4.我基本上填在body里面 5.这是基本的使用&#xff0c;我来更高级一点添加环境变量&#xff0c;一共有…

Linux实战教学笔记42:squid代理与缓存实践(一)

第1章 Squid介绍 1.1 缓存服务器介绍 缓存服务器&#xff08;英文意思cache server&#xff09;,即用来存储&#xff08;介质为内存及硬盘&#xff09;用户访问的网页&#xff0c;图片&#xff0c;文件等等信息的专用服务器。这种服务器不仅可以使用户可以最快的得到他们想要的…

Mysql中DATE_SUB 使用方法结合查询一天内,一周内,一月内的信息实例讲解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在对数据查询或菜单时经常要对指定的时间或时间段进行查询,例如要查询一天内的信息,要查询一周内的信息,要查询一个月内的,南昌网站建设公…