AWorksLP 對外設(shè)進行了高度抽象化,為同一類外設(shè)提供了相同的接口,應(yīng)用程序可以輕松跨平臺。本文以MR6450平臺為例,介紹AWorksLP UART 外設(shè)基本用法。
?簡介
UART(Universal Asynchronous Receiver/Transmitter)是一種通用異步收發(fā)傳輸器,其使用串行的方式在雙機之間進行數(shù)據(jù)交換,實現(xiàn)全雙工通信。數(shù)據(jù)引腳僅包含用于接收數(shù)據(jù)的RXD和用于發(fā)送數(shù)據(jù)的TXD。數(shù)據(jù)在數(shù)據(jù)線上一位一位的串行傳輸,要正確解析這些數(shù)據(jù),必須遵循UART協(xié)議,以下簡述幾個關(guān)鍵的概念:
- 波特率
波特率決定了數(shù)據(jù)傳輸速率,其表示每秒傳送數(shù)據(jù)的位數(shù),值越大,數(shù)據(jù)通信的速率越高,數(shù)據(jù)傳輸?shù)迷娇臁3R姷牟ㄌ芈视?800、9600、14400、19200、38400、115200等等,若波特率為115200,則表示每秒鐘可以傳輸115200位(注意:是bit,不是byte)數(shù)據(jù)。
- 空閑位
數(shù)據(jù)線上沒有數(shù)據(jù)傳輸時,數(shù)據(jù)線處于空閑狀態(tài)。空閑狀態(tài)的電平邏輯為“1”。
- 起始位起始位表示一幀數(shù)據(jù)傳輸?shù)拈_始,起始位的電平邏輯是“0”。
數(shù)據(jù)位
- 緊接起始位后,即為實際通信傳輸?shù)臄?shù)據(jù),數(shù)據(jù)的位數(shù)可以是5、6、7、8等,數(shù)據(jù)傳輸時,從最低位開始依次傳輸。
奇偶校驗位
- 奇偶校驗位用于接收方對數(shù)據(jù)進行校驗,及時發(fā)現(xiàn)由于通信故障等問題造成的錯誤數(shù)據(jù)。奇偶校驗位是可選的,可以不使用奇偶校驗位。奇偶校驗有奇校驗和偶校驗兩種形式,該位的邏輯電平與校驗方法和所有數(shù)據(jù)位中邏輯“1”的個數(shù)相關(guān)。
1. 奇校驗:通過設(shè)置該位的值(“1”或“0”),使該位和數(shù)據(jù)位中邏輯“1”的總個數(shù)為奇數(shù)。例如,數(shù)據(jù)位為8位,值為:10011001,“1”的個數(shù)為4個(偶數(shù)),則奇校驗時,為了使“1”的個數(shù)為奇數(shù),就要設(shè)置奇偶校驗位的值為“1”,使“1”的總個數(shù)為5個(奇數(shù))。
2. 偶校驗:通過設(shè)置該位的值(“1”或“0”),使該位和數(shù)據(jù)位中邏輯“1”的總個數(shù)為偶數(shù)。例如,數(shù)據(jù)位為8位,值為:10011001,“1”的個數(shù)為4個(偶數(shù)),則偶校驗時,為了使“1”的個數(shù)為偶數(shù),就要設(shè)置奇偶校驗位的值為0,使“1”的個數(shù)保持不變,為4(偶數(shù))。
通信雙方使用的校驗方法應(yīng)該一致,接收方通過判斷“1”的個數(shù)是否為奇數(shù)(奇校驗)或偶數(shù)(偶校驗)來判定數(shù)據(jù)在通信過程中是否出錯。
停止位
- 停止位表示一幀數(shù)據(jù)的結(jié)束,其電平邏輯為“1”,其寬度可以是1位、1.5位、2位。即其持續(xù)的時間為位數(shù)乘以傳輸一位的時間(由波特率決定),例如,波特率為115200,則傳輸一位的時間為1/115200秒,約為8.68us。若停止位的寬度為1.5位,則表示停止位持續(xù)的時間為:1.5 × 8.68us ≈ 13us。
常見的幀格式為:1位起始位,8位數(shù)據(jù)位,無校驗,1位停止位。由于起始位的寬度恒為1位,不會變化,而數(shù)據(jù)位,校驗位和停止位都是可變的,因此,往往在描述串口通信協(xié)議時,都只是描述其波特率、數(shù)據(jù)位,校驗位和停止位,不再單獨說明起始位。
注意:
通信雙方必須使用完全相同的配置,包括波特率、起始位、數(shù)據(jù)位、停止位等。如果配置不一致,則通信數(shù)據(jù)會錯亂,不能正常通信。在通信中,若出現(xiàn)亂碼的情況,應(yīng)該首先檢查通信雙方所使用的配置是否一致。
?接口介紹
表1 函數(shù)列表
函數(shù)原型 | 簡要描述 |
aw_err_t aw_serial_flush_read (int fd); | 串口刷新讀取 |
aw_err_t aw_serial_dcb_set (int fd, const struct aw_serial_dcb *p_dcb); | 配置串口設(shè)備參數(shù) |
aw_err_t aw_serial_dcb_get (int fd, struct aw_serial_dcb *p_dcb); | 獲取串口設(shè)備配置參數(shù) |
aw_err_t aw_serial_timeout_set (int fd, struct aw_serial_timeout *p_cfg); | 配置超時參數(shù) |
aw_err_t aw_serial_timeout_get (int fd, struct aw_serial_timeout *p_cfg); | 獲取超時參數(shù) |
下表為UART接口相關(guān)結(jié)構(gòu)體類型。表2 結(jié)構(gòu)體類型表
類型 | 簡要描述 |
struct aw_serial_dcb | 串口配置結(jié)構(gòu)描述 |
struct aw_serial_timeout | 串口超時設(shè)置 |
UART 配置信息說明:
1. aw_serial_dcb:
struct aw_serial_dcb { uint32_t baud_rate; uint32_t byte_size:4; uint32_t f_parity:1; uint32_t parity:1; uint32_t stop_bits:2; uint32_t f_ctsflow:1; uint32_t f_rtsctrl:2; uint32_t f_dsrsensitivity:1; uint32_t f_dsrflow:1; uint32_t f_dtrctrl:2; uint32_t f_outx:1; uint32_t f_inx:1; uint32_t f_fast_respond_recv:1; uint32_t f_dummy:14; uint16_t xon_lim; uint16_t xoff_lim; char xon_char; char xoff_char;};
成員詳解:
baud_rate:波特率;
byte_size:數(shù)據(jù)位寬度,范圍:[5:8];
f_parity:奇偶校驗,1:使能0:禁能;
parity:校驗方法;
表3 串口校驗方法取值表
宏定義 | 含義 |
AW_SERIAL_EVENPARITY | 偶效驗 |
AW_SERIAL_ODDPARITY | 奇效驗 |
- stop_bits:停止位數(shù);
表4 串口停止位數(shù)取值表
宏定義 | 含義 |
AW_SERIAL_ONESTOPBIT | 1 位停止位 |
AW_SERIAL_ONE5STOPTS | 1.5 位停止位 |
AW_SERIAL_TWOSTOPBITS | 2 位停止位 |
AW_SERIAL_STOP_INVALID | 0 表示無效停止位 |
- f_ctsflow:監(jiān)控CTS(clear-to-send)信號作輸出流控,1:CTS無效時數(shù)據(jù)發(fā)送被掛起,0:禁能;
- f_rtsctrl:設(shè)置RTS(request-to-send)流控;
表5 串口設(shè)備RTS(request-to-send)流控取值表
宏定義 | 含義 |
AW_SERIAL_RTS_HANDSHAKE | 硬件流控 |
AW_SERIAL_RTS_DISABLE | 軟件控制RTS無效 |
AW_SERIAL_RTS_ENABLE | 軟件控制RTS有效 |
AW_SERIAL_RTS_INVALID | 無效RTS |
- f_dsrsensitivity:設(shè)置dsr_sensitivity,1:對DSR信號敏感,除非DSR信號有效,否則將忽略所有接收的字節(jié);
- f_dsrflow:是否監(jiān)控DSR(data-set-ready信號來做輸出流控),1:若DSR無效時數(shù)據(jù)發(fā)送被掛起,直至DSR有效;
- f_dtrctrl:設(shè)置DTR(data-termial-ready)流控;
表6 串口設(shè)備DTR(data-terminal-ready)流控取值表
宏定義 | 含義 |
AW_SERIAL_DTR_HANDSHAKE | 硬件流控 |
AW_SERIAL_DTR_DISABLE | 軟件控制DTR無效 |
AW_SERIAL_DTR_ENABLE | 軟件控制DTR有效 |
AW_SERIAL_DTR_INVALID | 無效DTR |
- f_outx:XON/XOFF流量控制在發(fā)送時是否可用。1:當(dāng)xoff值被收到時,發(fā)送停止;當(dāng)xon值被收到時,發(fā)送繼續(xù);
- f_inx:XON/XOFF流量控制在接收時是否可用。1:當(dāng)接收緩沖區(qū)中空余容量小于xoff_lim字節(jié)時,發(fā)送xoff字符;當(dāng)接收緩沖區(qū)中已有xon_lim字節(jié)的空余容量時,發(fā)送xon字符,占1位;
- f_fast_respond_recv:快速響應(yīng)接收 1:使能0:禁能;
注解:
1.該配置項適用于接收時間敏感型應(yīng)用,例如modbus;
2.該配置項實現(xiàn)通用的手段是將串口接收FIFO設(shè)置為1,當(dāng)接收到一個數(shù)據(jù)后就產(chǎn)生接收中斷。對于沒有FIFO的串口來說,這個設(shè)置也許會被忽略。
f_dummy:保留位;
- xon_lim:在XON字符發(fā)送前接收緩沖區(qū)內(nèi)空余容量的最小字節(jié)數(shù);
- xoff_lim:在XOFF字符發(fā)送前接收緩沖區(qū)內(nèi)空余容量的最大字節(jié)數(shù);
- xon_char:指定XON字符;
- xoff_char:指定XOFF字符。
2. aw_serial_timeout:
struct aw_serial_timeout { uint32_t rd_timeout; uint32_t rd_interval_timeout;}
成員詳解:
rd_timeout:讀超時時間;
rd_interval_timeout:碼間超時。
?使用樣例
AWorksLP SDK相關(guān)使用請參考《AWorksLP SDK快速入門(MR6450)——開箱體驗》一文,本文不在贅述。
?1. UART0收發(fā)功能
{SDK}\demos\peripheral\ serial路徑下為通用UART例程,例程具體代碼如下:
#include "aworks.h"#include "aw_task.h"#include "aw_delay.h"#include "aw_serial.h"#include "aw_ioctl.h"#include "aw_fcntl.h"#include "aw_application_autoconf.h"#include "aw_unistd.h"#include "aw_vdebug.h"#include "rtk_autoconf.h"/** * \brief 串口 demo * \return 無 */aw_local void* __task_handle (void *parg){ char buf[32]; int len = 0; struct aw_serial_dcb dcb; aw_err_t ret; struct aw_serial_timeout timeout; int fd;
fd = aw_open(CONFIG_DEMO_SERIAL_DEVICE_NAME,AW_O_RDWR,0); if(fd < 0){ aw_kprintf("serial open failed\r\n"); aw_close(fd); return 0; }
/* 獲取dcb的默認(rèn)配置 */ ret = aw_serial_dcb_get(fd, &dcb); if (AW_OK != ret) { aw_kprintf("serial get dcb failed: %d \r\n",ret); aw_close(fd); return 0; }
/* 配置串口波特率為115200,8個數(shù)據(jù)位,1位停止位,無奇偶校驗 */ dcb.baud_rate = 115200; dcb.byte_size = 8; dcb.stop_bits = AW_SERIAL_ONESTOPBIT; dcb.f_parity = AW_FALSE; ret = aw_serial_dcb_set(fd, &dcb); if (AW_OK != ret) { aw_kprintf("serial set dcb failed: %d \r\n",ret); aw_close(fd); return 0; }
/* 配置串口超時 */ ret = aw_serial_timeout_get(fd, &timeout); if (AW_OK != ret) { aw_kprintf("serial get timeout failed: %d \r\n",ret); aw_close(fd); return 0; }
timeout.rd_timeout = 1000; /* 讀總超時為1s */ timeout.rd_interval_timeout = 50; /* 碼間超時為50ms */ ret = aw_serial_timeout_set(fd, &timeout); if (AW_OK != ret) { aw_kprintf("serial set dcb failed: %d \r\n",ret); aw_close(fd); return 0; }
/* 收到什么數(shù)據(jù)就發(fā)送什么數(shù)據(jù) */ AW_FOREVER { /* 讀取數(shù)據(jù) */ memset(buf, 0, sizeof(buf)); len = aw_read(fd, buf, sizeof(buf)); if (len > 0) { aw_write(fd, buf, len); aw_kprintf("%s\r\n",buf); } }
aw_close(fd); return 0;}
AW_TASK_DECL(serial_tsk, 4096);/******************************************************************************/void demo_serial_int_entry (void){ aw_task_id_t tsk;
tsk = AW_TASK_INIT( serial_tsk, "Serial int demo", 12, 4096, __task_handle, (void *)NULL); if (tsk == NULL) { aw_kprintf("Serial int demo task create failed\r\n"); return; }
if (aw_task_startup(tsk) != AW_OK) { AW_TASK_TERMINATE(serial_tsk); }}
例程默認(rèn)使用/dev/uart0對應(yīng)開發(fā)板DUART絲印串口,其引腳位置如圖1所示:
圖1UART0排針
上述代碼中創(chuàng)建了一個任務(wù),在任務(wù)中實現(xiàn)UART收發(fā)功能。使用aw_serial_dcb_get接口獲取串口當(dāng)前的配置信息,修改波特率為115200,8個數(shù)據(jù)位,1位停止位,無奇偶校驗。使用aw_serial_dcb_set接口設(shè)置串口。使用aw_serial_timeout_get獲取串口時間相關(guān)配置信息,修改讀總超時為1s,碼間超時為50ms,使用aw_serial_timeout_set設(shè)置串口。
在AW_FOREVER 循環(huán)中使用aw_read接口讀取接收到的串口數(shù)據(jù),若讀取到數(shù)據(jù)則使用aw_write接口把讀取到數(shù)據(jù)通過該串口發(fā)送回去,以此來實現(xiàn)回顯功能。
但由于/dev/uart0默認(rèn)為shell所使用的串口,在shell組件中已開啟回顯,故此時實驗現(xiàn)象如圖2所示,會將接收到的數(shù)據(jù)輸出兩次,若需實現(xiàn)單次回顯,可修改shell組件所引用串口,或修改例程使用的UART設(shè)備,具體操作參考下節(jié)內(nèi)容。
圖2串口打印結(jié)果
2. UART5收發(fā)功能
串口例程中默認(rèn)使用的是/dev/uart0,為與例程現(xiàn)象描述一致,故將其修改為/dev/uart5。在開發(fā)板絲印URX1與UTX1對應(yīng)設(shè)備/dev/uart5,URX2與UTX2對應(yīng)設(shè)備為/dev/uart10,如圖3、圖4、圖5所示。
圖3排針處串口
圖4排針原理圖
圖5UART1對應(yīng)UART5
2.1 打開config 配置腳本,選擇例程使用串口為/dev/uart5, 如圖6所示,保存后重新build 工程。
圖6UART1對應(yīng)UART5
2.2 將USB 轉(zhuǎn)串口接到開發(fā)板排針絲印UTX1與URX1 的位置,重新編譯下載運行固件,會發(fā)現(xiàn)發(fā)送數(shù)據(jù)后不會再重復(fù)回復(fù)兩條相同的數(shù)據(jù)如圖7所示。
圖7串口打印信息
至此,UART設(shè)備的收發(fā)功能介紹完畢,更多外設(shè)的使用介紹請關(guān)注后續(xù)推文。
-
通信
+關(guān)注
關(guān)注
18文章
6046瀏覽量
136206 -
uart
+關(guān)注
關(guān)注
22文章
1242瀏覽量
101532
發(fā)布評論請先 登錄
相關(guān)推薦
評論