亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? client.c

?? LWIP在STM32裸機上的移植
?? C
字號:
#include "client.h"

const u8 UDP_Data[] = "This is the lwIP example about UDP client.\r\n";

/*ADC為12位模數轉換器,只有ADCConvertedValue的低12位有效*/ 
__IO uint32_t ADCConvertedValue;

u16 ADCConvertedValueLocal1,ADCConvertedValueLocal2;

u16 Voltage[2]={0};		//保存ADC轉換的電壓值(4位整數值)

u8 Data[8]={0};			//保存轉換后的ASCII字符
u8 Data1[8]={0}; 		//發送的數據(ADC1轉換值)
u8 Data2[8]={0};		//發送的數據(ADC2轉換值)

u8 zifu[] = "V\r\n";
u8 divstr[] = "----------\r\n";


struct ip_addr destAddr;	//遠程主機IP地址

/******************************************************************************
** Function name:      mux_n
** Descriptions:       計算10的n次冪,n要大于等于0
** input parameters:    n : 10的n次冪
** output parameters:  sum: 返回運算后的結果
** Returned value:     無   
******************************************************************************/
u32 mux_n (u8  n)
{
    u8  i;
    u32 sum = 10;
    for (i = 1; i < n; i++) 
        sum = sum * 10;

    if (n == 0) sum = 1;

    return sum;
}

/******************************************************************************
** Function name:      Data_ASICC
** Descriptions:       將一個最大值四位的整數轉換為字符串
** input parameters:   charge_data: 要轉換的3位整數
** output parameters:  無
** Returned value:     無   
******************************************************************************/
void Data_ASICC (u16 charge_data)
{
    u8  i,index = 0;
    u16 ulchar, temp;
    for (i = 0; i < 4; i++) 
	{
        ulchar = charge_data / (mux_n(3 - i)) % 10 + '0';   //取出最高位
        Data[index++] = ulchar;
        if (i == 0)                                                  				   
        	Data[index++]='.'; 								//小數點                            

        ulchar  = (ulchar - '0');                         	//下面四條語句是將最高位消除,為下次再取一個最高位做準備
              
        temp    = (mux_n(3 - i));
        ulchar  = ulchar * temp;
        
		charge_data = charge_data - ulchar;
    }
	Data[index++] = 'V';
	Data[index++] = '\r';
	Data[index] = '\n';
}

/******************************************************************************
** Function name:      HexToASCII
** Descriptions:       將二進制數轉換成ASCII字符
** input parameters:   data: 要轉換的整數
** output parameters:  無
** Returned value:     無   
******************************************************************************/
void HexToASCII(u16 data)
{
	Data[0] = data/1000%10 + 0x30;
	Data[1] = '.';
	Data[2] = data/100%10 + 0x30;
	Data[3] = data/10%10 + 0x30; 
	Data[4] = data%10 + 0x30;
	Data[5] = 'V';
	Data[6] = '\r';
	Data[7] = '\n';	  
}

//復制字符數組的內容
void data_cpy(u8 *dest, u8 *src)
{
  u8 i = 0;
  for(i = 0;i < 8;i++)
  {
    dest[i] = src[i];          
  }
}

void Get_ADC_Data(void)
{
	ADCConvertedValueLocal1 = (ADCConvertedValue&0x00000fff);
	Voltage[0] = (ADCConvertedValueLocal1*3300/4096);   		//PC0電壓值	//將電壓值*1000,保存成整數   

	ADCConvertedValueLocal2 = ((ADCConvertedValue>>16)&0x00000fff);
	Voltage[1] = (ADCConvertedValueLocal2*3300/4096);   		//PC1電壓值	//0x1000	
   
	Delay(200000);               //原來的延時參數為8000000
}

//注意,ADC采樣后的VOLTAGE已經是一個四位數,可以直接轉換為ASIIC碼輸出
void Turn_ADC_Data(void)
{
	HexToASCII(Voltage[0]);
//	Data_ASICC(Voltage[0]);		//PC0電壓值  
    data_cpy(Data1,Data);

	HexToASCII(Voltage[1]);                		
//	Data_ASICC(Voltage[1]);		//PC1電壓值    
	data_cpy(Data2,Data);
	    
	Delay(500000);
}

void ADC_Configuration(void)
{  	
	ADC_InitTypeDef ADC_InitStructure;
	DMA_InitTypeDef DMA_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;

	/* 使能DMA時鐘*/
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

	/* 使能ADC1、ADC2和GPIOC端口*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 | RCC_APB2Periph_GPIOC, ENABLE);
	
	/* 配置PC0作為ADC的模擬量輸入,作為ADC通道1的模擬通道10 */  
  	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_3;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  	GPIO_Init(GPIOC, &GPIO_InitStructure);
  
	/* DMA1通道1參數配置*/
	DMA_DeInit(DMA1_Channel1);/*失能DMA1通道1*/
  
	DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;			/*指定DMA的外設地址為ADC1的數據寄存器地址*/
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;/*指定DMA的內存基地址*/
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;					/*外設作為數據傳輸來源*/
	DMA_InitStructure.DMA_BufferSize = 2;								/*2個數據單位,即32位*/
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;	/*外設地址寄存器不變*/
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;			/*內存地址寄存器不變*/
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;	/*數據寬度為字,16位*/
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;		/*設定外設數據寬度*/
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;						/*工作在循環緩存模式*/
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;					/*DMAx通道擁有高優先級*/
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;						/*DMAx通道沒有設置為內存到內存傳輸*/
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  
	/*使能DMA1通道1*/
	DMA_Cmd(DMA1_Channel1, ENABLE);
  
	/*ADC1配置*/
	ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;					/*ADC工作在同步規則模式*/
	ADC_InitStructure.ADC_ScanConvMode = ENABLE;						/*掃描模式*/
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;					/*連續模式*/
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	/*軟件啟動*/
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;				/*數據右對齊*/
	ADC_InitStructure.ADC_NbrOfChannel = 1;								/*一個ADC通道進行規則轉換*/
	ADC_Init(ADC1, &ADC_InitStructure);
	ADC_Init(ADC2, &ADC_InitStructure);

	/* 設置ADC1的采樣順序和轉換時間*/ 
	ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);	//PC0

	/*使能ADC1的DMA請求*/
	ADC_DMACmd(ADC1, ENABLE);

	/*使能ADC1*/
	ADC_Cmd(ADC1, ENABLE);

	/*使能ADC1重置校準寄存器*/   
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1));

	/*開始指定ADC1的校準狀態*/
	ADC_StartCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1));     

	/* ADC1軟轉換開始*/ 
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  
	/*ADC2的配置*/
	ADC_RegularChannelConfig(ADC2, ADC_Channel_13, 1, ADC_SampleTime_71Cycles5);	//PC3
	
	ADC_DMACmd(ADC2, ENABLE);
	ADC_Cmd(ADC2, ENABLE);
	
	ADC_ResetCalibration(ADC2);
	while(ADC_GetResetCalibrationStatus(ADC2));
	
	ADC_StartCalibration(ADC2);
	while(ADC_GetCalibrationStatus(ADC2));
	
	/* ADC2軟轉換開始*/
	ADC_SoftwareStartConvCmd(ADC2, ENABLE);
}

/**
  * @brief  Initialize the UDP client and then UDP server application.
  * @param  None
  * @retval None
  */
void client_init(void)
{
	struct udp_pcb *upcb;
	struct pbuf *p;

//	p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_RAM);
	p = pbuf_alloc(PBUF_TRANSPORT, sizeof(UDP_Data), PBUF_RAM);
	p->payload = (void *)UDP_Data;
                                  
	/* Create a new UDP control block  */
	upcb = udp_new(); 

	/* Bind the upcb to the UDP_PORT port */
	/* Using IP_ADDR_ANY allow the upcb to be used by any local interface */	
	udp_bind(upcb,IP_ADDR_ANY,UDP_CLIENT_PORT);  //STM32_UDP客戶端的端口:121
   
	/* Connect the upcb  */
	udp_connect(upcb, IP_ADDR_BROADCAST, UDP_SERVER_PORT); //IP_ADDR_BROADCAST : 0xffffffffUL (上位機UDP服務器端口:120)	

	/* Send out an UDP datagram to inform the server that we have strated a client application */
	udp_send(upcb, p); 
	udp_send(upcb, p);
	udp_send(upcb, p);			//連續發送三次  

	/* Reset the upcb */
	udp_disconnect(upcb);
   
	/* Bind the upcb to any IP address and the UDP_PORT port*/
	/* Using IP_ADDR_ANY allow the upcb to be used by any local interface */
	udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);  //原來是UDP_CLIENT_PORT (STM32_UDP服務器的端口:120)
   
	/* Set a receive callback for the upcb */
	udp_recv(upcb, udp_server_callback, NULL);

	/* Free the p buffer */
	pbuf_free(p); 
}

/**
  * @brief This function is called when an UDP datagrm has been received on the port UDP_PORT.
  * @param arg : user supplied argument (udp_pcb.recv_arg)
  * @param upcb: the udp_pcb which received data
  * @param p   : the packet buffer that was received
  * @param addr: the remote IP address from which the packet was received
  * @param port: the remote port from which the packet was received
  * @retval None
  */
void udp_server_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
{
	__IO uint8_t iptab[4];
	uint8_t iptxt[20];

	destAddr = *addr;	//獲得遠程主機的IP地址(STM32的TCP客戶端和遠程主機連接時需要)
    
	/* Read the Client's IP address */
	iptab[0] = (uint8_t)((uint32_t)(addr->addr) >> 24);  
	iptab[1] = (uint8_t)((uint32_t)(addr->addr) >> 16);
	iptab[2] = (uint8_t)((uint32_t)(addr->addr) >> 8);
	iptab[3] = (uint8_t)((uint32_t)(addr->addr));

	sprintf((char*)iptxt, "%d.%d.%d.%d", iptab[3], iptab[2], iptab[1], iptab[0]);

  	/* Display the client's IP address */
  	/* If there is more than one client connected, the IP address of the last one connected will be displayed */
	printf("The client port : %d\n",port);    
	printf("The client IP address : %s\n",iptxt);

  	/* Connect to the remote client */
  	udp_connect(upcb, addr, port);
    
  	/* Tell the client that we have accepted it */
  	udp_send(upcb, p);

//	udp_sendto(upcb,p,addr,port);		//用此函數,UDP客戶端為什么收不到數據呢?!

	GPIOD->ODR ^= GPIO_Pin_4;			//LED3閃爍(表示STM32的UDP客戶端接收到數據)

  	/* free the UDP connection, so we can accept new clients */
  	udp_disconnect(upcb);

	/* Free the p buffer */
	pbuf_free(p);
}

void TCP_Client_Init(void)
{
	struct tcp_pcb *pcb;
//	struct ip_addr destAddr;
  
//	IP4_ADDR(&destAddr,192,168,4,123);		//1.指定遠程主機IP地址;  2.通過接收UDP客戶端數據包,獲取遠程主機IP地址

	/* Create a new TCP control block  */
	pcb = tcp_new();

	/* Assign to the new pcb a local IP address and a port number */
	tcp_bind(pcb, IP_ADDR_ANY, TCP_PORT);

	/* Connect to the server: send the SYN */
	tcp_connect(pcb, &destAddr, TCP_PORT, tcp_client_connected);
}

/*與遠程服務器建立連接時調用*/
err_t tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
{
	tcp_write(tpcb,Data1,sizeof(Data1),0);
//	tcp_write(tpcb,zifu,sizeof(zifu),0);

	tcp_write(tpcb,Data2,sizeof(Data2),0);
//	tcp_write(tpcb,zifu,sizeof(zifu),0); 

	tcp_write(tpcb,divstr,sizeof(divstr),0);
	  
	tcp_close(tpcb);
   
	return ERR_OK;
}
//疑問:在STM32上建立TCP客戶端,向遠程主機(TCP服務器)發送連接請求。當連接正確時,
//      調用此回調函數發送數據,發送完畢關閉連接。
//		一次調用回調函數為什么無法發送多個字符串?即遇到字符串結束符號'\0',便終
//		止了后續tcp_write() 函數發送的內容。
//解決:sizeof(Data)求字符串的長度,包括了字符串結束符\0';
//		strlen(Data)求字符串的長度,指字符串的實際長度。
//程序中用 tcp_write(tpcb,Data,strlen(Data),0);	便解決此問題。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美无人高清视频在线观看| 欧美中文字幕久久| 欧美日韩卡一卡二| 精品国产欧美一区二区| 国产在线一区二区综合免费视频| 91精品国产综合久久久久久| 美女www一区二区| 国产性色一区二区| 在线观看av一区二区| 久久精品亚洲一区二区三区浴池| 成人综合激情网| 国产精品国产自产拍高清av| 色婷婷久久久久swag精品| 亚洲香蕉伊在人在线观| 日韩一区二区在线免费观看| 国产在线精品一区二区三区不卡| 久久久青草青青国产亚洲免观| 97精品久久久午夜一区二区三区 | 三级在线观看一区二区| 91精品国产aⅴ一区二区| 色老汉一区二区三区| 激情亚洲综合在线| 亚洲国产wwwccc36天堂| 一区二区视频免费在线观看| 国产性天天综合网| 国产欧美日韩综合| 欧美日韩一卡二卡三卡| 在线免费观看一区| 一本到不卡精品视频在线观看| 美女视频黄免费的久久| 日韩欧美综合在线| 国产乱码精品一区二区三| 日韩毛片高清在线播放| 欧美性猛交xxxxxxxx| 老司机午夜精品| 国产精品久久久久久久久图文区| 欧美性猛交xxxx乱大交退制版| 久久国产精品色| 国产精品综合av一区二区国产馆| 国内精品写真在线观看| 亚洲伦在线观看| 国产欧美一区二区精品忘忧草 | 日韩欧美二区三区| 91视视频在线观看入口直接观看www| 一区二区三区中文在线观看| 欧美丰满一区二区免费视频| 欧美三级蜜桃2在线观看| 69精品人人人人| 中文字幕一区日韩精品欧美| 欧美丰满一区二区免费视频| 一本色道久久综合亚洲91| 99在线热播精品免费| 成人不卡免费av| 国产福利精品一区| 东方aⅴ免费观看久久av| 色诱亚洲精品久久久久久| 色吊一区二区三区| 麻豆成人免费电影| 91色在线porny| 日韩欧美一级特黄在线播放| 日韩精品在线网站| 日韩精品一区二区三区swag| 在线成人免费观看| 日韩欧美一二三四区| 2023国产精华国产精品| 日韩一区二区精品葵司在线| jiyouzz国产精品久久| 欧美久久久一区| 国产午夜精品一区二区三区视频 | 91麻豆免费观看| 91九色最新地址| 精品国产人成亚洲区| 亚洲五月六月丁香激情| 婷婷综合久久一区二区三区| 国产91综合一区在线观看| 欧洲激情一区二区| 国产精品久久午夜夜伦鲁鲁| 美女在线视频一区| 99免费精品在线| 日韩欧美一二区| 亚洲一区成人在线| 成人黄色免费短视频| 精品国产免费一区二区三区四区 | 色域天天综合网| 五月婷婷久久丁香| 91精品国产综合久久久久| 日韩电影免费一区| 久久久久久久久久美女| 欧美亚洲尤物久久| 亚洲最新视频在线播放| 欧美亚州韩日在线看免费版国语版| 午夜欧美在线一二页| 精品少妇一区二区三区在线播放 | 色婷婷激情综合| 亚洲一区在线视频| 91麻豆精品国产91久久久久久 | 欧美精品v日韩精品v韩国精品v| 久久99国产精品久久| 久久久综合网站| 欧美视频自拍偷拍| 成人三级伦理片| 国产在线精品一区二区不卡了| 五月激情综合色| 成人欧美一区二区三区视频网页 | 一本一本大道香蕉久在线精品| 亚洲成人久久影院| 色88888久久久久久影院野外| 男女性色大片免费观看一区二区 | 国产精品美女久久福利网站| 国产精品一区二区在线观看不卡 | 丁香婷婷综合网| 久久99热狠狠色一区二区| 亚洲综合色视频| 亚洲欧美成人一区二区三区| 欧美一级久久久久久久大片| 国产综合久久久久久久久久久久| 日韩欧美高清一区| 在线观看国产精品网站| 波多野结衣中文字幕一区二区三区| 国产福利不卡视频| 99国产一区二区三精品乱码| 99精品热视频| 在线播放国产精品二区一二区四区| 日本精品一区二区三区四区的功能| 国产精品18久久久久久vr| 五月开心婷婷久久| 亚洲图片欧美视频| 亚洲乱码国产乱码精品精的特点 | 一区二区三区高清| 久久久久久**毛片大全| 久久久久久免费| 国产亚洲午夜高清国产拍精品| 欧美zozozo| 中文字幕乱码亚洲精品一区| 亚洲色欲色欲www在线观看| 精品国产一区二区亚洲人成毛片 | 高清beeg欧美| 成人久久18免费网站麻豆| 99re热这里只有精品视频| 777欧美精品| 国产欧美一区在线| 欧美国产乱子伦| 国产精品久久久久影院亚瑟| 日韩av电影免费观看高清完整版在线观看| 国精产品一区一区三区mba视频| 成人丝袜高跟foot| 日韩天堂在线观看| 一区二区三区免费网站| 国产一区二区三区四区在线观看| 91麻豆高清视频| 亚洲国产精品二十页| 奇米一区二区三区av| 欧美日韩精品一区二区三区蜜桃 | 成人黄色免费短视频| 欧美猛男男办公室激情| 国产欧美一区二区三区在线看蜜臀| 樱桃国产成人精品视频| av不卡在线播放| 国产精品不卡在线观看| 国产精品自在在线| 国产欧美精品一区二区色综合朱莉| 强制捆绑调教一区二区| 中文字幕av一区二区三区免费看 | 精品精品国产高清一毛片一天堂| 亚洲女同一区二区| 91看片淫黄大片一级在线观看| 国产精品天干天干在线综合| 91一区二区在线| 久久在线观看免费| 狠狠色丁香久久婷婷综| 精品99一区二区| 成人一区在线看| 亚洲综合色视频| 久久网站热最新地址| 99在线热播精品免费| 奇米亚洲午夜久久精品| 欧美激情一区在线| 欧美亚洲综合在线| 国产成人在线视频网址| 亚洲综合清纯丝袜自拍| 国产日产欧美一区二区视频| 欧洲人成人精品| 国产99一区视频免费| 婷婷开心久久网| 日本一区二区高清| 日韩欧美三级在线| 欧美色偷偷大香| 日本丶国产丶欧美色综合| 国内国产精品久久| 日韩专区欧美专区| 亚洲一区成人在线| 夜夜嗨av一区二区三区| 国产精品久久久久久妇女6080| 91精品国产91热久久久做人人| 91福利在线免费观看| 99久久精品免费观看| 91麻豆精品在线观看| 91在线国产福利| 99久久精品免费看国产免费软件| 国产精品一区免费在线观看|