把串口做成一個(gè)控件并不新鮮,在VB里有個(gè)通信組件,就是用來簡(jiǎn)化串口編程的。最近AWTK也提供了這樣一個(gè)控件serial_widget,本文介紹一下它的使用方法。
基本功能
我們編寫一個(gè)簡(jiǎn)單的應(yīng)用程序,它有兩個(gè)功能:
- 把收到的數(shù)據(jù)顯示出來。
- 把界面輸入的數(shù)據(jù)發(fā)送給對(duì)方。
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"/>
接收數(shù)據(jù)
?先注冊(cè)數(shù)據(jù)事件的處理函數(shù)。
widget_child_on(win, "serial", EVT_DATA, on_data, win);
?在處理函數(shù)中讀取數(shù)據(jù)并顯示到界面上。
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;
}
發(fā)送數(shù)據(jù)
從界面讀取數(shù)據(jù),并發(fā)送到串口。
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;
}
完整代碼請(qǐng)參考 serial 可以下載 awtk-c-demos 編譯運(yùn)行。
./bin/demo_serial
測(cè)試
下面操作是在 Linux/MacOS 上測(cè)試的,Windows 下需要安裝虛擬串口軟件,具體做法有些不同,請(qǐng)自行調(diào)整。
?使用socat創(chuàng)建虛擬串口
socat -d -d pty,raw,echo=0 pty,raw,echo=0
該命令會(huì)生成兩個(gè)設(shè)備文件,對(duì)應(yīng)串口的兩端(每次生成的設(shè)備名可能不同)。
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 這端我們使用設(shè)備/dev/ttys032?在另外一端讀取數(shù)據(jù)
打開一個(gè)新的終端,并運(yùn)行下面的命令(有數(shù)據(jù)時(shí)自動(dòng)顯示出來):
cat /dev/ttys033
?在另外一端發(fā)送數(shù)據(jù)
打開一個(gè)新的終端,并運(yùn)行下面的命令(發(fā)送當(dāng)前時(shí)間字符串):
date >/dev/ttys033
使用fscript進(jìn)行串口編程
"打開設(shè)備" 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 根目錄下可以運(yùn)行該例子,測(cè)試方法與前面相同。
./bin/preview_ui design/default/ui/serial.xml
移植
目前串口只實(shí)現(xiàn)了Windows, Linux, MacOS, Android 和 AWorks 等平臺(tái),其它平臺(tái)需要自己移植。
請(qǐng)參考AWorks平臺(tái)的移植:
src/platforms/aworkslp/serial_helper.c
審核編輯:湯梓紅-
通信
+關(guān)注
關(guān)注
18文章
6024瀏覽量
135949 -
串口
+關(guān)注
關(guān)注
14文章
1551瀏覽量
76421
原文標(biāo)題:【Z站推薦】AWTK最新動(dòng)態(tài):使用serial_widget簡(jiǎn)化串口編程
文章出處:【微信號(hào):ZLG_zhiyuan,微信公眾號(hào):ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論