本文目錄一覽:
什麼是linux下的C語言驅動開發?
驅動一般是指硬體驅動,當然也有資料庫驅動程序。
至於為什麼要在Linux下開發,主要是為了在Linux下使用測試。
驅動程序就是Linux內核的一個重要組成部分。
c語言驅動usb
答案是可以。
網上有許多學習板,去淘寶搜索USB學習板就知道了。
單片機一般是STM32或者是silicon公司的C8051F34系列這些自帶USB的單片機或者51單片機加上一塊USB控制器。
使用silicon公司的丹皮納吉,你可以很快做出一個成品,因為silicon公司提供了windows驅動和下位機的驅動。你只需要去調用他提供的API函數就夠了。
使用前者或者是51結合USB控制器,你可以學到很多更詳細的USB知識(很直接的說,USB是個非常複雜的東西)
需要掌握的知識有:
上位機,需要掌握VC或者VB之類的能生成圖形界面的軟體,來調用siliocn的庫實現通過USB向單片機傳遞數據或者是自己去定義USB的那些結構體實現設備的枚舉握手等過程(初學者不建議,有點難,但網上的源碼非常多,肯鑽研,這條路更好。)。
下位機,就需要掌握單片機的使用。
當然所有的這些,需要熟練使用C語言,以及了解C++面向對象的思想。
這東西比較複雜,不是一蹴而就的,慢慢來,相信你會有個好的前景的!
請c語言大神幫忙!
這個題目要點。
1、收費標準必須為可操作修改。
2、收費標準檔位是不確定的,需要動態數組。(當然用常量,每次手改源代碼就不需要了)
3、收費標準的輸入除第一個閥值,其他要求增量(較上一個閥值),不能直接用於運算。
4、輸入範圍需要有驗證。
最簡易做法是將標準定義成常量,然後需要時修改代碼常量,但這樣對用戶夠不友好,所以我這裡把標準定義成結構,定義函數動態申請數組,修改收費標準。
#includestdio.h
#includemalloc.h
typedef struct eq
{
int tn;//表示共有幾檔
float **fb;//表示各檔計費標準的二維數組
}EQ;
int newFb(int tn);//構建收費標準數組地址空間,成功返回1,失敗返回2。(成功自動釋放舊地址,無需單獨釋放)
EQ *init();//初始化計費標準
void showEQ();//列印當前收費標準
int setEQ();//修改收費標準,成功返回1,失敗返回0
float ecost(float amount);//計算電費
EQ *eq=NULL;
int main()
{
int n=0;
float at;
eq=init();
if(!eq)
{
printf(“異常終止!\n”);
return 1;
}
while(1)
{
printf(“1、列印收費標準;2、修改收費標準;3、計算電費\n”);
n=0;
while(n!=1 n!=2 n!=3)
scanf(“%d”,n);
switch(n)
{
case 1:showEQ();break;
case 2:
if(!setEQ())
printf(“異常!修改失敗!\n\n”);
else
printf(“修改成功!\n\n”);
break;
case 3:printf(“請輸入年度用電量:”);
scanf(“%f”,at);
printf(“年度用電費用:%.2f\n\n”,ecost(at));
break;
}
}
return 0;
}
float ecost(float amount)//計算電費
{
int i;
float sum=0;
if(amount=eq-fb[0][0])
return 0;
for(i=eq-tn-1;i=0;i–)
if(amounteq-fb[i][0])
{
sum+=(amount-eq-fb[i][0])*eq-fb[i][1];
amount=eq-fb[i][0];
}
return sum;
}
EQ *init()//初始化計費標準,
{
if(eq)
return eq;
eq=(EQ *)malloc(sizeof(EQ));
if(!eq)
return NULL;
eq-tn=4;
eq-fb=NULL;
if(!newFb(4))
{
free(eq);
return NULL;
}
eq-fb[0][0]=0,eq-fb[0][1]=0.6;
eq-fb[1][0]=3000,eq-fb[1][1]=0.7;
eq-fb[2][0]=5000,eq-fb[2][1]=0.9;
eq-fb[3][0]=7000,eq-fb[3][1]=1.2;
return eq;
}
int newFb(int tn)//構建收費標準數組地址空間,成功返回1,失敗返回0。(成功自動釋放舊地址,無需單獨釋放)
{
int i,flag=1;
float **fbSave=NULL;
if(!eq)
return 0;
eq-tn=tn;
if(!eq-fb)//如果有舊地址,保存該地址,用於還原
fbSave=eq-fb;
eq-fb=(float **)malloc(sizeof(float *)*tn);
if(!eq-fb)
flag=2;
for(i=0;flag itn;i++)
{
eq-fb[i]=(float *)malloc(sizeof(float)*2);
if(!eq-fb)
flag=3;
}
if(flag==3)//內存申請失敗,釋放已申請的新地址,還原舊地址
{
for(i=0;itn;i++)
free(eq-fb[i]);
free(eq-fb);
eq-fb=fbSave;
return 0;
}
if(flag==2)
{
eq-fb=fbSave;
return 0;
}
return 1;
}
void showEQ()//列印當前收費標準
{
int i;
printf(“當前共計%d檔計費標準:\n”,eq-tn);
for(i=0;ieq-tn;i++)
printf(“電量超過%.0f,%s%.1f(實際金額%.1f)\n”,eq-fb[i][0],i0?”每度再增加”:”每度”,i0?eq-fb[i][1]-eq-fb[i-1][1]:eq-fb[i][1],eq-fb[i][1]);
printf(“\n”);
}
int setEQ()//修改收費標準,成功返回1,失敗返回0
{
int i,tn;
float money;
printf(“請輸入新的計費檔數(輸入0退出修改):”);
scanf(“%d”,tn);
if(!tn)
return 0;
if(newFb(tn))
{
for(i=0;ieq-tn;i++)
{
printf(“請輸入第%d檔電量閥值(%s%.0f),及%s(單位元)”,i+1,i0?”必須大於”:”大於等於”,i0?eq-fb[i-1][0]:0,i0?”每度增加收費”:”每度收費”);
scanf(“%f%f”,eq-fb[i][0],money);
if(i==0 eq-fb[i][0]0)
{
printf(“輸入錯誤!起始閥值不能小於0!請重新輸入\n”);
i–;
continue;
}
if(i0 eq-fb[i][0]=eq-fb[i-1][0])
{
printf(“輸入錯誤!當前閥值不能小於上一次的閥值!請重新輸入\n”);
i–;
continue;
}
if(i==0)
eq-fb[i][1]=money;
else
eq-fb[i][1]=eq-fb[i-1][1]+money;
}
}
return 1;
}
//PS:你說你代碼運算不對,看看是否把增量當金額來用了。
原創文章,作者:PLLU,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/149507.html