一個函數(shù)(function)是一個可以從程序其它地方調(diào)用執(zhí)行的語句塊。以下是函數(shù)定義格式:
10余年的萬年網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整萬年建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“萬年網(wǎng)站設(shè)計”,“萬年網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
type name ( argument1, argument2, ...) statement
說明:
type 是函數(shù)返回的數(shù)據(jù)的類型
name 是函數(shù)被調(diào)用時使用的名
argument 是函數(shù)調(diào)用需要傳入的參量(可以聲明任意多個參量)。每個參量(argument)由一個數(shù)據(jù)類型后面跟一個標(biāo)識名稱組成,就像變量聲明中一樣(例如,int x)。參量僅在函數(shù)范圍內(nèi)有效,可以和函數(shù)中的其它變量一樣使用, 它們使得函數(shù)在被調(diào)用時可以傳入?yún)?shù),不同的參數(shù)用逗號(comma)隔開.
statement 是函數(shù)的內(nèi)容。它可以是一句指令,也可以是一組指令組成的語句塊。如果是一組指令,則語句塊必須用花括號{}括起來,這也是我們最常見到情況。其實為了使程序的格式更加統(tǒng)一清晰,建議在僅有一條指令的時候也使用花括號,這是一個良好的編程習(xí)慣。
示例:每一個C語言程序有且只有一個main函數(shù),本身main就是一個函數(shù)。結(jié)合上面的格式,自己理解一下。
int?main()
{
return?0;
}
使用函數(shù)getsockopt獲得發(fā)送緩沖區(qū)的長度。用法如下:
int sockfd;
int val;
int len;
sockfd = socket (AF_INET, SOCK_STREAM, 0);
len = sizeof (val);
getsockopt( sockfd, SOL_SOCKET, SO_SNDBUF, val, len);
printf ("sndbuf len=%d\n", val);
在32位linux系統(tǒng)上發(fā)送緩沖區(qū)為16K ,可以使用setsockopt()修改,會影響網(wǎng)絡(luò)性能
// SPI(nRF24L01) 命令定義
#define READ_REG 0x00 // 定義讀寄存器命令
#define WRITE_REG 0x20 // 定義寫寄存器命令
#define RD_RX_PLOAD 0x61 // 定義接收有效載荷寄存器
#define WR_TX_PLOAD 0xA0 // 定義發(fā)送有效載荷寄存器
#define FLUSH_TX 0xE1 // 定義清除發(fā)送寄存器命令
#define FLUSH_RX 0xE2 // 定義清除接收寄存器命令
#define REUSE_TX_PL 0xE3 // 定義復(fù)用發(fā)送有效載荷寄存器命令
#define NOP1 0xFF // 定義空操作,用于讀取狀態(tài)寄存器
// SPI(nRF24L01) registers(addresses)
#define CONFIG 0x00 // “配置寄存器”地址
#define EN_AA 0x01 // “使能自動應(yīng)答寄存器”地址
#define EN_RXADDR 0x02 // “使能接收地址寄存器”地址
#define SETUP_AW 0x03 // “設(shè)置地址長度寄存器”地址
#define SETUP_RETR 0x04 // “設(shè)置自動重發(fā)寄存器”地址
#define RF_CH 0x05 // “RF(射頻)頻道寄存器”地址
#define RF_SETUP 0x06 // “RF(射頻)設(shè)置寄存器”地址
#define STATUS_24L01 0x07 // “狀態(tài)寄存器”地址
#define OBSERVE_TX 0x08 // “?寄存器”地址
#define CD 0x09 // “發(fā)現(xiàn)載波寄存器”地址
#define RX_ADDR_P0 0x0A // “通道0接收寄存器”地址
#define RX_ADDR_P1 0x0B // "通道1接收寄存器"地址
#define RX_ADDR_P2 0x0C // "通道2接收寄存器"地址
#define RX_ADDR_P3 0x0D // "通道3接收寄存器"地址
#define RX_ADDR_P4 0x0E // "通道4接收寄存器"地址
#define RX_ADDR_P5 0x0F // "通道5接收寄存器"地址
#define TX_ADDR 0x10 // ”發(fā)送寄存器“地址
#define RX_PW_P0 0x11 // ”通道0有效載荷(數(shù)據(jù))長度寄存器“地址
#define RX_PW_P1 0x12 // ”通道1有效載荷長度寄存器“地址
#define RX_PW_P2 0x13 // ”通道2有效載荷長度寄存器“地址
#define RX_PW_P3 0x14 // ”通道3有效載荷長度寄存器“地址
#define RX_PW_P4 0x15 // ”通道4有效載荷長度寄存器“地址
#define RX_PW_P5 0x16 // ”通道5有效載荷長度寄存器“地址
#define FIFO_STATUS 0x17 // “FIFO狀態(tài)寄存器的寄存器”地址
//**-------------------------------
#define TX_ADR_WIDTH 5 //發(fā)送地址字節(jié)數(shù)
#define RX_PLOAD_WIDTH 16 //接收數(shù)據(jù)字節(jié)數(shù)
#define TX_PLOAD_WIDTH 16 //發(fā)送數(shù)據(jù)字節(jié)數(shù)
#define MAX_CONTROL_NUMBER 2 //2 line concrol 2 relay remote control
#define NOP _nop_();
#define NOP5 NOP;NOP;NOP;NOP;NOP;
#define NOP10 NOP5;NOP5;
#define NOP20 NOP10;NOP10;
#define delay_130us() NOP20;NOP20;NOP20;NOP20;NOP20;NOP20;NOP10;
#define uchar unsigned char
#define BYTE unsigned char
sbit CE = P2^2;
sbit CSN = P2^3;
sbit SCK = P2^4 ;
sbit MOSI = P2^5;
sbit MISO = P2^6 ; //數(shù)據(jù)輸入引腳
sbit IRQ_24L01= P2^7 ;//spi通訊端口定義
/**---------------------------------*/
unsigned char TX_ADDRESS[5]={
0x1,0x02,0x03,0x04,0x05
};
unsigned char RX_ADDRESS[5]={
0x01,0x02,0x03,0x04,0x05
};
/*_________________________________*/
void nRF24L01_Config(void); // 配置函數(shù)
uchar SPI_RW(uchar byte); // 寫一個字節(jié)到24L01,同時讀出一個字節(jié)
//uchar SPI_READ_Reg(BYTE reg); // 讀出寄存器的值
uchar SPI_RW_Reg(BYTE reg, BYTE value); // 向寄存器reg寫一個字節(jié),同時返回狀態(tài)字節(jié)
uchar SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes); //nRF24L01讀出字節(jié)
uchar SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes); //nRF24L01寫入字節(jié)
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); //nRF24L01數(shù)據(jù)接收
void nRF24L01_TxPacket(unsigned char * tx_buf); //nRF24L01數(shù)據(jù)發(fā)送
bit rec_validate_end(void); //接收數(shù)據(jù)完成后進行校正處理
void set_24L01_rec_mode(void);
//void test_24l01_irq(void); //測試nRF24L01
/*-----------------------------*
公司名稱:xxxxxx
函數(shù)名稱:nRF24L01數(shù)據(jù)讀/寫
函數(shù)功能:寫一個字節(jié)到24L01,同時讀出一個字節(jié)
設(shè)計時間:
設(shè) 計 者:
------------------------------*/
uchar SPI_RW(uchar byte)
{
uchar bit_ctr;
bit_ctr=0;
for(bit_ctr=0;bit_ctr8;bit_ctr++) // output 8-bit
{
MOSI = (byte 0x80); // wait output 'byte', MSB to MOSI
byte = (byte 1); // shift next bit into MSB..
SCK = 1; // Set SCK high..
//--------------------------
MISO=1;
NOP5;
///-------------------------
byte |= MISO; // read capture current MISO bit
SCK = 0; // ..then set SCK low again
}
return(byte); // return read byte
}
/*-----------------------------*
公司名稱:xxxxxx
函數(shù)名稱:nRF24L01數(shù)據(jù)讀取
函數(shù)功能:向寄存器reg寫一個字節(jié),同時返回狀態(tài)字節(jié)
設(shè)計時間:
設(shè) 計 者:
------------------------------*/
//
uchar SPI_RW_Reg(BYTE reg, BYTE value)
{
uchar status_24L01;
status_24L01 = 0;
CSN = 0; // CSN low, init SPI transaction
status_24L01 = SPI_RW(reg); // select register 選擇通道
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again
return(status_24L01); // return nRF24L01 status byte
}
//讀數(shù)據(jù)
uchar SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)
{
uchar status_24L01,byte_ctr;
status_24L01 = 0;
byte_ctr = 0;
CSN = 0; // Set CSN low, init SPI tranaction
status_24L01 = SPI_RW(reg); // Select register to write to and read status byte
for(byte_ctr=0;byte_ctrbytes;byte_ctr++)
pBuf[byte_ctr] = SPI_RW(0); //選擇信號通道?
CSN = 1;
return(status_24L01); // return nRF24L01 status byte
}
/*-----------------------------*
公司名稱:xxxxxx
函數(shù)名稱:nRF24L01
函數(shù)功能:寫入bytes字節(jié)的數(shù)據(jù)
設(shè)計時間:
設(shè) 計 者:
------------------------------*/
uchar SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)
{
uchar status_24L01,byte_ctr;
status_24L01=0;
byte_ctr=0;
CSN = 0;
status_24L01 = SPI_RW(reg);
for(byte_ctr=0; byte_ctrbytes; byte_ctr++) //
SPI_RW(*pBuf++); //;需要發(fā)送的數(shù)據(jù)在PBUF表格里;
//;需要發(fā)送的字節(jié)數(shù)載bytes;
//對其操作的命令在reg里
CSN = 1; // Set CSN high again
return(status_24L01); //
}
/*-----------------------------*
公司名稱:xxxxxx
函數(shù)名稱:nRF24L01__set_24L01_rec_mode
函數(shù)功能:寫寄存器命令;并寄存器配置地址
設(shè)計時間:
設(shè) 計 者:
------------------------------*/
/*-----------------------------*
公司名稱:xxxxxx
函數(shù)名稱:nRF24L01 ** nRF24L01_RxPacket
函數(shù)功能:接收函數(shù),返回1表示有數(shù)據(jù)收到,否則沒有數(shù)據(jù)接受到
設(shè)計時間:
設(shè) 計 者: 測試通過
------------------------------*/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char sta,revale=0;
sta =0;
revale=0;
// set in RX mode
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // Set PWR_UP bit, enable CRC(2 bytes) Prim:RX. RX_DR enabled..
CE = 1; // Set CE pin high to enable RX device
delay_130us();
sta=SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // read register STATUS's value
//讀取nRF24L01所處于的狀態(tài)
if(sta0x40) // if receive data ready (RX_DR) interrupt 如果準(zhǔn)備接收數(shù)據(jù)則中斷1;
{
CE = 0; // stand by mode
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
// read receive payload from RX_FIFO buffer
//讀取16個字節(jié)的數(shù)據(jù)最大32BIT
revale =1;
}
SPI_RW_Reg(WRITE_REG+STATUS_24L01,sta);// clear RX_DR or TX_DS or MAX_RT interrupt flag
return revale;
}
/*-----------------------------*
公司名稱:xxxxxx
函數(shù)名稱:nRF24L01
函數(shù)功能:發(fā)送函數(shù)
設(shè)計時間:
設(shè) 計 者:
------------------------------*/
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
CE=0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 發(fā)送5個地址24l01
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // Writes data to TX payload
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // Set PWR_UP bit, enable CRC(2 bytes) Prim:TX. MAX_RT TX_DS enabled..
CE=1;
NOP20;
CE=0;
}
/*-----------------------------*
公司名稱:xxxxxx
函數(shù)名稱:nRF24L01 ** nRF24L01_Config
函數(shù)功能:配置函數(shù)
設(shè)計時間:
設(shè) 計 者:
------------------------------*/
void nRF24L01_Config(void)
{
//initial io of 24L01
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // Set PWR_UP bit, enable CRC(2 bytes) Prim:RX. RX_DR enabled..
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //Enable auto_ack Pipe0
// SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); //DISable auto_ack Pipe0
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0
SPI_RW_Reg(WRITE_REG + SETUP_AW, 0x03); // Setup address width=5 bytes
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...
SPI_RW_Reg(WRITE_REG + RF_CH, 0x02); //channel 2
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
CE=1;
}
/*------------------------------*/
bit rec_validate_end(void)
{
if(IRQ_24L01==1)return 0;
// if(nRF24L01_RxPacket(remote_buf)0x01)return (1);
else return (0);
}
void set_24L01_rec_mode(void)
{
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // Set PWR_UP bit, enable CRC(2 bytes) Prim:RX. RX_DR enabled..
RX_ADDRESS[0]=0XF0;
RX_ADDRESS[1]=0XF0;
RX_ADDRESS[2]=0XF0;
RX_ADDRESS[3]=0XF0;
RX_ADDRESS[4]=0XC0;
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS[0], TX_ADR_WIDTH);
CE = 1; // Set CE pin high to enable RX device
}
不是api.h
是winapi.h或者win32api.h之類
其實#include windows.h就有涵蓋了api中函數(shù)使用的功能
你具體想要做什么?
用純C語言寫窗口程序么?
window-api庫文件一般開發(fā)環(huán)境都會有,在其安裝目錄MFC里面就可以找到相關(guān)的
不是等于VM_ 應(yīng)該是WM_。
WM指的是WindowMessage 即windows消息。
以WM_開頭的是預(yù)定義的windows消息。
windows是基于消息驅(qū)動的操作系統(tǒng),當(dāng)程序接收到系統(tǒng)發(fā)送的消息后會做出相應(yīng)的響應(yīng)。
例如程序向窗口發(fā)送一個 WM_PAINT消息,則窗口會重新繪制。
函數(shù)名: abort
功 能: 異常終止一個進程
用 法: void abort(void);
程序例:
#include stdio.h
#include stdlib.h
int main(void)
{
printf("Calling abort()\n");
abort();
return 0; /* This is never reached */
}
函數(shù)名: abs
功 能: 求整數(shù)的絕對值
用 法: int abs(int i);
程序例:
#include stdio.h
#include math.h
int main(void)
{
int number = -1234;
printf("number: %d absolute value: %d\n", number, abs(number));
return 0;
}
函數(shù)名: absread, abswirte
功 能: 絕對磁盤扇區(qū)讀、寫數(shù)據(jù)
用 法: int absread(int drive, int nsects, int sectno, void *buffer);
int abswrite(int drive, int nsects, in tsectno, void *buffer);
程序例:
/* absread example */
#include stdio.h
#include conio.h
#include process.h
#include dos.h
int main(void)
{
int i, strt, ch_out, sector;
char buf[512];
printf("Insert a diskette into drive A and press any key\n");
getch();
sector = 0;
if (absread(0, 1, sector, buf) != 0)
{
perror("Disk problem");
exit(1);
}
printf("Read OK\n");
strt = 3;
for (i=0; i80; i++)
{
ch_out = buf[strt+i];
putchar(ch_out);
}
printf("\n");
return(0);
}
函數(shù)名: access
功 能: 確定文件的訪問權(quán)限
用 法: int access(const char *filename, int amode);
程序例:
#include stdio.h
#include io.h
int file_exists(char *filename);
int main(void)
{
printf("Does NOTEXIST.FIL exist: %s\n",
file_exists("NOTEXISTS.FIL") ? "YES" : "NO");
return 0;
}
int file_exists(char *filename)
{
return (access(filename, 0) == 0);
}
函數(shù)名: acos
功 能: 反余弦函數(shù)
用 法: double acos(double x);
程序例:
#include stdio.h
#include math.h
int main(void)
{
double result;
double x = 0.5;
result = acos(x);
printf("The arc cosine of %lf is %lf\n", x, result);
return 0;
}
函數(shù)名: allocmem
功 能: 分配DOS存儲段
用 法: int allocmem(unsigned size, unsigned *seg);
程序例:
#include dos.h
#include alloc.h
#include stdio.h
int main(void)
{
unsigned int size, segp;
int stat;
size = 64; /* (64 x 16) = 1024 bytes */
stat = allocmem(size, segp);
if (stat == -1)
printf("Allocated memory at segment: %x\n", segp);
else
printf("Failed: maximum number of paragraphs available is %u\n",
stat);
return 0;
}
函數(shù)名: arc
功 能: 畫一弧線
用 法: void far arc(int x, int y, int stangle, int endangle, int radius);
程序例:
#include graphics.h
#include stdlib.h
#include stdio.h
#include conio.h
int main(void)
{
/* request auto detection */
int gdriver = DETECT, gmode, errorcode;
int midx, midy;
int stangle = 45, endangle = 135;
int radius = 100;
/* initialize graphics and local variables */
initgraph(gdriver, gmode, "");
/* read result of initialization */
errorcode = graphresult(); /* an error occurred */
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* terminate with an error code */
}
midx = getmaxx() / 2;
midy = getmaxy() / 2;
setcolor(getmaxcolor());
/* draw arc */
arc(midx, midy, stangle, endangle, radius);
/* clean up */
getch();
closegraph();
return 0;
}
函數(shù)名: asctime
功 能: 轉(zhuǎn)換日期和時間為ASCII碼
用 法: char *asctime(const struct tm *tblock);
程序例:
#include stdio.h
#include string.h
#include time.h
int main(void)
{
struct tm t;
char str[80];
/* sample loading of tm structure */
t.tm_sec = 1; /* Seconds */
t.tm_min = 30; /* Minutes */
t.tm_hour = 9; /* Hour */
t.tm_mday = 22; /* Day of the Month */
t.tm_mon = 11; /* Month */
t.tm_year = 56; /* Year - does not include century */
t.tm_wday = 4; /* Day of the week */
t.tm_yday = 0; /* Does not show in asctime */
t.tm_isdst = 0; /* Is Daylight SavTime; does not show in asctime */
/* converts structure to null terminated
string */
strcpy(str, asctime(t));
printf("%s\n", str);
return 0;
}
函數(shù)名: asin
功 能: 反正弦函數(shù)
用 法: double asin(double x);
程序例:
#include stdio.h
#include math.h
int main(void)
{
double result;
double x = 0.5;
result = asin(x);
printf("The arc sin of %lf is %lf\n", x, result);
return(0);
}
函數(shù)名: assert
功 能: 測試一個條件并可能使程序終止
用 法: void assert(int test);
程序例:
#include assert.h
#include stdio.h
#include stdlib.h
struct ITEM {
int key;
int value;
};
/* add item to list, make sure list is not null */
void additem(struct ITEM *itemptr) {
assert(itemptr != NULL);
/* add item to list */
}
int main(void)
{
additem(NULL);
return 0;
}
函數(shù)名: atan
功 能: 反正切函數(shù)
用 法: double atan(double x);
程序例:
#include stdio.h
#include math.h
int main(void)
{
double result;
double x = 0.5;
result = atan(x);
printf("The arc tangent of %lf is %lf\n", x, result);
return(0);
}
函數(shù)名: atan2
功 能: 計算Y/X的反正切值
用 法: double atan2(double y, double x);
程序例:
#include stdio.h
#include math.h
int main(void)
{
double result;
double x = 90.0, y = 45.0;
result = atan2(y, x);
printf("The arc tangent ratio of %lf is %lf\n", (y / x), result);
return 0;
}
函數(shù)名: atexit
功 能: 注冊終止函數(shù)
用 法: int atexit(atexit_t func);
程序例:
#include stdio.h
#include stdlib.h
void exit_fn1(void)
{
printf("Exit function #1 called\n");
}
void exit_fn2(void)
{
printf("Exit function #2 called\n");
}
int main(void)
{
/* post exit function #1 */
atexit(exit_fn1);
/* post exit function #2 */
atexit(exit_fn2);
return 0;
}
函數(shù)名: atof
功 能: 把字符串轉(zhuǎn)換成浮點數(shù)
用 法: double atof(const char *nptr);
程序例:
#include stdlib.h
#include stdio.h
int main(void)
{
float f;
char *str = "12345.67";
f = atof(str);
printf("string = %s float = %f\n", str, f);
return 0;
}
函數(shù)名: atoi
功 能: 把字符串轉(zhuǎn)換成長整型數(shù)
用 法: int atoi(const char *nptr);
程序例:
#include stdlib.h
#include stdio.h
int main(void)
{
int n;
char *str = "12345.67";
n = atoi(str);
printf("string = %s integer = %d\n", str, n);
return 0;
}
函數(shù)名: atol
功 能: 把字符串轉(zhuǎn)換成長整型數(shù)
用 法: long atol(const char *nptr);
程序例:
#include stdlib.h
#include stdio.h
int main(void)
{
long l;
char *str = "98765432";
l = atol(lstr);
printf("string = %s integer = %ld\n", str, l);
return(0);
}