<abbr id="kc8ii"><menu id="kc8ii"></menu></abbr>
  • <input id="kc8ii"><tbody id="kc8ii"></tbody></input><table id="kc8ii"><source id="kc8ii"></source></table><kbd id="kc8ii"></kbd>
    <center id="kc8ii"><table id="kc8ii"></table></center>
  • <input id="kc8ii"></input>
    <abbr id="kc8ii"></abbr>
  • <abbr id="kc8ii"></abbr>
  • <center id="kc8ii"><table id="kc8ii"></table></center>
    <abbr id="kc8ii"></abbr>
    你的位置:首頁 > RF/微波 > 正文

    可視化WIFI遙控搬運機器人之服務(wù)器搭建

    發(fā)布時間:2015-02-23 責任編輯:sherryyu

    【導(dǎo)讀】本設(shè)計主要研究基于WIFI網(wǎng)絡(luò)的可視化無線遙控搬運機器人,利用WIFI網(wǎng)絡(luò)高速傳輸實時視頻圖像采集,通過機器人安裝的傳感器實現(xiàn)數(shù)據(jù)采集。采用WIFI網(wǎng)絡(luò)通訊使得控制端多樣化,可用手機,電腦等具備WIFI功能的設(shè)備進行控制。這里主要講解可視化WIFI遙控搬運機器人之服務(wù)器搭建。
     
    可視化WIFI遙控搬運機器人之硬件部分設(shè)計
    http://www.77uud.com/rf-art/80025732
     
    本設(shè)計主要研究基于WIFI網(wǎng)絡(luò)的可視化無線遙控搬運機器人,利用WIFI網(wǎng)絡(luò)高速傳輸實時視頻圖像采集,通過機器人安裝的傳感器實現(xiàn)數(shù)據(jù)采集。采用WIFI網(wǎng)絡(luò)通訊使得控制端多樣化,可用手機,電腦等具備WIFI功能的設(shè)備進行控制。此外,還可將機器人接入Internet實現(xiàn)更遠距離的控制。本設(shè)計在S3C6410平臺上移植了Linux操作系統(tǒng)用于接收命令并對硬件設(shè)備進行控制,其中移植了MJPGstreamer作為視頻服務(wù)器,移植了BOA服務(wù)器作為WEB服務(wù)器。本文將從硬件設(shè)計,驅(qū)動程序編寫,服務(wù)器移植,服務(wù)程序編寫,Android應(yīng)用程序編寫,Web應(yīng)用程序編寫等方面來講述本設(shè)計的功能實現(xiàn)。
    功能框圖
    功能框圖
     
    總體設(shè)計及硬件選型和電路部分:可視化WIFI遙控搬運機器人(1):硬件部分
     
    3 服務(wù)器搭建
     
    3.1 服務(wù)器端功能框圖
    服務(wù)器端功能框圖
    圖3-1 服務(wù)器端功能框圖
     
    3.2 Linux系統(tǒng)移植
     
    核心板采用友善之臂公司提供的TINY6410,此核心板已提供Bootloader,Linux系統(tǒng),文件系統(tǒng)。使用時只需要根據(jù)實際的需要裁減Linux系統(tǒng)即可,本設(shè)計采用的Linux內(nèi)核版本為Linux2.6.38,編譯平臺為Ubuntu12.04,交叉編譯器為arm-linux-gcc-4.5.1。
     
    3.3 驅(qū)動編寫與移植
     
    3.3.1 直流電機驅(qū)動
     
    由于S3C6410只帶有2路PWM輸出,而夾持器部分需要兩路PWM脈寬調(diào)制控制伺服舵機,因此直流電機部分采用定時器2來模擬PWM調(diào)制。設(shè)置定時器2每100ms進一次中斷,在定時器中進行1~100計數(shù),因此PWM周期為10S,并有100個脈寬比可調(diào),滿足直流電機調(diào)速控制。
    [page]
    3.3.2 伺服電機驅(qū)動
     
    伺服電機需要采用脈寬調(diào)制,通過調(diào)節(jié)20ms周期內(nèi)的占空比可以指定伺服電機的旋轉(zhuǎn)角度,其對應(yīng)關(guān)系如下表:
    伺服電機占空比與旋轉(zhuǎn)角度的對應(yīng)關(guān)系
    表3-1 伺服電機占空比與旋轉(zhuǎn)角度的對應(yīng)關(guān)系
     
    由于舵機的控制要求較高,本設(shè)計采用S3C6410自帶的PWM進行控制.。設(shè)置PWM0和PWM1的周期為20ms,通過調(diào)節(jié)PWM0和PWM1的占空比來控制伺服電機進行工作。
     
    3.3.3 攝像頭驅(qū)動
     
    ZC301為免驅(qū)的UVC視頻設(shè)備,為了實現(xiàn)視頻的采集需要在編譯內(nèi)核時選擇上V4L2支持。
     
    3.3.4 USB WIFI 驅(qū)動
     
    本設(shè)計中采用的這款USB無線網(wǎng)卡采用RTL8188芯片,為使該設(shè)備能夠正常工作需要進行驅(qū)動程序移植。
     
    ①從RTL官網(wǎng)獲得RTL8188的最新驅(qū)動程序,本文采用的是RTL819xSU_usb_linux_v2.6.6.0.20120405.tar.gz。
     
    ②在Ubuntu中利用命令tar -zxvf 將驅(qū)動包解壓。
     
    ③進入驅(qū)動目錄并修改Makefile
     
    ④由于驅(qū)動默認移植平臺是I386_PC,而我們需要將其移植到S3C平臺上,故需要做如下修改:
     
    說明目標平臺:
     
    將:CONFIG_PLATFORM_I386_PC = y
     
    改為:CONFIG_PLATFORM_I386_PC = n
     
    將:CONFIG_PLATFORM_ARM_S3C = n
     
    改為:CONFIG_PLATFORM_ARM_S3C = y
     
    指定交叉編譯器以及內(nèi)核路徑信息:
     
    ifeq ($(CONFIG_PLATFORM_ARM_S3C), y)
     
    EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
     
    ARCH := arm
     
    CROSS_COMPILE := /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-
     
    KVER := 2.6.48_$(ARCH)
     
    KSRC := /root/tiny6410/linux-2.6.38
     
    Endif
     
    ⑤執(zhí)行Make命令得到8712u.ko即為所需驅(qū)動,將該文件移動到目標平臺加載即完成了USB WIFI驅(qū)動程序的移植。
     
    3.3.5 ADC驅(qū)動
     
    電源電量以及FSR壓力傳感器數(shù)據(jù)測量需要ADC驅(qū)動的支持。由于系統(tǒng)中已含有該驅(qū)動,故只需要在編譯內(nèi)核時選擇上即可。
     
    3.4 AP熱點搭建
     
    3.4.1 AP熱點簡介
     
    AP是(Wireless) Access Point的縮寫,即(無線)訪問接入點。無線設(shè)備可以通過它來接入到無線網(wǎng)絡(luò)。RTL8188支持AP熱點模式,采用這種方式可以讓機器人成為AP熱點,然后用帶WIFI功能的設(shè)備來進行連接。
     
    3.4.2 Hostapd簡介
     
    Hostapd即Host Access Point,其是Linux系統(tǒng)中無線訪問接入點的守護進程。它可以將無線網(wǎng)卡設(shè)置為AP模式,并且支持多種加密方式,提供了設(shè)備接入的身份驗證。在實際的使用期間,我們需要對其配置文件進行相應(yīng)的修改。本設(shè)計中采用Hostapd來結(jié)合RTL8188網(wǎng)卡完成AP熱點的搭建。
    [page]
    3.4.3 DHCP簡介
     
    DHCP(Dynamic Host Configuration Protocol)是一種動態(tài)主機配置協(xié)議。它主要采用UDP協(xié)議來為接入到網(wǎng)絡(luò)中的設(shè)備分配IP地址以及進行一些參數(shù)配置。本設(shè)計中通過配置其配置文件并啟用該服務(wù)來為接入機器人的WIFI設(shè)備分配IP地址,有效的避免了多個設(shè)備接入時的地址沖突問題。
     
    3.4.4 Hostapd移植
     
    ①下載最新版的Hostapd源碼,本文使用的是Hostapd-2.0。
     
    ②將hostapd-2.0.tar.gz進行解壓,并進入到hostapd目錄
     
    ③對目錄下的.config做如下修改:
     
    注釋掉:
     
    CONFIG_DRIVER_HOSTAP=y
     
    CONFIG_DRIVER_WIRED=y
     
    CONFIG_DRIVER_MADWIFI=y
     
    取消下面這項的注釋:
     
    CONFIG_DRIVER_NL80211=y
     
    ④修改Makefile 指定交叉編譯器:
     
    CC=arm-linux-gcc
     
    ⑤執(zhí)行Make命令,編譯得到hostapd及hostapd_cli
     
    ⑥將編譯得到的可執(zhí)行文件復(fù)制到目標平臺,即完成了Hostapd的移植
     
    ⑦按需要更改hostapd.config文件,本設(shè)計關(guān)鍵部分配置如下:
     
    interface=wlan0
     
    ctrl_interface=/var/run/hostapd
     
    ssid=CarControl
     
    channel=6
     
    wpa=2
     
    wpa_passphrase=12345678
     
    ...
     
    driver=rtl871xdrv
     
    beacon_int=100
     
    hw_mode=g
     
    ieee80211n=1
     
    wme_enabled=1
     
    ht_capab=[SHORT-GI-20][SHORT-GI-40]
     
    wpa_key_mgmt=WPA-PSK
     
    wpa_pairwise=CCMP
     
    max_num_sta=8
     
    wpa_group_rekey=86400
     
    ⑧hostapd -B hostapd.config 啟動Hostapd服務(wù)
     
    3.4.5 DHCP移植
     
    Linux2.6.38內(nèi)核中已含有DHCP支持,使用DHCP只需要修改DHCP配置文件udhcpd.conf,其中最關(guān)鍵部分如下:
     
    # The start and end of the IP lease block
     
    start 192.168.2.2
     
    end 192.168.2.30
     
    即修改了自動分配IP地址的范圍,由于采用局域網(wǎng),需要將IP地址設(shè)置為同一網(wǎng)段,機器人采用的IP地址為192.168.2.1,因此將IP地址分配范圍作如上設(shè)置。啟動hostapd后需要執(zhí)行udhcpd命令啟動DHCP服務(wù),從而當WIFI設(shè)備接入機器人時能自動獲取到IP地址。
     
    3.5 視頻服務(wù)器搭建
     
    3.5.1 V4L2簡介
     
    V4L2(即Video for linux 2)是Linux 內(nèi)核中針對UVC免驅(qū)視頻設(shè)備的編程框架,它提供了一系列通用的接口來實現(xiàn)Linux中對視頻設(shè)備的訪問,其編程模式如下:
    V4L2編程模式
    圖 3-2 V4L2編程模式
     
    Linux2.6.38內(nèi)核中自帶了該驅(qū)動,在使用時只需要在編譯內(nèi)核時將V4L2選項勾選上即可。
    [page]
    3.5.2 LIBJPEG簡介
     
    Libjpeg是一個包含了JPEG圖像的編碼,解碼等功能的開源庫,其完全采用C語言來進行編寫。
     
    3.5.3 Mjpgstreamer簡介
     
    MJPGstreamer是主要運行在Linux系統(tǒng)上的一款運用多線程技術(shù)的輕量級視頻服務(wù)器軟件。它是一款采用C語言進行開發(fā)的開源軟件,其代碼簡潔,注釋清晰,組件功能明確,銜接清晰,可以移植到不同的計算機平臺。整個程序主要以模塊化的方法來進行構(gòu)建,每個功能模塊又被稱為組件(plug-in),用戶可以根據(jù)自己的需要來選擇輸入組件和輸出組件。它可以實現(xiàn)從一個單一的輸入組件獲取到圖像數(shù)據(jù)來通過多個輸出組件將圖像進行輸出[ ]。下圖為Mjpgstreamer的組件:
    MJPG-streamer組件
    圖 3-3 MJPG-streamer組件
     
    本設(shè)計選用input_uvc作為輸入組件來使用V4L2從攝像頭獲取圖像數(shù)據(jù),經(jīng)JPEG庫對數(shù)據(jù)進行編碼之后,通過選用output_http作為輸出組件來輸出圖像數(shù)據(jù)。output_http組件實現(xiàn)了一個符合HTTP1.0標準的web服務(wù)器,用戶可以使用HTTP協(xié)議獲取視頻信息。
     
    3.5.4 libjpeg移植
     
    移植libjpeg庫主要是用于Mjpgstreamer采集數(shù)據(jù)時壓縮編碼,移植步驟如下:
     
    ①下載libjpeg源碼,本文采用jpeg-9a。
     
    ②將jpeg-9a.tar.gz解壓,并進入源碼根目錄。
     
    ③執(zhí)行如下命令配置編譯,生成編譯時所需要的Makefile文件。
     
    ./configure --prefix=/root/h264/app/jpeg --exec-prefix=/root/h264/app/jpeg --enable-shared --enable-static
     
    命令中prefix是最后安裝時庫存放的目錄,shared是編譯成動態(tài)庫,static是編譯成靜態(tài)庫。
     
    ④修改Makefile文件,指定編譯時所需要的交叉編譯工具和環(huán)境:
     
    CC = arm-linux-gcc -std=gnu99
     
    AR = arm-linux-ar
     
    CPP = arm-linux-gcc -std=gnu99 -E
     
    ⑤執(zhí)行make命令編譯代碼
     
    ⑥執(zhí)行make install命令產(chǎn)生libjpeg庫,存放于/root/h264/app/jpeg目錄下。
     
    ⑦將libjpeg庫移動到目標平臺,完成libjpeg移植。
     
    3.5.5 Mjpgstreamer移植
     
    MJPGstreamer作為本設(shè)計中的視頻采集服務(wù)器,其移植過程如下:
     
    ①下載Mjpgstreamer源代碼,本設(shè)計采用mjpg-streamer-r63.tar.gz。
     
    ②解壓mjpg-streamer-r63.tar.gz,并進入代碼根目錄。
     
    ③修改plugins/input_uvc/Makefile:
     
    指定交叉編譯器:
     
    CC = arm-linux-gcc
     
    指定libjpeg庫:
     
    input_uvc.so: $(OTHER_HEADERS) input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo $(CC) $(CFLAGS) -ljpeg -L/root/h264/app/jpeglib/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
     
    ④修改主目錄以及plugins目錄下所有子目錄的Makefile,指定交叉編譯器:
     
    CC = arm-linux-gcc
     
    ⑤執(zhí)行make命令,生成可執(zhí)行文件mjpg_streamer。
     
    ⑥將源碼目錄中的start.sh和目錄www拷貝到目標平臺完成Mjpgsteramer移植。
     
    ⑦執(zhí)行如下命令可啟用Mjpgstreamer服務(wù):
     
    ./mjpg_streamer -i "./input_uvc.so -r 320x240 -f 25 " -o "./output_http.so -w www"
     
    命令中指定輸入組件為input_uvc,并且配置采集分辨率為320*240,幀數(shù)為25fps。指定輸入組件為output_http,并且http服務(wù)器目錄為www。
    [page]
    3.6 BOA服務(wù)器搭建

    3.6.1 BOA服務(wù)器簡介
     
    由于Mjpgstreamer服務(wù)器只能傳輸視頻信息,而本設(shè)計需要接收客戶端的控制命令并且得返回機器人的傳感器數(shù)據(jù)。因此得移植支持CGI應(yīng)用腳本的服務(wù)器。BOA服務(wù)器是一個可運行在unix或linux下的非常小巧的單任務(wù)Web服務(wù)器,并且支持CGI腳本,廣泛應(yīng)用于嵌入式領(lǐng)域[ ]。本設(shè)計通過編寫CGI腳本來完成服務(wù)器與客戶端的數(shù)據(jù)交換。
     
    3.6.2 BOA服務(wù)器移植
     
    BOA服務(wù)器的移植需要以下步驟:
     
    ①下載BOA服務(wù)器源碼,本文采用boa-0.94.13.tar.gz。
     
    ②解壓boa-0.94.13.tar.gz,并進入到源碼根目錄。
     
    ③執(zhí)行命令./configure生成Makefile文件。
     
    ④修改Makefile文件,指定編譯時所需要的交叉編譯器:
     
    CC=gcc改成CC = arm-linux-gcc
     
    CPP = gcc –E改成CPP = arm-linux-gcc –E
     
    ⑤執(zhí)行make命令生成boa可自行文件
     
    ⑥將boa以及boa.conf移動到目標平臺,即可完成BOA服務(wù)器移植。
     
    ⑦為了適應(yīng)本設(shè)計的需求,得修改boa.conf文件來配置boa服務(wù)器。本設(shè)計作出如下修改:
     
    Port 80
     
    User root
     
    Group root
     
    ErrorLog /dev/console
     
    AccessLog /dev/null
     
    ServerName CarControl
     
    DocumentRoot /www
     
    DirectoryIndex index.html
     
    KeepAliveMax 1000
     
    KeepAliveTimeout 10
     
    MimeTypes /etc/mime.types
     
    DefaultType text/plain
     
    CGIPath /bin
     
    AddType application/x-httpd-cgi cgi
     
    此配置設(shè)置了服務(wù)器的端口號,權(quán)限,服務(wù)器目錄連接數(shù)等參數(shù)。
     
    3.7 服務(wù)器端程序設(shè)計

    3.7.1 CGI腳本簡介
     
     3-4 CGI程序應(yīng)用原理
     
    圖 3-4 CGI程序應(yīng)用原理
     
    3.7.2 命名管道簡介
     
    命名管道是一種實現(xiàn)無關(guān)進程間通信的通信機制(IPC)。其本質(zhì)上為一個文件,因此通訊更加穩(wěn)定。命名管道遵循與先進先出原則,并且是半雙工的,數(shù)據(jù)只能單向傳輸,若要實現(xiàn)雙向傳輸就得使用兩個管道。命名管道含有讀端和寫端,并且支持阻塞讀。本設(shè)計中利用命名管道的特性,可以實現(xiàn)CGI程序與命令服務(wù)程序之間的數(shù)據(jù)交換。
    [page]
    3.7.3 控制命令設(shè)計
     
    本設(shè)計控制命令簡單,因此客戶端與服務(wù)器間數(shù)據(jù)通訊主要采用HTTP GET方法,服務(wù)器CGI應(yīng)用程序可以在環(huán)境變量QUERY_STRING中獲取字符串形式的控制命令。本設(shè)計中采用“標志+參數(shù)”的方式設(shè)置控制命令,單個命令字的總長度為5字節(jié),具體如下:
     
    直流電機控制指令:
     
    L0000~0200
     
    R0000~0200
     
    其中L,R分別代表左和右,將此命令參數(shù)減去100,負數(shù)為后退,0為停止,正數(shù)為前進。其絕對值越大速度越快。
     
    伺服電機控制命令:
     
    C0250~1250
     
    S0250~1250
     
    其中C,S分別代表夾持和旋轉(zhuǎn)命令,參數(shù)250~1250代表脈沖寬度用以調(diào)整伺服電機旋轉(zhuǎn)位置(0°~180°)。
     
    獲取電量命令:
     
    POWER
     
    當CGI接收到此命令時將會把電源的電壓值返回給客戶端。
     
    數(shù)據(jù)返回格式如下:
     
    POW:0~1023
     
    PRE:0~1023
     
    其中POW,PRE分別代表電量,壓力,參數(shù)0~1023為從ADC中采集到的數(shù)據(jù)。
     
    3.7.4 CGI程序流程圖
     
    CGI程序主要負責從客戶端獲得命令字然后通過命名管道將控制命令發(fā)送給服務(wù)程序進行處理,并且調(diào)用驅(qū)動程序讀取機器人傳感器數(shù)據(jù)信息返回給客戶端。CGI程序流程圖如下:
    CGI程序流程圖
    圖 3-5 CGI程序流程圖
     
    如圖3-5所示,本設(shè)計的CGI腳步先判斷客戶端的命令是否為索取電壓值得命令,如果是的話就讀取電源電壓數(shù)據(jù)并將數(shù)據(jù)返回,否則就將命令字寫入到命名管道供服務(wù)程序來進行讀取,并且讀取壓力傳感器的數(shù)據(jù)將其返回給客戶端。
     
    3.7.5 CGI程序編寫
     
    CGI腳本的部分代碼如下:
     
    int main()
     
    {
     
    ...
     
    buff = getenv("QUERY_STRING");//獲得指令
     
    sscanf(buff, "%s", cmd);
     
    ...
     
    /*讀取電壓值,并返回給客戶端*/
     
    if(strcmp(cmd,"POWER")==0)
     
    {adc_fd=open("/dev/adc",0);//打開ADC驅(qū)動
     
    if(adc_fd<0)
     
    fprintf(stdout, "open adc_device failen");
     
    else
     
    {if(ioctl(adc_fd,ADC_SET_CHANNEL,0) < 0)
     
    fprintf(stdout, "ioctl adc_device failen");
     
    else{len = read(adc_fd, adc, 4);//讀取ADC
     
    if (len > 0)
     
    {adc[len] = ''''''''?'''''''';
     
    fprintf(stdout, "POW:%s",adc);//將電壓值返回
     
    }
     
    }
     
    close(adc_fd);
     
    }
     
    }
     
    else
     
    {
     
    cmd_fd=open(FIFO_CMD,O_WRONLY|O_NONBLOCK,0);//與服務(wù)程序通過命名管道通訊
     
    /* 向管道寫入數(shù)據(jù) */
     
    if((nwrite=write(cmd_fd,cmd,11))==-1)
     
    fprintf(stdout, "write cmd failen");
     
    close(cmd_fd);
     
    /*讀取壓力值,并返回給客戶端*/
     
    adc_fd=open("/dev/adc",0);//打開ADC驅(qū)動
     
    if(adc_fd<0)
     
    fprintf(stdout, "open adc_device failen");
     
    else
     
    {
     
    if(ioctl(adc_fd,ADC_SET_CHANNEL,1) < 0)
     
    fprintf(stdout, "ioctl adc_device failen");
     
    else
     
    {
     
    len = read(adc_fd, adc, 4);//讀取ADC
     
    if (len > 0)
     
    {
     
    adc[len] = ''''''''?'''''''';
     
    fprintf(stdout, "PRE:%s",adc);//返回壓力值
     
    }
     
    }
     
    close(adc_fd);
     
    }
     
    }
     
    return 0;
     
    }
    [page]
    3.7.6 服務(wù)程序流程圖
     
    服務(wù)程序主要完成機器人初始化,讀取電量值并將電量值通過LED來進行提示,讀取命名管道獲得命令字并將其解析執(zhí)行。主要的流程圖如下:
    服務(wù)程序流程圖
    圖 3-6 服務(wù)程序流程圖
     
    如圖3-6所示,本設(shè)計中的服務(wù)程序采用多進程程序設(shè)計方式,其子進程每60S采集一次電源電量信息并更新電量指示燈顯示,主進程采用阻塞讀的方式讀取命名管道來等待客戶端發(fā)送命令,獲得命令之后對命令進行解析并調(diào)用驅(qū)動程序來執(zhí)行相應(yīng)的命令,從而實現(xiàn)對機器人的控制。
     
    3.7.7 服務(wù)程序編寫
     
    服務(wù)程序部分代碼如下:
     
    /* 創(chuàng)建子進程,用于每60S獲取電源電壓值 */
     
    if(fork()==0)
     
    {
     
    while(1)
     
    {
     
    if(ioctl(adc_fd,ADC_SET_CHANNEL,0) < 0)
     
    {perror("ioctl ADC device:");
     
    exit(1);
     
    }
     
    char buffer[5];
     
    int len = read(adc_fd, buffer, sizeof buffer -1);//讀取ADC
     
    if (len > 0)
     
    {
     
    buffer[len-1] = ''''''''?'''''''';
     
    printf("POW VALUE:%sn",buffer);
     
    getpower=(float)StrToInt(buffer);
     
    getpower=9.9*getpower/1024.0;
     
    if(power==0)
     
    power=getpower;
     
    if(getpower<=power && power-getpower<0.2)
     
    {
     
    power=getpower;
     
    if(power>8.1)//根據(jù)電量來用LED顯示
     
    Show(5);
     
    ...
     
    }
     
    }
     
    sleep(60);//1min
     
    }
     
    }
     
    /* 主進程,用于獲取命令并處理 */
     
    else{
     
    while(1)
     
    {
     
    memset(buff,0,sizeof(buff));
     
    cmd_fd=open(FIFO_CMD,O_RDONLY);//readonly 阻塞
     
    if(cmd_fd==-1)
     
    {
     
    perror("open");
     
    exit(1);
     
    }
     
    if((nbytes=read(cmd_fd,buff,sizeof(buff)))>4)//讀取FIFO_CMD管道
     
    {
     
    buff[nbytes]=''''''''?'''''''';
     
    //指令處理
     
    receive_do(buff);
     
    }
     
    close(cmd_fd);
     
    }
     
    }
     
    上述代碼中receive_do函數(shù)主要負責解析命令,并進行處理。其代碼如下:
     
    void receive_do(char buffer[])
     
    {
     
    int c,i;
     
    int tmp=0;
     
    c = (int)(nbytes+1)/5;
     
    for(i=0;i {
     
    tmp=(buffer[1+i*5]-''''''''0'''''''')*1000+(buffer[2+i*5]-''''''''0'''''''')*100+(buffer[3+i*5]-''''''''0'''''''')*10+(buffer[4+i*5]-''''''''0'''''''');//解析接收到的指令數(shù)據(jù)
     
    switch(buffer[i*5])//處理指令
     
    {
     
    case ''''''''L'''''''':ioctl(dc_fd,LEFT_SET,tmp);
     
    break;
     
    case ''''''''R'''''''':ioctl(dc_fd,RIGHT_SET,tmp);
     
    break;
     
    case ''''''''C'''''''':ioctl(servo_fd,CLAMP_SET,tmp);
     
    break;
     
    case ''''''''S'''''''':ioctl(servo_fd,SPIN_SET,tmp);
     
    break;
     
    }
     
    }
     
    }
    CGI即公共網(wǎng)關(guān)接口(Common GatewayInterface)它是一種WWW技術(shù)。CGI實質(zhì)是運行在WEB服務(wù)器上面為客戶端HTML頁面提供接口的一個腳本程序。它可以通過標準輸入(STDIN)來從WEB服務(wù)器獲得數(shù)據(jù),經(jīng)處理之后可以通過標準輸出(STDOUT)來將數(shù)據(jù)返回給WEB服務(wù)器,從而實現(xiàn)對客戶端數(shù)據(jù)的接收處理。本設(shè)計采用這種方式實現(xiàn)機器人控制命令的接收,以及返回機器人傳感器數(shù)據(jù)信息。CGI程序應(yīng)用原理如下圖所示:
     
    特別推薦
    技術(shù)文章更多>>
    技術(shù)白皮書下載更多>>
    熱門搜索
    ?

    關(guān)閉

    ?

    關(guān)閉

    中文字幕亚洲情99在线| 狠狠躁夜夜躁无码中文字幕| 中文字幕一区在线观看视频| 日韩精品久久无码人妻中文字幕| 中文字幕无码第1页| 精品国产a∨无码一区二区三区 | 中文字幕一区一区三区| 久久久久亚洲AV无码专区桃色| 国内精品无码一区二区三区| 中文字幕久久波多野结衣av| 国产午夜片无码区在线播放| 亚洲精品无码久久千人斩| 欧美日韩中文字幕在线看| 五月天无码在线观看| 高清无码视频直接看| 日韩精品无码熟人妻视频| 中文字幕AV中文字无码亚| 中文字幕夜色资源网站| 最近免费中文字幕MV在线视频3| 国产高清无码毛片| 国产午夜鲁丝无码拍拍| 特级无码毛片免费视频尤物| 国产丝袜无码一区二区三区视频| 亚洲欧美中文字幕| 国产区精品一区二区不卡中文| 亚洲一区无码精品色| 特级小箩利无码毛片| 久久久久成人精品无码| WWW插插插无码视频网站| 无码av免费一区二区三区试看| 免费精品无码AV片在线观看| 亚洲AV综合色区无码一区 | 日韩人妻无码精品一专区 | 久久无码一区二区三区少妇| 久久人妻少妇嫩草AV无码专区| 亚洲av福利无码无一区二区| 伊人久久精品无码av一区| 亚洲国产精品无码专区影院| 亚洲国产精品无码久久98| 亚洲乱亚洲乱妇无码麻豆| 日韩精品无码一本二本三本|