把串口做成一個控件并不新鮮,在VB里有個通信組件,就是用來簡化串口編程的。最近AWTK也提供了這樣一個控件serial_widget,本文介紹一下它的使用方法。
基本功能
我們編寫一個簡單的應用程序,它有兩個功能:
- 把收到的數據顯示出來。
- 把界面輸入的數據發送給對方。
UI界面描述文件
"open" text="Open Device" x="10" y="100" w="160" h="36" />"device"x="180"y="100"w="-200"h="36"text="/dev/ttys032"/>"send"text="SendMessage"x="10"y="150"w="160"h="36"/>"send_msg"x="180"y="150"w="-200"h="36"text="helloserial"/>"recv_msg"x="c"y="b:100"w="90%"h="100"/>"serial"/>
接收數據
?先注冊數據事件的處理函數。
widget_child_on(win, "serial", EVT_DATA, on_data, win);
?在處理函數中讀取數據并顯示到界面上。
static ret_t on_data(void* ctx, event_t* e) { char text[128] = {0}; widget_t* win = WIDGET(ctx); serial_widget_t* serial = SERIAL_WIDGET(e->target); widget_t* label = widget_lookup(win, "recv_msg", TRUE); int32_t len = tk_istream_read(serial->istream, text, sizeof(text)-1); if(len > 0) {text[len] = '0';widget_set_text_utf8(label, text);}returnRET_OK;}
發送數據
從界面讀取數據,并發送到串口。
static ret_t on_send(void* ctx, event_t* e) { char text[128] = {0}; widget_t* win = WIDGET(ctx); serial_widget_t* serial = SERIAL_WIDGET(widget_lookup(win, "serial", TRUE)); widget_t* edit = widget_lookup(win, "send_msg", TRUE);widget_get_text_utf8(edit, text, sizeof(text)-1);tk_ostream_write_len(serial->ostream, text, strlen(text), 3000); return RET_OK;}
完整代碼請參考 serial 可以下載 awtk-c-demos 編譯運行。
./bin/demo_serial
測試
下面操作是在 Linux/MacOS 上測試的,Windows 下需要安裝虛擬串口軟件,具體做法有些不同,請自行調整。
?使用socat創建虛擬串口
socat -d -d pty,raw,echo=0 pty,raw,echo=0
該命令會生成兩個設備文件,對應串口的兩端(每次生成的設備名可能不同)。
2022/07/08 16:32:33 socat[1879] N PTY is /dev/ttys0322022/07/08 16:32:33 socat[1879] N PTY is /dev/ttys0332022/07/08 16:32:33 socat[1879] N starting data transfer loop with FDs [5,5] and [7,7]
?在AWTK 這端我們使用設備/dev/ttys032?在另外一端讀取數據
打開一個新的終端,并運行下面的命令(有數據時自動顯示出來):
cat /dev/ttys033
?在另外一端發送數據
打開一個新的終端,并運行下面的命令(發送當前時間字符串):
date >/dev/ttys033
使用fscript進行串口編程
"打開設備" x="16" y="15" w="76" h="34" >"on:click">var device = widget_get('device', 'text')widget_set('serial','device', device)"device" x="119" y="13" w="178" h="38" text="/dev/ttys028" />"recv" x="5" y="123" w="303" h="101" />"send" text="hello serial" x="5" y="273" w="200" h="34" />"button" tr_text="send" x="220" y="274" w="81" h="34" >"on:click">var os = widget_get('serial','ostream')var msg = widget_get('send', 'text')ostream_write_string(os, msg)"serial">"on:data">var is = widget_get('self','istream')var msg = istream_read_string(is, 100, 0)widget_set('recv', 'text', msg)
在 AWTK 根目錄下可以運行該例子,測試方法與前面相同。
./bin/preview_ui design/default/ui/serial.xml
移植
目前串口只實現了Windows, Linux, MacOS, Android 和 AWorks 等平臺,其它平臺需要自己移植。
請參考AWorks平臺的移植:
src/platforms/aworkslp/serial_helper.c
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
通信
+關注
關注
18文章
6391瀏覽量
140036 -
串口
+關注
關注
15文章
1618瀏覽量
82802
原文標題:【Z站推薦】AWTK最新動態:使用serial_widget簡化串口編程
文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
實現iOS-Widget的方法詳解
一、Widget總覽 Widget 是 iOS8 推出第一版,在iOS 10 進行大幅度的優化 Widget可以讓用戶更快地訪問到其感興趣的內容,官方的說法是用來呈現功能比較簡單的,交互性不強的東西
發表于 09-25 17:20
?0次下載
AWTK基本性能測試及在Linux下AWTK與Qt的性能對比
先在AWorks系統下分別測試AWTK的Debug版本和Release版本,進行AWTK自身對比,然后在Linux系統下測試AWTK,與AWorks平臺進行簡單對比,對比AWTK跨平臺
發表于 03-09 09:53
?7754次閱讀
【Z站推薦】AWTK最新動態:使用serial_widget簡化串口編程
把串口做成一個控件并不新鮮,在VB里有個通信組件,就是用來簡化串口編程的。最近AWTK也提供了這樣一個控件serial_widget,本文介紹一下它的
【AWTK使用經驗】如何播放視頻或攝像頭畫面
目前想在ZTP800示教器的AWTK程序中實現播放視頻或者播放攝像頭畫面的效果,可以借助AWTK的mutable_image控件或usb_camera控件來顯示畫
【AWTK使用經驗】如何實現序列幀動畫
目前想在AWTK中顯示炫酷流暢的圖片動畫,此時可以用video_image控件來播放序列幀動畫。本篇文章將介紹該控件的原理和使用方法。圖1ZTP800示教器運行v
【AWTK最新動態】AWTK 1.8版本發布
AWTK是一套基于C語言開發的跨平臺GUI框架,目前正式推出1.8版本。本次更新不僅對許多細節進行了優化,還增添了眾多重要特性和文檔資料。此外,還引入了三款創新控件和兩個與AWTK相關項目。A
AWTK 最新動態:支持瀏覽器控件
導讀AWTK瀏覽器控件,基于webview項目實現,將瀏覽器嵌入到AWTK應用程序中,讓開發者可以方便的集成在線幫助和調用地圖等功能。awtk-widget-web-view是基于we
AWTK控件serial_widget的使用方法
評論