1. 程式人生 > >嵌入式Linux基於Qt開發串列埠應用

嵌入式Linux基於Qt開發串列埠應用

By Toradex秦海

1). 簡介

基於Embedded Linux系統的嵌入式裝置使用跨平臺GUI開發工具Qt來開發嵌入式應用已經非常普遍,本文就以分別通過原生C語言方式和使用Qt QSerialPort控制元件方式來進行RS232/RS485串列埠應用的開發示例。

本文所演示的平臺來自於Toradex Colibri iMX6DL ARM嵌入式平臺,這是一個基於NXP iMX6DL ARM處理器,支援雙核Cortex-A9。

2. 準備

b). Colibri iMX6DL系統使用基於OpenEmbedded框架重新編譯的整合Qt5.5 的Toradex Linux image releaseV2.6.1版本以及對應的SDK.這個可以結合

這裡的說明自己進行編譯, 也可以通過這裡直接下載編譯好的image和SDK檔案,image更新方法請參考這裡

c). 關於開發主機SDK安裝和qtcreator開發環境的配置請參考之前釋出的《嵌入式Linux基於Qt開發GPIO應用一文》。

3). 串列埠硬體連線

a). Colibri iMX6S核心版預設定義提供了三個串列埠,如下所示,其中UART1為預設的除錯串列埠,當然可以通過uboot設定關閉除錯串列埠或者指定另外一個串列埠作為除錯串列埠。

b). Colibri Eva Board X25 Top DB9聯結器預設為UART2介面RS232電平輸出,可以連線到Ubuntu開發主機進行UART2串列埠測試。另外,通過載板跳線測試也可以將UART3串列埠路由到X25 bottom DB9聯結器上面,具體說明可以參考

這裡

c). Colibri iMX6 UART除了RS232模式,也支援RS422/485模式,這裡還是利用UART2來測試RS485半雙工模式通訊,基於Colibri Eva Board的硬體連線如下:

./ 將Colibri Eva Board聯結器X2 bottom DB9 管腳4(RXD+),管腳5(RXD-)以及管腳1(GND)和PC主機485介面裝置對接

./ 將Colibri Eva Board下面幾個跳線做如下設定:

   JP11 短接 – 讓485介面可以傳送以及接收收據,如果斷開,則只能傳送資料

   JP12,JP14斷開 – 用於插入120ohm終端電阻,針對RS-422模式

   JP13,JP15短接 – 設定為半雙工模式,如果斷開,則為全雙工模式

   JP16短接 – UART2到RS232的功能關閉,切換到RS485功能;斷開則反之。

4). RS485功能使能方法

a).在device tree中使能,。

//參考這裡下載Toradex Linux kernel V2.6版本原始碼,根據如下patch檔案修改arch/arm/boot/dts/imx6dl-colibri-eval-v3.dts檔案,並參考這裡編譯新的dtb檔案後部署到Colibri iMX6模組上。

這種使能後在應用程式就不需要針對485做使能處理了。

b). 利用ioctrl TIOCSRS485在應用程式中使能,具體程式碼可以參考下面例項。

5). 基於原生C語言操作串列埠Qt widget應用示例

a). Qtcreator 建立一個新專案”uarttest”, New Project-> Applications -> Qt Widgets Application -> Location (任意) -> Kit (針對Colibri imx6的kit) -> Class Information (預設)

b). 在專案中首先新增串列埠基本操作的header和source檔案

./ Header 檔案程式碼如下,主要定義一些全域性環境變數和宣告UART基本的操作函式

./ source檔案程式碼如下,主要是UART基本操作函式,包含open/close, config, 485 enable,read, write等。

c). 進入Forms -> mainwindow.ui, 如下編輯介面, 同時通過”go to slot”新增”SendButton”, ”ReceiveButton”和”SubmitButton”的”clicked”動作函式。

d). 修改mainwindow header和source檔案, 實現UART串列埠的開啟,配置以及讀取控制

./ Hearder檔案程式碼如下,宣告介面buttons,lineedits,lable變數以及串列埠控制所需的全域性變數

./ source檔案程式碼如下, 在視窗初始化的時候先隱藏”Send”和”Receive” button以及對應的輸入輸出框,先根據Lable輸出提示輸入需要除錯的UART裝置名,點選”Submit”按鍵會完成開啟並配置串列埠的操作,這裡串列埠配置引數為”1152008N1”,同時顯示傳送接收按鈕,可以分別點選實現傳送和接收功能測試。

./ 注意,預設是通過” uart_485()” 在 ” void MainWindow::on_SubmitButton_clicked()” 中使能了485模式,如果測試RS232或者通過device tree方式使能了485,則可以將這部分註釋掉

e). 編譯應用程式, 將編譯好的可執行檔案scp複製到Colibri iMX6模組系統上面執行,效果如下:

6). 基於QSerialPort控制元件操作串列埠Qt widget應用示例

a). Qtcreator 建立一個新專案”qtserialtest”, New Project-> Applications -> Qt Widgets Application -> Location (任意) -> Kit (針對Colibri imx6的kit) -> Class Information (預設)

b). 編輯介面保持和上面5章節應用介面完全一致。

c). 修改mainwindow header和source檔案, 實現UART串列埠的開啟,配置以及讀取控制

./ Hearder檔案程式碼如下,區別主要是添加了”QSerialPort”和”QTimer”標頭檔案和相關變數,以及兩個槽函式”void uartread()”和”void readtimeout()”

./ source檔案程式碼如下, 同樣在視窗初始化的時候先隱藏”Send”和”Receive” button以及對應的輸入輸出框,先根據Lable輸出提示輸入需要除錯的UART裝置名,點選”Submit”按鍵會通過QSerialPort控制元件相關操作函式開啟並配置串列埠,這裡串列埠配置引數為”1152008N1”,同時顯示傳送接收按鈕,然後可以分別點選實現傳送和接收功能測試。

./ 注意,如果測試RS485,需要通過上面章節4第一種方法通過device tree使能485

./ 通過對比可以發現,通過QSerialPort控制元件操作更簡單,其定義了很多現成的操作可以實現非常方便的串列埠操作,尤其在Receive方面,通過”SIGNAL(readyRead())和”Slot(uartread())”函式的connect以及”SIGNAL(timeout())和”Slot(readtimeout())”函式的connect,非常方便的實現了資料接收和Timeout延時的處理。

d). 編譯部署執行結果和上面章節5類似。

7). 總結

本文基於NXP iMX6嵌入式平臺在嵌入式linux系統下測試基於Qt開發UART通訊應用,對比了使用原生C程式碼從底層操作UART裝置和使用QSerialPort控制元件操作UART。