本文檔適合大彩PM 4G系列串口屏產品使用。
1. VisualTFT軟件版本:V3.0.1.1112及以上的版本。
版本查看:
1) 打開VisualTFT軟件啟動頁面如圖2-1軟件版本,右上角會顯示的軟件版本號;
圖2-1軟件版本
2) 打開VisualTFT,在軟件右下角可以查看軟件版本圖2-2軟件版本,最新版本可登錄http://botecn.com/進行下載。
圖2-2軟件版本
2. 串口屏硬件版本:M系列固件 >= V6.3.257.00。
版本查看:
1) 查看屏幕背面版本號貼紙;
2) VisualTFT與屏幕聯機成功后,右下角顯示的版本號。
例程中,介紹4G TCP單連接的應用。屏幕作為客戶端,和服務器進行數據收發。
服務器TCP測試工具:本例程中使用合宙提供的TCP 透傳云 做測試驗證。該測試平臺IP固定為180.97.81.180,Demo中只需要更改端口號,在連接即可測試驗證。
注意:UDP或多鏈接模式可參考《Luat 4G模塊AT命令手冊V4.2.2.pdf》即可
該平臺創建服務器必須在3分鐘內連上,且長時間未交互,服務器會自動關閉。
1 《LUA 腳本API V1.4》可通過以下鏈接下載物聯型開發包獲取:
http:/botecn.com/index.php?s=/List/index/cid/19.html
2 《LUA基礎學習》可通過以下鏈接下載物聯型開發包獲取:
http:/botecn.com/index.php?s=/List/index/cid/19.html
3 LUA腳本初學者可以通過下面鏈接進行學習。
http://www.runoob.com/lua/lua-arrays.html
4 AT指令,可以通過下面子連接了解。
http://www.openluat.com/Product/file/asr1802/Luat%204G模塊AT命令手冊V4.2.8.pdf
5 合宙TCP測試平臺。
http://tcplab.openluat.com
本文主要將以下2點進行說明:
1. 準備工程素材;
2. 配置串口屏工程;
在實現例程前需要作以下3個準備:
1. 硬件平臺;
2. 軟件平臺;
3. UI素材;
該例程使用大彩M系列7寸串口屏DC80480M070_1111_0T為驗證開發平臺。如圖5-1所示;
圖5-1 M系列7寸串口屏
其他尺寸串口屏均可借鑒此教程。
5.1.2 軟件平臺
使用大彩自主研發的上位機軟件VisualTFT配置工程,登錄http://botecn.com/下載。如圖5-2所示;
圖5-2 下載軟件
本文主要介紹以下2點:
(1) 畫面配置
(2) LUA編輯
5.2.1. 畫面配置
在畫面ID0中,客戶端、服務端和信號值/運營商3部分組成。
客戶端:
- 文本控件ID1:屏幕公網的IP
- 文本控件2~3:分別服務器IP地址、端口號。
- 按鈕控件ID4:當輸入端口號后,點擊連接。屏幕向該服務器發起請求信息。
服務器:
- 文本控件ID7~9:當服務器下發數據時,將相關信息顯示此處,依次為服務器的IP、端口、數據等
4G信號和運營商:
- 圖標控件控件ID10作為信號顯示、文本控件ID11用于顯示運營商。
畫面配置如圖5-3所示:
注意:其他非關鍵控件不在一一介紹,下文不在累述
圖5-3 畫面配置
5.2.2. LUA編輯
本例程中,屏幕上電執行初始化操作,如加載4G AT 指令的庫、初始化4G模塊、定時獲取運營商和信號值等。
當用戶點擊圖片下載的時,調用air_http_download()開始下載文件。在下載回調函數on_http_download_file_cb()里進行數據存儲,顯示下載信息等。若該文件單次下載不完,會多次回調on_http_download_file_cb()函數,直至下載完畢,如圖5-4所示。
圖5-4 TCP連接
1. 初始化
調用系統函數on_init()執行代碼如程序清單 1所示:
程序清單 1初始化
--[[********************************************************************* ** Function name: on_init ** Descriptions : 系統初始化時,執行此回調函數。 *********************************************************************--]] function on_init() dofile('air724at.lua') --加載 http.lua 文件 uart_set_baudrate3(115200) --設置與4G模塊通訊的串口3的波特率為115200 --設置4G庫函數的命令發送函數,命令回調函數、調試信息打印函數 air_set_callback(on_air_send_cb,on_air_resp_callback,on_air_log_cb) air_hw_int() --4G模塊初始化設置 --開啟自動獲取型號強度、時間、天氣功能 start_timer(timerId_Sig_Weather, 1000 , 0, 0) end --[[********************************************************************* ** Function name: on_timer ** Descriptions : 定時器超時回到調函數。 ** @ timer_id : 定時器ID *********************************************************************--]] function on_timer(timer_id) on_air_timer(timer_id) --4G庫函數的定時處理 --定時獲取信號強度 if timer_id == timerId_Sig_Weather then --定時器計數,timer0_notify_cnt 每秒+1。 timer0_notify_cnt = timer0_notify_cnt + 1 if timer0_notify_cnt%15 == 0 then --每15s調用一次,更新信號值 at_cops_csq() timer0_notify_cnt = 0 --標志位清空 end end end --[[********************************************************************* ** Function name : at_cops_csq ** Descriptions : 獲取運營商信息、信號強度 ** @return : nil,無返回值 *********************************************************************--]] function at_cops_csq() air_cmd_add('AT+COPS?','OK',1000) –獲取運營商 air_cmd_add('AT+CSQ' ,'OK',1000) –獲取信號 end --[[********************************************************************* ** Function name: on_air_resp_callback ** Descriptions : 4G模塊-數據回調接口 ** @key : 屏幕向4G模塊的發送請求 ** @value : 4G模塊返回的數據 *********************************************************************--]] function on_air_resp_callback(key, value) --*********************************************************************** --功能: 判斷 key -- 如果 key 為空,則退出函數。 -- 因為 key 為空時,下方 string.find( key , ) 是不正確的使用。 -- 以下key的處理必須不為空, --******************************************************************** if key == nil then return end ...... --****************************************************************** --條件: 4G初始化完成 --功能: 使用使用AT指令獲取信號強度和運營商。 --調用函數:at_cops_csq() --函數功能:獲取信號強度和運營商 --調用函數:at_tcp_client_cofig() --函數功能:TCP配置 ********************************************************************* if string.find(key,'+SAPBR=1,1') ~= nil and string.find(value,'OK') ~= nil then at_cops_csq() at_tcp_client_cofig() end --******************************************************************** --條件: 4G模塊返回運營商信息 --功能: --******************************************************************** if string.find(key,'+COPS') ~= nil and string.find(value,'+COPS') ~= nil then --**************************************************************** --value : +COPS: 0,2,"46000",7 --要提取的值:46000 --正則表達式: '+COPS:.*,.*,"(%d*)"' --**************************************************************** local regular_e = '+COPS:.*,.*,"(%d*)"'--正則表達式 --獲取的值賦給 my_mobile_MCCMNC local my_mobile_MCCMNC = string.match( value, regular_e ) set_text( screen_main, 2, mobile_MCCMNC[my_mobile_MCCMNC]) end --******************************************************************** --條件:4G模塊返回信號強度信息 --功能: --******************************************************************** if string.find(key,'+CSQ')~=nil and string.find(value,'+CSQ')~=nil then --*************************************************************** --value : +CSQ: 15,99 --要提取的值:15 --正則表達式: '+CSQ: (.*),.*' --**************************************************************** local regular_e = '+CSQ: (.*),.*' --正則表達式 local my_csq = tonumber(string.match(value,regular_e)) if my_csq<=11 then set_value( screen_main, 1, 1) --設置信號圖標顯示第1幀 elseif my_csq>=12 and my_csq<=13 then set_value(screen_main, 1, 2) --設置信號圖標顯示第2幀 elseif my_csq>=14 and my_csq<=15 then set_value( screen_main, 1, 3) --設置信號圖標顯示第3幀 elseif my_csq>=16 then set_value( screen_main, 1, 4) --設置信號圖標顯示第4幀 end end end --[[********************************************************************** ** Function name: on_uart_recv_data3 ** Descriptions : 接收串口3數據回調函數,連接4G模塊。 **********************************************************************--]] function on_uart_recv_data3(packet) --4G AT指令庫API on_air_recv_data(packet) end
核心API函數
1) dofile (filename)
加載文件:本例程中加載4G AT 指令的庫
- filename:文件名
2) uart_set_baudrate3(speed)
設置串口3的波特率:串口3為屏幕和4G模塊通訊的串口
- speed:通訊的波特率
3) on_air_recv_data(packet)
串口接收4G模塊的返回數據的回調。
- packet:形參為表,字節數據
4) air_set_callback (on_air_send_cb,on_air_resp_callback,on_air_log_cb)
設置4G庫里的回調函數。形參類型為函數,參數依次為命令發送函數,命令回調函數、調試信息打印函數,可自定義函數名。
- on_air_send_cb:屏幕向4G模塊發送回調函數
- on_air_resp_callback:4G向屏幕返回數據回調函數
- on_air_log_cb:用戶調試信息回調函數調試
5) air_hw_int()
4G AT 指令的庫函數,初始化4G模塊
6) at_cops_csq()
自定義封裝函數,獲取運行商和信號值
7) air_cmd_add(sendstr,ackstr,timeout,retry,callback)
屏幕向4G模塊發送AT指令
- sendstr:屏幕向4G模塊發送AT指令
- ackstr:4G模塊應答屏幕的請求
- timeou:應答超時
- retry: 超時重發次數,可選
- callback: 應答回調函數,可選
注:如果沒有設置超時重發次數,則超時時直接發送隊列中的下一條指令。
8) on_air_resp_callback(key, value)
4G應答屏幕回調函數:屏幕發送AT指令,4G應答后均會回調該函數,初始化設置:air_set_callback(on_air_send_cb,on_air_resp_callback,on_air_log_cb)。
- key:屏幕向4G模塊發送請求的AT指令
- value:4G模塊返回的數據
相關AT指令:
本例程中,涉及到獲取4G模塊初始化、運營商、信號值等AT交互指令回調的判斷,在on_air_resp_callback(key, value)回調函數中,判斷4G收發的相關AT指令,如下所示:
1) 網絡數據是否激活:
屏幕發送:AT+SAPBR=1,1。air_hw_int()函數里發送。
屏幕接收:OK。on_air_resp_callback(key, value)函數里執行4G返回數據的判斷。
2) 獲取運營商:
屏幕發送:AT+COPS?。在at_cops_csq()函數了發送。
屏幕接收:OK。on_air_resp_callback(key, value)函數里執行4G返回數據的判斷。
3) 獲取信號值:
屏幕發送:AT+CSQ。在at_cops_csq()函數了發送。
屏幕接收:OK。on_air_resp_callback(key, value)函數里執行4G返回數據的判斷。
2. TCP配置
當4G初始化完畢后,在on_air_resp_callback(key, value)函數里調用at_tcp_client_cofig()進行TCP配置,代碼如程序清單 2所示:
程序清單 2 TCP配置
--[[********************************************************************* ** Function name: on_air_resp_callback ** Descriptions : 4G模塊-數據回調接口 ** @key : 屏幕向4G模塊的發送請求 ** @value : 4G模塊返回的數據 *********************************************************************--]] function on_air_resp_callback(key, value) ...... --****************************************************************** --條件: 4G初始化完成 --功能: 使用使用AT指令獲取信號強度和運營商。 --調用函數:at_cops_csq() --函數功能:獲取信號強度和運營商 --調用函數:at_tcp_client_cofig() --函數功能:TCP配置 --***************************************************************** if string.find(key,'+SAPBR=1,1') ~= nil and string.find(value,'OK') ~= nil then ....... at_tcp_client_cofig() end end --[[********************************************************************* ** Function name : at_tcp_client_cofig ** Descriptions : TCP配置 ** @return : nil,無返回值 ******************************************************************** --]] function at_tcp_client_cofig(connect) local function my_get_ip_cb(key, value) if string.find(key,'+CIFSR') ~= nil and value ~= nil then Tcp_ip = value set_text(sc_Tcp, 1, Tcp_ip) end end local function my_ip_state(key, value) air_log('my debugMsg key -> '..key) air_log('my debugMsg value -> '..value) if string.find(key,'+CIPSTATUS') ~= nil and string.find(value,'IP STATUS') ~= nil then Tcp_state = 1 air_log('at_tcp_client_cofig success !!!!!!') end end if connect == nil then connect = 0 end air_cmd_add('AT+CREG=1', 'OK', 1000, 3) --設置當前GPRS注冊狀態 air_cmd_add('AT+CGREG=1', 'OK', 1000, 3) --設置當前GPRS注冊狀態 air_cmd_add('AT+CGATT=1', 'OK', 1000, 3) --設置當前GPRS附著狀態 air_cmd_add('AT+CIPMUX='.. connect, 'OK', 1000, 3) --設置為單、多鏈接模式 --設置為快發模式(推薦使用這種模式) air_cmd_add('AT+CIPQSEND=1', 'OK', 1000, 3) air_cmd_add('AT+CSTT?', 'OK', 1000, 3) --啟動任務,查看APN air_cmd_add('AT+CSTT="CMIOT"', 'OK', 1000, 3) --啟動任務,設置APN air_cmd_add('AT+CIICR', 'OK', 1000, 3) --激活移動場景 air_cmd_add('AT+CIFSR' , 'OK', 1000, 3, my_get_ip_cb) --查詢分配的IP地址 air_cmd_add('AT+CIPSTATUS' , 'STATE: IP STATUS', 1000, 3, my_ip_state) --查詢下鏈接狀態 end
核心API函數
1) at_tcp_client_cofig(connect)
自定義函數,TCP客戶端配置
- connect:0-單鏈接,非0多鏈接
相關AT指令:
本例程中,TCP配置涉及到相關指令有設置為單、多鏈接模式、快發模式、激活等,相關關AT指令,更多詳細的AT指令參考《Luat 4G模塊AT命令手冊V4.2.2.pdf》,如下所示:
1) 設置鏈接模式:
屏幕發送:AT+CIPMUX=0。設置單鏈接,非零(1/2)為多連接模式。
屏幕接收:OK
2) 設置移動激活場景:
屏幕發送:AT+CIICR?
屏幕接收:OK
3) 查詢分配的IP地址:
屏幕發送:AT+CIFSR
屏幕接收:OK
3. 連接服務器
當用戶輸入端口號后,點擊聯機,調用at_tcp_client_connect()并設置服務器接收模式,代碼如程序清單 3所示:
程序清單 3 連接服務器
--[[********************************************************************* ** Function name : at_tcp_client_connect ** Descriptions : 設置接收模式 ** @head : 是否顯示頭部 ** @showtp : 是否顯示協議 ** @srip : 是否顯示IP、端口 ** @return : nil,無返回值 *********************************************************************--]] function at_set_tcp_recv_mode(head, showtp,srip) air_cmd_add('AT+CIPHEAD='..head, 'OK', 1000, 3) --顯示頭部 air_cmd_add('AT+CIPSHOWTP='..showtp, 'OK', 1000, 3) --顯示協議 air_cmd_add('AT+CIPSRIP='..srip, 'OK', 1000, 3) --顯示IP、端口 end --[[********************************************************************* ** Function name : at_tcp_client_connect ** Descriptions : 連接服務器 ** @mode : 連接模式,TCPUPD ** @server_ip : 服務器地址 ** @port : 服務器端口 ** @return : nil,無返回值 ********************************************************************--]] function at_tcp_client_connect(mode, server_ip, port) --連接服務器 air_cmd_add( 'AT+CIPSTART="'..mode..'",'..'"'..server_ip..'",'..port, 'OK', 1000, 3) --查詢當前GPRS注冊狀態 air_cmd_add('AT+CIPSTATUS', 'STATE: CONNECT OK', 1000, 3) end --[[********************************************************************* ** Function name : on_control_notify ** Descriptions : 系統回調函數,用戶通過觸摸修改控件后,執行此回調函數。 ** 點擊按鈕控件,修改文本控件、修改滑動條都會觸發此事件。 ** @return : nil,無返回值 ********************************************************************--]] function on_control_notify(screen,control,value) if screen == sc_Tcp then if control == 4 and value == 0 and Tcp_state == 1 then Tcp_server_ip = get_text(sc_Tcp, 3) Tcp_server_port = get_text(sc_Tcp, 3) at_tcp_client_connect('TCP', Tcp_server_ip, Tcp_server_port) --連接服務器 at_set_tcp_recv_mode(1, 1, 1) --設置接收模式 ...... end end end
核心API函數
1) at_set_tcp_recv_mode(head, showtp,srip)
設置接收模式
- head: 是否顯示頭部
- showtp: 是否顯示協議
- srip: 是否顯示IP、端口
- return: nil,無返回值
2) at_tcp_client_connect(mode, server_ip, port)
連接服務器
- mode: 連接模式,TCPUPD
- server_ip : 服務器地址
- port : 服務器端口
相關AT指令:
1) 請求連接:
屏幕發送:AT+CIPSTART="TCP","60.166.18.9",7500。
屏幕接收:OK
2) 設置服務器數據包含頭:
屏幕發送:AT+CIPHEAD=1
屏幕接收:OK
3) 設置服務器協議包含協議:
屏幕發送:AT+CIPSHOWTP=1
屏幕接收:OK
4) 設置服務器協議包含IP、端口:
屏幕發送:AT+CIPSRIP=1
屏幕接收:OK
4. 發送數據到服務器
用戶輸入文本數據點擊發送后,調用at_tcp_send ()發送數據到服務端,代碼如程序清單 4所示:
程序清單 4 發送數據
--[[********************************************************************* ** Function name : on_control_notify ** Descriptions : 系統回調函數,用戶通過觸摸修改控件后,執行此回調函數。 ** 點擊按鈕控件,修改文本控件、修改滑動條都會觸發此事件。 ** @return : nil,無返回值 *********************************************************************--]] function on_control_notify(screen,control,value) if screen == sc_Tcp then ...... local send_data = get_text(sc_Tcp, 5) at_tcp_send(send_data) ....... end end --[[********************************************************************* ** Function name : at_tcp_send ** Descriptions : TCP、發送數據到服務端 ** @str : 發送數據 ** @return : nil,無返回值 ********************************************************************--]] function at_tcp_send(str) air_cmd_add('AT+CIPSEND='..string.len(str) , '>', 1000, 3) air_cmd_add(str, 'DATA ACCEPT', 1000, 3) end
核心API函數
1) at_tcp_send(str)
發送數據到服務器
str: 字符串
相關AT指令:
1) 發送數據(確定長度):
屏幕發送:AT+CIPSEND=10
屏幕接收:>
2) 發送數據(數據內容)
屏幕發送:1234567890
屏幕接收:DATA ACCEPT:10
5. 接收服務器的數據
本例程中,接收服務器的信息是含接收員(目標服務器的IP、端口)、幀頭、協議類型、數據內容等,在函數at_set_tcp_recv_mode(head, showtp,srip)配置。程序清單如程序清單 5所示。
程序清單 5 接收服務器數據
--[[********************************************************************* ** Function name: split ** Descriptions : 切割字符串 ** @ str : 源字符串 ** @ pat : 分割符號 *********************************************************************--]] function split(str, pat) local t = {} local last_end = 0 local s, e = string.find(str, pat, 1) --第一個分割號 local i = 1 while s do table.insert(t, string.sub(str, last_end + 1, last_end + s - last_end - 1)) last_end = e s, e = string.find(str, pat, last_end + 1) i = i + 1 end if last_end <= #str then cap = string.sub(str, last_end + 1) table.insert(t, cap) end return t end --[[********************************************************************* ** Function name: on_air_resp_callback ** Descriptions : 4G模塊-數據回調接口 ** @key : 屏幕->4G模塊的發送請求 ** @value : 4G模塊->返回的數據 *********************************************************************--]] function on_air_resp_callback(key, value) ...... if value ~= nil then if string.find(value,'FROM') ~= nil then --+RECV FROM: 60.166.12.210:7500 --分割成3份,分別為+RECV FROM、60.166.12.210、7500 local serverInfo = split(value,':') set_text(sc_Tcp, 7, serverInfo[2]) –- ip set_text(sc_Tcp, 8, serverInfo[3]) –-端口 elseif string.find(value,'IPD') ~= nil then --+IPD,TCP,10:123456789 --分割成2份,分別為+IPD,TCP,10、123456789 local serverData = split(value,':') set_text(sc_Tcp, 9, serverData[2]) -- 數據內容 end end ...... end
相關AT指令:
1) 接收數據源(服務器IP、端口):
屏幕接收:+RECV FROM: 60.166.12.210:7500
2) 接收數據(幀頭+協議+數據長度+數據內容):
屏幕接收:+IPD,TCP,10:123456789
工程編譯成功后在輸出窗口會提示編譯成功,如圖5-5所示;
圖5-5編譯成功
在菜單欄中,文件→打開工程目錄,在‘dciot_build’目錄的‘private’拷貝到SD卡中,如圖5-6和圖5-7所示;把SD卡接上串口屏后重新上電,等到提示燒錄工程成功后,拔掉SD卡重新上電即可。
圖5-6下載文件
圖5-7拷貝到SD卡