嵌入式以太網(wǎng)串口服務器.doc_第1頁
嵌入式以太網(wǎng)串口服務器.doc_第2頁
嵌入式以太網(wǎng)串口服務器.doc_第3頁
嵌入式以太網(wǎng)串口服務器.doc_第4頁
嵌入式以太網(wǎng)串口服務器.doc_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

VIP免費下載

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

嵌入式以太網(wǎng)串口服務器 嵌入式以太網(wǎng)串口服務器摘要:本文提出了一種以高性能微處理器Cortex-M3芯片STM32F103C8T6和以太網(wǎng)控制芯片ENC28J60為核心的轉(zhuǎn)換系統(tǒng),實現(xiàn)串口(RS232)和網(wǎng)口(RJ45)的數(shù)據(jù)通過以太網(wǎng)互發(fā),提高了傳輸數(shù)據(jù)的抗干擾性,節(jié)省了更新?lián)Q代的成本,達到了遠程控制、遠程通信的目的。1、 引言隨著Internet快速發(fā)展與普及,將一些設(shè)備聯(lián)入網(wǎng)絡已經(jīng)成為越來越多人的共識。利用基于TCP/IP的串口數(shù)據(jù)流傳輸?shù)膶崿F(xiàn)來控制管理的設(shè)備硬件,無需投資大量的人力、物力來進行管理、更換或者升級,而串口服務器是為RS-232/485/422到TCP/IP之間完成數(shù)據(jù)轉(zhuǎn)換的通訊接口轉(zhuǎn)換器。2、嵌入式以太網(wǎng)串口服務器的硬件設(shè)計本系統(tǒng)主要有三大模塊組成,分別是由微處理器芯片STM32F103C8T6構(gòu)成的MCU模塊,由網(wǎng)絡控制芯片ENC28J60與含RJ45和網(wǎng)絡變壓器的HR91105A構(gòu)成的網(wǎng)口模塊,由串口控制芯片MAX-232與RS232接口構(gòu)成的串口模塊。設(shè)備發(fā)送過來的信息通過串口模塊之后,送入MCU進行處理,然后通過網(wǎng)絡模塊發(fā)送至以太網(wǎng)進行顯示。如圖一所示為服務器的系統(tǒng)設(shè)計框圖。圖1 系統(tǒng)設(shè)計框圖2.1、MCU模塊本系統(tǒng)設(shè)計引用了嵌入式應用方面性價比高的CortexM3 STM32F103C8T6作為處理器,CortexM3類型的STM32F103C8T6處理器采用表面貼片的48管腳LQFP封裝,最高工作頻率為72MHZ,工作溫度為-40 +85。其具有提供豐富的外圍接口,包括(CAN、I2C、SPI、UART、USB等)低功耗、門數(shù)少、中斷延遲小、調(diào)試容易,支持TCP/IP 協(xié)議棧中的IP/ICMP/TCP/UDP/DHCP 等協(xié)議,動態(tài)獲取IP,支持標準socket 編程等優(yōu)點。2.2、串口模塊幾乎所有的微控制器、PC 都提供串行接口,使用電子工業(yè)協(xié)會(EIA) 推薦的RS-232-C 標準。由于RS-232-C 標準所定義的高、低電平信號與STM32F103 系統(tǒng)的LVTTL 電路所定義的高、低電平信號完全不同,所以,兩者間要進行通信必須經(jīng)過信號電平的轉(zhuǎn)換。目前我們用USB-232電平轉(zhuǎn)換芯片PL2303HX,實現(xiàn)USB轉(zhuǎn)串口的功能。本系統(tǒng)采用PH2303HX芯片和USB接口設(shè)計了一個實現(xiàn)USB轉(zhuǎn)串口接口模塊。PL2303單獨使用12MHZ晶振,這是USB必須使用的頻率,其采用模塊化電路,RXD接單片機TXD,TXD接單片機的RXD。其連接電路如圖2所示:圖2 USB轉(zhuǎn)串口電路模塊2.3、網(wǎng)口模塊ENC28J60是帶有行業(yè)標準串行外設(shè)接口(Serial Peripheral Interface,SPI)的獨立以太網(wǎng)控制器。它可以作為任何配備有SPI的控制器的以太網(wǎng)接口。ENC28J60符合IEEE 802.3的全部規(guī)范,采用一系列包過濾機制以對傳入數(shù)據(jù)包進行限制。還提供了一個內(nèi)部的DMA模塊,以實現(xiàn)快速數(shù)據(jù)吞吐和硬件支持的IP校驗和計算。與主控制器的通信通過兩個中斷引腳和SPI實現(xiàn),數(shù)據(jù)傳輸速率高達10mb/s。兩個專用的引腳用于連接LED,進行網(wǎng)絡活動狀態(tài)指示。ENC28J60總共只有28引腳,提供QFN/TF。ENC28J60典型應用電路如圖3所示: 圖3 ENC28J60典型應用電路以太網(wǎng)串口服務器網(wǎng)絡模塊采用ENC28J60作為主芯片,單芯片即可實現(xiàn)以太網(wǎng)接入,利用該模塊,基本上只要是個單片機,就可以實現(xiàn)以太網(wǎng)的連接,網(wǎng)絡模塊原理圖如圖4所示: 圖4 網(wǎng)絡模塊原理圖 3、嵌入式以太網(wǎng)串口服務器的軟件初始化3.1、uip簡介uIP 由瑞典計算機科學學院(網(wǎng)絡嵌入式系統(tǒng)小組)的Adam Dunkels 開發(fā)。其源代碼由C 語言編寫,并完全公開。uIP 協(xié)議棧去掉了完整的TCP/IP 中不常用的功能,簡化了通訊流程,但保留了網(wǎng)絡通信必須使用的協(xié)議,設(shè)計重點放在了IP/TCP/ICMP/UDP/ARP 這些網(wǎng)絡層和傳輸層協(xié)議上,保證了其代碼的通用性和結(jié)構(gòu)的穩(wěn)定性。由于uIP 協(xié)議棧專門為嵌入式系統(tǒng)而設(shè)計,因此還具有如下優(yōu)越功能:1) 代碼非常少,其協(xié)議棧代碼不到6K,很方便閱讀和移植。2) 占用的內(nèi)存數(shù)非常少,RAM 占用僅幾百字節(jié)。3) 其硬件處理層、協(xié)議棧層和應用層共用一個全局緩存區(qū),不存在數(shù)據(jù)的拷貝,且發(fā)送和接收都是依靠這個緩存區(qū),極大的節(jié)省空間和時間。4) 支持多個主動連接和被動連接并發(fā)。5) 其源代碼中提供一套實例程序:web 服務器,web 客戶端,電子郵件發(fā)送程序(SMTP 客戶端),Telnet 服務器, DNS 主機名解析程序等。通用性強,移植起來基本不用修改就可以通過。6) 對數(shù)據(jù)的處理采用輪循機制,不需要操作系統(tǒng)的支持。由于uIP 對資源的需求少和移植容易,大部分的8 位微控制器都使用過uIP協(xié)議棧, 而且很多的著名的嵌入式產(chǎn)品和項目(如衛(wèi)星,Cisco 路由器,無線傳感器網(wǎng)絡)中都在使用uIP 協(xié)議棧。uIP相當于一個代碼庫,通過一系列的函數(shù)實現(xiàn)與底層硬件和高層應用程序的通訊,對于整個系統(tǒng)來說它內(nèi)部的協(xié)議組是透明的,從而增加了協(xié)議的通用性。uIP協(xié)議棧與系統(tǒng)底層和高層應用之間的關(guān)系如圖5所示: 圖5 uip在系統(tǒng)中的位置從上圖可以看出,uIP 協(xié)議棧主要提供2 個函數(shù)供系統(tǒng)底層調(diào)用:uip_input 和uip_periodic。另外和應用程序聯(lián)系主要是通過UIP_APPCALL 函數(shù)。當網(wǎng)卡驅(qū)動收到一個輸入包時,將放入全局緩沖區(qū)uip_buf 中,包的大小由全局變量uip_len約束。同時將調(diào)用uip_input()函數(shù),這個函數(shù)將會根據(jù)包首部的協(xié)議處理這個包和需要時調(diào)用應用程序。當uip_input()返回時,一個輸出包同樣放在全局緩沖區(qū)uip_buf 里,大小賦給uip_len。如果uip_len 是0,則說明沒有包要發(fā)送。否則調(diào)用底層系統(tǒng)的發(fā)包函數(shù)將包發(fā)送到網(wǎng)絡上。uIP 周期計時是用于驅(qū)動所有的uIP 內(nèi)部時鐘事件。當周期計時激發(fā),每一個TCP 連接都會調(diào)用uIP 函數(shù)uip_periodic()。類似于uip_input()函數(shù)。uip_periodic()函數(shù)返回時,輸出的IP 包要放到uip_buf 中,供底層系統(tǒng)查詢uip_len 的大小發(fā)送。由于使用 TCP/IP 的應用場景很多,因此應用程序作為單獨的模塊由用戶實現(xiàn)。uIP 協(xié)議棧提供一系列接口函數(shù)供用戶程序調(diào)用,其中大部分函數(shù)是作為C 的宏命令實現(xiàn)的,主要是為了速度、代碼大小、效率和堆棧的使用。用戶需要將應用層入口程序作為接口提供給uIP 協(xié)議棧, 并將這個函數(shù)定義為宏UIP_APPCALL()。這樣,uIP 在接受到底層傳來的數(shù)據(jù)包后,在需要送到上層應用程序處理的地方,調(diào)用UIP_APPCALL( )。在不用修改協(xié)議棧的情況下可以適配不同的應用程序。3.2、程序設(shè)計本系統(tǒng)要實現(xiàn)TCP/IP 通信,還要實現(xiàn)和串口交換數(shù)據(jù),因此我們采用輪詢的方式,第一次調(diào)用輪詢函數(shù)的時候創(chuàng)建兩個定時器,當收到包的時候(uip_len0),先區(qū)分是IP包還是ARP包,針對不同的包做不同的處理,對我們來說,主要是通過uip_input處理IP包,實現(xiàn)數(shù)據(jù)處理。當沒有收到包的時候(uip_len=0),通過定時器處理各個TCP/UDP連接以及ARP表處理。其輪詢處理函數(shù)為:/uip事件處理函數(shù)/必須將該函數(shù)插入用戶主循環(huán),循環(huán)調(diào)用.void uip_polling(void)u8 i;static struct timer periodic_timer, arp_timer;static u8 timer_ok=0; if(timer_ok=0)/僅初始化一次timer_ok = 1;timer_set(&periodic_timer,CLOCK_SECOND/2); /創(chuàng)建1個0.5秒的定時器 timer_set(&arp_timer,CLOCK_SECOND*10); /創(chuàng)建1個10秒的定時器 uip_len=tapdev_read();/讀取一個IP包,數(shù)據(jù)長度.uip_len在uip.c中定義if(uip_len0) /有數(shù)據(jù) /處理IP數(shù)據(jù)包(只有校驗通過的IP包才會被接收) if(BUF-type = htons(UIP_ETHTYPE_IP)/是否是IP包? uip_arp_ipin();/去除以太網(wǎng)頭結(jié)構(gòu),更新ARP表uip_input(); /IP包處理/當上面的函數(shù)執(zhí)行后,如果需要發(fā)送數(shù)據(jù),則全局變量 uip_len 0/需要發(fā)送的數(shù)據(jù)在uip_buf, 長度是uip_len (這是2個全局變量) if(uip_len0)/需要回應數(shù)據(jù)uip_arp_out();/加以太網(wǎng)頭結(jié)構(gòu),主動連接時可能要構(gòu)造ARP請求tapdev_send();/發(fā)送數(shù)據(jù)到以太網(wǎng)else if (BUF-type=htons(UIP_ETHTYPE_ARP)/處理arp報文,是否是ARP請求包?uip_arp_arpin(); /當上面的函數(shù)執(zhí)行后,如果需要發(fā)送數(shù)據(jù),則全局變量uip_len0/需要發(fā)送的數(shù)據(jù)在uip_buf, 長度是uip_len(這是2個全局變量) if(uip_len0)tapdev_send();/需要發(fā)送數(shù)據(jù),則通過tapdev_send發(fā)送 else if(timer_expired(&periodic_timer)/0.5秒定時器超時timer_reset(&periodic_timer);/復位0.5秒定時器 /輪流處理每個TCP連接, UIP_CONNS缺省是40個 for(i=0;i0/需要發(fā)送的數(shù)據(jù)在uip_buf, 長度是uip_len (這是2個全局變量) if(uip_len0)uip_arp_out();/加以太網(wǎng)頭結(jié)構(gòu),主動連接時可能要構(gòu)造ARP請求tapdev_send();/發(fā)送數(shù)據(jù)到以太網(wǎng)#if UIP_UDP/UIP_UDP /輪流處理每個UDP連接, UIP_UDP_CONNS缺省是10個for(i=0;i0/需要發(fā)送的數(shù)據(jù)在uip_buf, 長度是uip_len (這是2個全局變量)if(uip_len 0)uip_arp_out();/加以太網(wǎng)頭結(jié)構(gòu),主動連接時可能要構(gòu)造ARP請求tapdev_send();/發(fā)送數(shù)據(jù)到以太網(wǎng)#endif /每隔10秒調(diào)用1次ARP定時器函數(shù) 用于定期ARP處理,ARP表10秒更新一次,舊的條目會被拋棄if(timer_expired(&arp_timer)timer_reset(&arp_timer);uip_arp_timer();TCP應用接口函數(shù):/TCP應用接口函數(shù)(UIP_APPCALL)/完成TCP服務(包括server和client)和HTTP服務void tcp_demo_appcall(void) switch(uip_conn-lport)/本地監(jiān)聽端口80和1200 case HTONS(80):httpd_appcall(); break;case HTONS(1200): tcp_server_demo_appcall(); break;default: break; switch(uip_conn-rport)/遠程連接1400端口 case HTONS(1400):tcp_client_demo_appcall(); break; default: break; 除此之外,我們需要對串口進行初始化,并建立相應的串口程序文件,便于其它函數(shù)的調(diào)用,實現(xiàn)串口上數(shù)據(jù)的交換。串口函數(shù)初始化:void uart_init(u32 bound) /GPIO端口設(shè)置 GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);/使能USART1,GPIOA時鐘以及復用功能時鐘 /USART1_TX PA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;/復用推挽輸出 GPIO_Init(GPIOA, &GPIO_InitStructure); /USART1_RX PA.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/浮空輸入 GPIO_Init(GPIOA, &GPIO_InitStructure); /Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;/搶占優(yōu)先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;/子優(yōu)先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/IRQ通道使能NVIC_Init(&NVIC_InitStructure);/根據(jù)指定的參數(shù)初始化VIC寄存器 /USART 初始化設(shè)置USART_InitStructure.USART_BaudRate = bound;/一般設(shè)置為9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;/字長為8位數(shù)據(jù)格式USART_InitStructure.USART_StopBits = USART_StopBits_1;/一個停止位USART_InitStructure.USART_Parity = USART_Parity_No;/無奇偶校驗位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;/無硬件數(shù)據(jù)流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;/收發(fā)模式 USART_Init(USART1, &USART_InitStructure); /初始化串口 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);/開啟中斷 USART_Cmd(USART1, ENABLE); /使能串口 主函數(shù)的實現(xiàn)是對整個嵌入式以太網(wǎng)串口服務器的統(tǒng)籌管理,實現(xiàn)系統(tǒng)的有序整合和運行。其主函數(shù)為:int main(void) delay_init(); /延時函數(shù)初始化 NVIC_Configuration(); /NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級uart_init(9600); /串口初始化為9600RTC_Init();/初始化RTC while(tapdev_init()/初始化ENC28J60 如果初始化失敗,就會死在這里 delay_ms(200);;uip_init();/uIP初始化 uip_ipaddr(ipaddr, 192,168,1,105);/設(shè)置本地設(shè)置IP地址 uip_sethostaddr(ipaddr); uip_ipaddr(ipaddr, 192,168,1,1); /網(wǎng)關(guān)IP地址(其實就是你路由器的IP地址)uip_setdraddr(ipaddr); uip_ipaddr(ipaddr, 255,255,255,0);/設(shè)置網(wǎng)絡掩碼uip_setnetmask(ipaddr);uip_listen(HTONS(80);/監(jiān)聽80端口,用于Web Serveruip_listen(HTONS(1200);/監(jiān)聽1200端口,用于TCP Server tcp_client_connect(); /嘗試連接到TCP Server端,用于TCP Client udp_server_connect();/嘗試連接到UDP Client端,用于UDP Server 端口1600 udp_client_connect();/嘗試連接到UDP Server端,用于UDP Client 端口1500 while (1)uip_polling();/處理uip事件,必須插入到用戶程序的循環(huán)體中 if(uip_test_mode=0)/TCP測試if(tcp_server_tsta!=tcp_server_sta)/TCP Server狀態(tài)改變 if(tcp_server_sta&(16)/收到新數(shù)據(jù)printf(TCP Server RX:%srn,tcp_server_databuf);/打印tcp_server_sta&=(16);/標記數(shù)據(jù)已經(jīng)被處理tcp_server_tsta=tcp_server_sta;if(tcp_client_tsta!=tcp_client_sta)/TCP Client狀態(tài)改變 if(tcp_client_sta&(16)/收到新數(shù)據(jù)printf(TCP Client RX:%srn,tcp_client_databuf);/打印tcp_client_sta&=(16);/標記數(shù)據(jù)已經(jīng)被處理tcp_client_tsta=tcp_client_sta;else/UDP測試if(udp_server_sta&(16)/收到新數(shù)據(jù)printf(TCP Server RX:%srn,udp_server_databuf);/打印數(shù)據(jù)udp_server_sta&=(16);/標記數(shù)據(jù)已經(jīng)被處理if(udp_client_sta&(16)/收到新數(shù)據(jù)printf(UDP Client RX:%srn,udp_client_databuf);/打印數(shù)據(jù)udp_client_sta&=(16);/標記數(shù)據(jù)已經(jīng)被處理if(FLAG1)/TCP/UDP模式切換if(uip_test_mode=0)tcp_server_tsta=0XFF;tcp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論