聯(lián)系我們
Contact Us公司總機(jī):020-8998-6280
技術(shù)熱線:020-3893-9734
技術(shù)郵箱:support@tronlong.com
銷售郵箱:sales@tronlong.com
【案例分享】Linux應(yīng)用開發(fā)中常用案例講解(二)
2021/08/27
本篇文章繼續(xù)分享幾個(gè)Linux應(yīng)用開發(fā)案例,分別是tl_can_echo案例、tl_devmem_rw案例、tcp_udp_demos案例這三個(gè)較為常見的Linux開發(fā)案例,并配備關(guān)鍵代碼,本次延續(xù)使用創(chuàng)龍科技的TL335x-EVM(AM3352/AM3354/AM3358/AM3359)ARM Cortex-A8架構(gòu)的一系列開發(fā)板,詳細(xì)講解Linux的應(yīng)用開發(fā)。
4.tl_can_echo案例
1.案例功能
本案例使用canutils工具包的canecho程序,實(shí)現(xiàn)CAN接口數(shù)據(jù)接收并重發(fā)功能。
canutils工具包內(nèi)含5個(gè)獨(dú)立的程序,分別為canconfig、candump、canecho、cansend、cansequence。各程序功能簡(jiǎn)述如下:
- canconfig:用于配置CAN接口參數(shù),比如波特率、模式等。
- candump:從CAN接口接收數(shù)據(jù)并以十六進(jìn)制形式打印到標(biāo)準(zhǔn)輸出,亦可輸出到指定文件。
- canecho:從CAN接口接收數(shù)據(jù),并將接收到的數(shù)據(jù)對(duì)外發(fā)送。
- cansend:向指定CAN接口發(fā)送數(shù)據(jù)。
- cansequence:向指定CAN接口發(fā)送自動(dòng)重復(fù)遞增數(shù)字,或指定接收模式并校驗(yàn)接收的遞增數(shù)字。
本案例僅使用canecho功能,如需實(shí)現(xiàn)其他功能,可自行下載canutils工具包并從中獲取對(duì)應(yīng)功能程序源碼。
程序流程如下圖所示:
圖 25
2.操作說明
使用USB轉(zhuǎn)CAN模塊連接評(píng)估板CAN0接口和PC機(jī)USB接口,如下圖所示。
圖 26
參照調(diào)試工具安裝文檔安裝USB轉(zhuǎn)CAN驅(qū)動(dòng)和ECAN Tools調(diào)試軟件,雙擊打開ECAN Tools軟件,選擇設(shè)備類型,然后點(diǎn)擊“打開設(shè)備”。
圖 27
打開ECAN Tools,界面如下圖所示。
圖 28
進(jìn)入評(píng)估板文件系統(tǒng),使用文件系統(tǒng)自帶的canconfig工具設(shè)置波特率,并啟動(dòng)CAN0接口。
Target#canconfig can0 stop
Target#canconfig can0 bitrate 125000
Target#canconfig can0 start
圖 29
將本案例bin目錄下的可執(zhí)行程序tl_can_echo復(fù)制到評(píng)估板文件系統(tǒng),進(jìn)入可執(zhí)行程序所在目錄,執(zhí)行如下命令查看程序參數(shù)信息。
Target#./tl_can_echo -help
圖 30
執(zhí)行如下命令綁定CAN0接口,并接收由ECAN Tools發(fā)出的數(shù)據(jù),然后將接收到的數(shù)據(jù)重新發(fā)送出去。在ECAN Tools中輸入數(shù)據(jù)并點(diǎn)擊發(fā)送按鈕,可看到有兩幀數(shù)據(jù),一幀是發(fā)送數(shù)據(jù),另一幀是接收數(shù)據(jù)。
Target#./tl_can_echo -v can0
圖 31
圖 32
可按"Ctrl+Z"暫停程序,并執(zhí)行如下命令退出程序。
Target#killall -9 tl_can_echo
圖 33
3.關(guān)鍵代碼
1.使用socket監(jiān)聽CAN接口。
圖 34
2.將從CAN接口接收到的數(shù)據(jù)重新發(fā)送出去。
圖 35
5.tl_devmem_rw案例
1.案例功能
本案例主要實(shí)現(xiàn)對(duì)內(nèi)存設(shè)備進(jìn)行數(shù)據(jù)讀寫操作,同時(shí)測(cè)試數(shù)據(jù)正確性和讀寫速度。
程序支持test、read、write三種測(cè)試模式,使用mmap對(duì)物理地址進(jìn)行轉(zhuǎn)換,可根據(jù)指定的訪問操作類型按字節(jié)(Byte)、按半字(Halfword)進(jìn)行訪問。
2.操作說明
將本案例bin目錄下的可執(zhí)行程序tl_devmem_rw復(fù)制到評(píng)估板文件系統(tǒng),進(jìn)入可執(zhí)行程序所在目錄,執(zhí)行如下命令查看程序參數(shù)信息。
Target#./tl_devmem_rw -h
圖 36
請(qǐng)執(zhí)行如下命令進(jìn)行讀寫測(cè)試。此命令寫入1MByte大小的隨機(jī)數(shù)據(jù)到指定地址并將寫入的數(shù)據(jù)重新讀出,測(cè)試數(shù)據(jù)正確性和讀寫速度。
Target#./tl_devmem_rw -t -a 0x90000000 -s 1048576 -o halfword
圖 37
請(qǐng)新建一個(gè)test.txt文件,并輸入任意內(nèi)容(比如十六進(jìn)制符0到f),同時(shí)執(zhí)行如下命令進(jìn)行寫測(cè)試。此命令將test.txt文件中的16Byte數(shù)據(jù)寫到指定地址。
Target#./tl_devmem_rw -w -a 0x90000000 -s 16 -o halfword -f test.txt
圖 38
請(qǐng)執(zhí)行如下命令進(jìn)行讀測(cè)試。此命令從指定地址讀取16Byte的數(shù)據(jù),并將內(nèi)容打印(下圖對(duì)應(yīng)的值為十六進(jìn)制符號(hào)0到f的ASCII碼)。
Target#./tl_devmem_rw -r -a 0x90000000 -s 16 -o halfword
圖 39
3.關(guān)鍵代碼
1.把設(shè)備物理地址映射到虛擬地址。
圖 40
2.根據(jù)指定的操作方式進(jìn)行數(shù)據(jù)讀取。
圖 41
3.根據(jù)指定的操作方式進(jìn)行數(shù)據(jù)寫入。
圖 42
6.tcp_udp_demos案例
1.案例功能
本案例主要實(shí)現(xiàn)客戶端(client)與服務(wù)端(server)的文本數(shù)據(jù)相互收發(fā)功能。本案例包含4個(gè)程序:
- tl_tcp_server:TCP服務(wù)端測(cè)試程序。
- tl_tcp_client:TCP客戶端測(cè)試程序。
- tl_udp_server:UDP服務(wù)端測(cè)試程序。
- tl_udp_client:UDP客戶端測(cè)試程序。
程序流程如下圖所示:
圖 43 TCP通信
圖 44 UDP通信
服務(wù)端和客戶端程序均可在評(píng)估板、PC機(jī)Ubuntu系統(tǒng)上運(yùn)行。當(dāng)服務(wù)端與客戶端程序均在評(píng)估板上運(yùn)行時(shí),可通過127.0.0.1進(jìn)行本地回環(huán)測(cè)試,無需經(jīng)過路由器。為方便測(cè)試,本章節(jié)采用評(píng)估板本地回環(huán)測(cè)試,bin目錄下的4個(gè)文件均為ARM端可執(zhí)行程序。
2.操作說明
將本案例bin目錄下的4個(gè)可執(zhí)行程序復(fù)制到評(píng)估板文件系統(tǒng)。
在Ubuntu中執(zhí)行如下命令使用OpenSSH登陸評(píng)估板文件系統(tǒng),如下圖所示。
Host#sudo ssh root@192.168.0.83 //192.168.0.83為評(píng)估板IP,請(qǐng)根據(jù)實(shí)際情況修改
圖 45
1.TCP通信測(cè)試
在可執(zhí)行程序所在目錄執(zhí)行如下命令運(yùn)行TCP服務(wù)端和客戶端程序。2233為服務(wù)端程序指定的端口號(hào),客戶端程序端口號(hào)參數(shù)需與服務(wù)端程序一致。
Target#./tl_tcp_server 2233 //TCP服務(wù)端命令
Target#./tl_tcp_client 127.0.0.1 2233 //TCP客戶端命令
程序執(zhí)行后,客戶端將會(huì)連接服務(wù)端。在服務(wù)端輸入字符串"Tronlong",按下回車鍵即可在客戶端顯示對(duì)應(yīng)內(nèi)容。在客戶端輸入字符串"Hello Tronlong",按下回車鍵即可在服務(wù)端顯示對(duì)應(yīng)內(nèi)容,如下圖所示。
圖 46 TCP服務(wù)端
圖 47 TCP客戶端
2.UDP通信測(cè)試
在可執(zhí)行程序所在目錄執(zhí)行如下命令運(yùn)行UDP服務(wù)端和客戶端程序。2233為服務(wù)端程序指定的端口號(hào),客戶端程序端口號(hào)參數(shù)需與服務(wù)端程序一致。
Target# ./tl_udp_server 2233 //UDP服務(wù)端命令
Target# ./tl_udp_client 127.0.0.1 2233 //UDP客戶端命令
程序執(zhí)行后,客戶端將不會(huì)連接服務(wù)端。服務(wù)端在收到客戶端信息前無法得知客戶端的存在,因此需要客戶端先向服務(wù)端發(fā)送信息。
在客戶端輸入字符串"Tronlong",按下回車鍵即可在服務(wù)端顯示對(duì)應(yīng)內(nèi)容。在服務(wù)端輸入字符串"Hello Tronlong",按下回車鍵即可在客戶端顯示對(duì)應(yīng)內(nèi)容,如下圖所示。
圖 48 UDP客戶端
圖 49 UDP服務(wù)端
如需在PC端Ubuntu系統(tǒng)運(yùn)行服務(wù)端或客戶端程序,請(qǐng)將案例src源碼目錄拷貝到Ubuntu工作目錄。進(jìn)入源碼目錄后執(zhí)行make命令,即可在當(dāng)前目錄下生成x86端可執(zhí)行程序。在不同終端運(yùn)行服務(wù)端或客戶端程序的命令類似,但127.0.0.1需使用服務(wù)器IP地址替代。
Host# make
圖 50
3.關(guān)鍵代碼
以TCP通信程序?yàn)槔?/span>
1.tl_tcp_client.c
注意源碼中的struct sockaddr_in、socket、connect、fgets、send、recv等數(shù)據(jù)結(jié)構(gòu)和系統(tǒng)調(diào)用的使用。
2.tl_tcp_server.c
注意源碼中的struct sockaddr_in、socket、connect、fgets、send、recv、bind、listen、accept等數(shù)據(jù)結(jié)構(gòu)和系統(tǒng)調(diào)用的使用。
由于開發(fā)案例篇幅過長(zhǎng),給大家分為多個(gè)版本,今天先講tl_can_echo案例、tl_devmem_rw案例、tcp_udp_demos。感興趣的朋友,歡迎在評(píng)論區(qū)留言和我探討!

服務(wù)熱線

























