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.pswp.cn/news/450605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450605.shtml
英文地址,請注明出處:http://en.pswp.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;忍不住分享一下給大家。點擊跳轉到教程。 在對數據查詢或菜單時經常要對指定的時間或時間段進行查詢,例如要查詢一天內的信息,要查詢一周內的信息,要查詢一個月內的,南昌網站建設公…