把串口做成一個控件并不新鮮,在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進行串口編程
也可以使用 fscript 進行串口編程(配合 AWBlock 就簡單了)。AWTK 里提供一個與前面功能相同的例子,總體來看要簡潔不少。
"打開設備" 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
【版權聲明】本文為ZLG開發者社區用戶原創內容,未經授權不得轉載。
-
串口通信
+關注
關注
34文章
1662瀏覽量
57960
發布評論請先 登錄
Zilog Z80C30/Z85C30 SCC:高性能串行通信控制器的深度解析
深入解析Zilog Z80C30/Z85C30:多功能串口通信控制器的技術精髓
深入剖析Z80C30/Z85C30 CMOS SCC串行通信控制器
【EASY EAI】基于瑞芯微RV1126B的串口調試
【EASY EAI】基于瑞芯微RV1126B 的串口調試說明
從站模擬秘籍:Air8000實現Modbus服務器的深度教程
【CW32】uart_obj_fw 輕量級串口框架
普源示波器DS1102Z-E調試串口通信信號
穩聯技術的Profinet轉Modbus轉換網關與信捷PLC從站的連接配置進行了案例分析
上海泗博網關ENS-317——解鎖串口設備數據直通 Modbus TCP 網絡
PLC與從站遠距離通信:PXB-6030D的妙用
PLC串口資源受限?用PXB-6030D輕松解決
串口網關是什么
AWTK,開啟屬于你的GUI之美
還在為工業網關的ETHERNET/IP從站配置和CANopen主站設置感到困擾?本文將為您詳細解析工業協議轉換的配置技巧
【Z站推薦】AWTK最新動態:使用serial_widget簡化串口編程
評論