• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# UART<a name="ZH-CN_TOPIC_0000001052215244"></a>
2
3-   [概述](#section833012453535)
4    -   [接口说明](#section1680292311549)
5
6-   [使用指导](#section12779050105412)
7    -   [使用流程](#section1858116395510)
8    -   [获取UART设备句柄](#section124512065617)
9    -   [UART设置波特率](#section86881004579)
10    -   [UART获取波特率](#section897032965712)
11    -   [UART设置设备属性](#section129141884588)
12    -   [UART获取设备属性](#section18689637165812)
13    -   [设置UART传输模式](#section72713435918)
14    -   [向UART设备写入指定长度的数据](#section128001736155919)
15    -   [从UART设备中读取指定长度的数据](#section92851601604)
16    -   [销毁UART设备句柄](#section1477410521406)
17
18-   [使用实例](#section35404241311)
19
20## 概述<a name="section833012453535"></a>
21
22-   UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的缩写,是通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输。
23-   UART应用比较广泛,常用于输出打印信息,也可以外接各种模块,如GPS、蓝牙等。
24-   两个UART设备的连接示意图如下,UART与其他模块一般用2线(图1)或4线(图2)相连,它们分别是:
25    -   TX:发送数据端,和对端的RX相连;
26    -   RX:接收数据端,和对端的TX相连;
27    -   RTS:发送请求信号,用于指示本设备是否准备好,可接受数据,和对端CTS相连;
28    -   CTS:允许发送信号,用于判断是否可以向对端发送数据,和对端RTS相连;
29
30        **图 1**  2线UART设备连接示意图<a name="fig209936401896"></a>
31
32
33        ![](figure/zh-cn_image_0000001170262141.png)
34
35        **图 2**  4线UART设备连接示意图<a name="fig1435614171015"></a>
36
37
38        ![](figure/zh-cn_image_0000001123582482.png)
39
40
41-   UART通信之前,收发双方需要约定好一些参数:波特率、数据格式(起始位、数据位、校验位、停止位)等。通信过程中,UART通过TX发送给对端数据,通过RX接收对端发送的数据。当UART接收缓存达到预定的门限值时,RTS变为不可发送数据,对端的CTS检测到不可发送数据,则停止发送数据。
42-   UART接口定义了操作UART端口的通用方法集合,包括获取、释放设备句柄、读写数据、获取和设置波特率、获取和设置设备属性。
43
44### 接口说明<a name="section1680292311549"></a>
45
46**表 1**  UART驱动API接口功能介绍
47
48<a name="table1731550155318"></a>
49<table><thead align="left"><tr id="row1223152681611"><th class="cellrowborder" valign="top" width="26.619999999999997%" id="mcps1.2.4.1.1"><p id="p210413571619"><a name="p210413571619"></a><a name="p210413571619"></a>功能分类</p>
50</th>
51<th class="cellrowborder" valign="top" width="31.369999999999997%" id="mcps1.2.4.1.2"><p id="p810403511614"><a name="p810403511614"></a><a name="p810403511614"></a>接口名</p>
52</th>
53<th class="cellrowborder" valign="top" width="42.01%" id="mcps1.2.4.1.3"><p id="p110418354161"><a name="p110418354161"></a><a name="p110418354161"></a>描述</p>
54</th>
55</tr>
56</thead>
57<tbody><tr id="row1638573613415"><td class="cellrowborder" rowspan="2" valign="top" width="26.619999999999997%" headers="mcps1.2.4.1.1 "><p id="p917154316414"><a name="p917154316414"></a><a name="p917154316414"></a>UART获取/释放设备句柄</p>
58<p id="p9596111154212"><a name="p9596111154212"></a><a name="p9596111154212"></a></p>
59</td>
60<td class="cellrowborder" valign="top" width="31.369999999999997%" headers="mcps1.2.4.1.2 "><p id="p20385163614412"><a name="p20385163614412"></a><a name="p20385163614412"></a>UartOpen</p>
61</td>
62<td class="cellrowborder" valign="top" width="42.01%" headers="mcps1.2.4.1.3 "><p id="p12101135184213"><a name="p12101135184213"></a><a name="p12101135184213"></a>UART获取设备句柄</p>
63</td>
64</tr>
65<tr id="row5950143316415"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p149501733134113"><a name="p149501733134113"></a><a name="p149501733134113"></a>UartClose</p>
66</td>
67<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p371073520422"><a name="p371073520422"></a><a name="p371073520422"></a>UART释放设备句柄</p>
68</td>
69</tr>
70<tr id="row34145016535"><td class="cellrowborder" rowspan="2" valign="top" width="26.619999999999997%" headers="mcps1.2.4.1.1 "><p id="p229610227124"><a name="p229610227124"></a><a name="p229610227124"></a>UART读写接口</p>
71<p id="p131072201215"><a name="p131072201215"></a><a name="p131072201215"></a></p>
72</td>
73<td class="cellrowborder" valign="top" width="31.369999999999997%" headers="mcps1.2.4.1.2 "><p id="p8296182221219"><a name="p8296182221219"></a><a name="p8296182221219"></a>UartRead</p>
74</td>
75<td class="cellrowborder" valign="top" width="42.01%" headers="mcps1.2.4.1.3 "><p id="p16297172213125"><a name="p16297172213125"></a><a name="p16297172213125"></a>从UART设备中读取指定长度的数据</p>
76</td>
77</tr>
78<tr id="row11585016539"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p1095722493616"><a name="p1095722493616"></a><a name="p1095722493616"></a>UartWrite</p>
79</td>
80<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p15297162215122"><a name="p15297162215122"></a><a name="p15297162215122"></a>向UART设备中写入指定长度的数据</p>
81</td>
82</tr>
83<tr id="row8687115843715"><td class="cellrowborder" rowspan="2" valign="top" width="26.619999999999997%" headers="mcps1.2.4.1.1 "><p id="p196317143813"><a name="p196317143813"></a><a name="p196317143813"></a>UART获取/设置波特率接口</p>
84</td>
85<td class="cellrowborder" valign="top" width="31.369999999999997%" headers="mcps1.2.4.1.2 "><p id="p166885582375"><a name="p166885582375"></a><a name="p166885582375"></a>UartGetBaud</p>
86</td>
87<td class="cellrowborder" valign="top" width="42.01%" headers="mcps1.2.4.1.3 "><p id="p13688358183716"><a name="p13688358183716"></a><a name="p13688358183716"></a>UART获取波特率</p>
88</td>
89</tr>
90<tr id="row18987529382"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p698719214383"><a name="p698719214383"></a><a name="p698719214383"></a>UartSetBaud</p>
91</td>
92<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p1398712123810"><a name="p1398712123810"></a><a name="p1398712123810"></a>UART设置波特率</p>
93</td>
94</tr>
95<tr id="row1551850115317"><td class="cellrowborder" rowspan="2" valign="top" width="26.619999999999997%" headers="mcps1.2.4.1.1 "><p id="p1629782201218"><a name="p1629782201218"></a><a name="p1629782201218"></a>UART获取/设置设备属性</p>
96<p id="p10308192211216"><a name="p10308192211216"></a><a name="p10308192211216"></a></p>
97</td>
98<td class="cellrowborder" valign="top" width="31.369999999999997%" headers="mcps1.2.4.1.2 "><p id="p32972022151218"><a name="p32972022151218"></a><a name="p32972022151218"></a>UartGetAttribute</p>
99</td>
100<td class="cellrowborder" valign="top" width="42.01%" headers="mcps1.2.4.1.3 "><p id="p13297122216123"><a name="p13297122216123"></a><a name="p13297122216123"></a>UART获取设备属性</p>
101</td>
102</tr>
103<tr id="row7545065311"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p102974224120"><a name="p102974224120"></a><a name="p102974224120"></a>UartSetAttribute</p>
104</td>
105<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p152971322111219"><a name="p152971322111219"></a><a name="p152971322111219"></a>UART设置设备属性</p>
106</td>
107</tr>
108<tr id="row14614115403"><td class="cellrowborder" valign="top" width="26.619999999999997%" headers="mcps1.2.4.1.1 "><p id="p1746281144010"><a name="p1746281144010"></a><a name="p1746281144010"></a>UART设置传输模式</p>
109</td>
110<td class="cellrowborder" valign="top" width="31.369999999999997%" headers="mcps1.2.4.1.2 "><p id="p1146215112405"><a name="p1146215112405"></a><a name="p1146215112405"></a>UartSetTransMode</p>
111</td>
112<td class="cellrowborder" valign="top" width="42.01%" headers="mcps1.2.4.1.3 "><p id="p11303181216414"><a name="p11303181216414"></a><a name="p11303181216414"></a>UART设置传输模式</p>
113</td>
114</tr>
115</tbody>
116</table>
117
118>![](../public_sys-resources/icon-note.gif) **说明:**
119>本文涉及的所有接口,仅限内核态使用,不支持在用户态使用。
120
121## 使用指导<a name="section12779050105412"></a>
122
123### 使用流程<a name="section1858116395510"></a>
124
125使用UART的一般流程如[图3](#fig1852173020185)所示。
126
127**图 3**  UART使用流程图<a name="fig1852173020185"></a>
128
129
130![](figure/zh-cn_image_0000001170227689.png)
131
132### 获取UART设备句柄<a name="section124512065617"></a>
133
134在使用UART进行通信时,首先要调用UartOpen获取UART设备句柄,该函数会返回指定端口号的UART设备句柄。
135
136DevHandle UartOpen\(uint32\_t port\);
137
138**表 2**  UartOpen参数和返回值描述
139
140<a name="table14222165114310"></a>
141<table><thead align="left"><tr id="row1022175133111"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p13221551153117"><a name="p13221551153117"></a><a name="p13221551153117"></a>参数</p>
142</th>
143<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p122211251103111"><a name="p122211251103111"></a><a name="p122211251103111"></a>参数描述</p>
144</th>
145</tr>
146</thead>
147<tbody><tr id="row6222451133114"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p92221518315"><a name="p92221518315"></a><a name="p92221518315"></a>port</p>
148</td>
149<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1322217518318"><a name="p1322217518318"></a><a name="p1322217518318"></a>UART设备号</p>
150</td>
151</tr>
152<tr id="row1122245153112"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p102221451123118"><a name="p102221451123118"></a><a name="p102221451123118"></a><strong id="b1922235110318"><a name="b1922235110318"></a><a name="b1922235110318"></a>返回值</strong></p>
153</td>
154<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1122215143113"><a name="p1122215143113"></a><a name="p1122215143113"></a><strong id="b19222205193117"><a name="b19222205193117"></a><a name="b19222205193117"></a>返回值描述</strong></p>
155</td>
156</tr>
157<tr id="row522275114317"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p422235114313"><a name="p422235114313"></a><a name="p422235114313"></a>NULL</p>
158</td>
159<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p5222351203112"><a name="p5222351203112"></a><a name="p5222351203112"></a>获取UART设备句柄失败</p>
160</td>
161</tr>
162<tr id="row1222212513311"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p5222125115316"><a name="p5222125115316"></a><a name="p5222125115316"></a>设备句柄</p>
163</td>
164<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p192228515311"><a name="p192228515311"></a><a name="p192228515311"></a>UART设备句柄</p>
165</td>
166</tr>
167</tbody>
168</table>
169
170假设系统中的UART端口号为3,获取该UART设备句柄的示例如下:
171
172```
173DevHandle handle = NULL;    /* UART设备句柄  */
174uint32_t port = 3;                  /* UART设备端口号 */
175handle = UartOpen(port);
176if (handle == NULL) {
177    HDF_LOGE("UartOpen: failed!\n");
178    return;
179}
180```
181
182### UART设置波特率<a name="section86881004579"></a>
183
184在通信之前,需要设置UART的波特率,设置波特率的函数如下所示:
185
186int32\_t UartSetBaud\(DevHandle handle, uint32\_t baudRate\);
187
188**表 3**  UartSetBaud参数和返回值描述
189
190<a name="table539135313325"></a>
191<table><thead align="left"><tr id="row15391205311323"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p11390453103216"><a name="p11390453103216"></a><a name="p11390453103216"></a>参数</p>
192</th>
193<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p839065316328"><a name="p839065316328"></a><a name="p839065316328"></a>参数描述</p>
194</th>
195</tr>
196</thead>
197<tbody><tr id="row2039115373216"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1639165310324"><a name="p1639165310324"></a><a name="p1639165310324"></a>handle</p>
198</td>
199<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p539115320328"><a name="p539115320328"></a><a name="p539115320328"></a>UART设备句柄</p>
200</td>
201</tr>
202<tr id="row163911753143214"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p13911653203215"><a name="p13911653203215"></a><a name="p13911653203215"></a>baudRate</p>
203</td>
204<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p163919537322"><a name="p163919537322"></a><a name="p163919537322"></a>待设置的波特率值</p>
205</td>
206</tr>
207<tr id="row539155343218"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1039185313321"><a name="p1039185313321"></a><a name="p1039185313321"></a><strong id="b139195343217"><a name="b139195343217"></a><a name="b139195343217"></a>返回值</strong></p>
208</td>
209<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p123911753143213"><a name="p123911753143213"></a><a name="p123911753143213"></a><strong id="b143911353163218"><a name="b143911353163218"></a><a name="b143911353163218"></a>返回值描述</strong></p>
210</td>
211</tr>
212<tr id="row2391853153218"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p17391185310322"><a name="p17391185310322"></a><a name="p17391185310322"></a>0</p>
213</td>
214<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p14391653193210"><a name="p14391653193210"></a><a name="p14391653193210"></a>UART设置波特率成功</p>
215</td>
216</tr>
217<tr id="row23912053143211"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p7391165320321"><a name="p7391165320321"></a><a name="p7391165320321"></a>负数</p>
218</td>
219<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p639185318322"><a name="p639185318322"></a><a name="p639185318322"></a>UART设置波特率失败</p>
220</td>
221</tr>
222</tbody>
223</table>
224
225假设需要设置的UART波特率为9600,设置波特率的实例如下:
226
227```
228int32_t ret;
229/* 设置UART波特率 */
230ret = UartSetBaud(handle, 9600);
231if (ret != 0) {
232    HDF_LOGE("UartSetBaud: failed, ret %d\n", ret);
233}
234```
235
236### UART获取波特率<a name="section897032965712"></a>
237
238设置UART的波特率后,可以通过获取波特率接口来查看UART当前的波特率,获取波特率的函数如下所示:
239
240int32\_t UartGetBaud\(DevHandle handle, uint32\_t \*baudRate\);
241
242**表 4**  UartGetBaud参数和返回值描述
243
244<a name="table20393185311326"></a>
245<table><thead align="left"><tr id="row19392653123215"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p6392105315326"><a name="p6392105315326"></a><a name="p6392105315326"></a>参数</p>
246</th>
247<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p53920531329"><a name="p53920531329"></a><a name="p53920531329"></a>参数描述</p>
248</th>
249</tr>
250</thead>
251<tbody><tr id="row103921553103211"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1539220536326"><a name="p1539220536326"></a><a name="p1539220536326"></a>handle</p>
252</td>
253<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p6392553203217"><a name="p6392553203217"></a><a name="p6392553203217"></a>UART设备句柄</p>
254</td>
255</tr>
256<tr id="row1539211532322"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p93921053123210"><a name="p93921053123210"></a><a name="p93921053123210"></a>baudRate</p>
257</td>
258<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p93926536328"><a name="p93926536328"></a><a name="p93926536328"></a>接收波特率值的指针</p>
259</td>
260</tr>
261<tr id="row1239318531326"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p17392653123213"><a name="p17392653123213"></a><a name="p17392653123213"></a><strong id="b3392165383219"><a name="b3392165383219"></a><a name="b3392165383219"></a>返回值</strong></p>
262</td>
263<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1339365316327"><a name="p1339365316327"></a><a name="p1339365316327"></a><strong id="b63932053183218"><a name="b63932053183218"></a><a name="b63932053183218"></a>返回值描述</strong></p>
264</td>
265</tr>
266<tr id="row143939531328"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p2393953153213"><a name="p2393953153213"></a><a name="p2393953153213"></a>0</p>
267</td>
268<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p8393165383218"><a name="p8393165383218"></a><a name="p8393165383218"></a>UART获取波特率成功</p>
269</td>
270</tr>
271<tr id="row5393105363210"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p17393125363215"><a name="p17393125363215"></a><a name="p17393125363215"></a>负数</p>
272</td>
273<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1539325393211"><a name="p1539325393211"></a><a name="p1539325393211"></a>UART获取波特率失败</p>
274</td>
275</tr>
276</tbody>
277</table>
278
279获取波特率的实例如下:
280
281```
282int32_t ret;
283uint32_t baudRate;
284/* 获取UART波特率 */
285ret = UartGetBaud(handle, &baudRate);
286if (ret != 0) {
287    HDF_LOGE("UartGetBaud: failed, ret %d\n", ret);
288}
289```
290
291### UART设置设备属性<a name="section129141884588"></a>
292
293在通信之前,需要设置UART的设备属性,设置设备属性的函数如下图所示:
294
295int32\_t UartSetAttribute\(DevHandle handle, struct UartAttribute \*attribute\);
296
297**表 5**  UartSetAttribute参数和返回值描述
298
299<a name="table1453119335341"></a>
300<table><thead align="left"><tr id="row3530433103416"><th class="cellrowborder" valign="top" width="49.980000000000004%" id="mcps1.2.3.1.1"><p id="p1853073310341"><a name="p1853073310341"></a><a name="p1853073310341"></a>参数</p>
301</th>
302<th class="cellrowborder" valign="top" width="50.019999999999996%" id="mcps1.2.3.1.2"><p id="p553083393417"><a name="p553083393417"></a><a name="p553083393417"></a>参数描述</p>
303</th>
304</tr>
305</thead>
306<tbody><tr id="row55303331347"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p1530113313341"><a name="p1530113313341"></a><a name="p1530113313341"></a>handle</p>
307</td>
308<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p3530173313346"><a name="p3530173313346"></a><a name="p3530173313346"></a>UART设备句柄</p>
309</td>
310</tr>
311<tr id="row45309337342"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p553083319348"><a name="p553083319348"></a><a name="p553083319348"></a>attribute</p>
312</td>
313<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p5530133314343"><a name="p5530133314343"></a><a name="p5530133314343"></a>待设置的设备属性</p>
314</td>
315</tr>
316<tr id="row12530833103415"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p185309331345"><a name="p185309331345"></a><a name="p185309331345"></a><strong id="b145302033193410"><a name="b145302033193410"></a><a name="b145302033193410"></a>返回值</strong></p>
317</td>
318<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p145309332344"><a name="p145309332344"></a><a name="p145309332344"></a><strong id="b553018331348"><a name="b553018331348"></a><a name="b553018331348"></a>返回值描述</strong></p>
319</td>
320</tr>
321<tr id="row14530203310348"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p1653014339343"><a name="p1653014339343"></a><a name="p1653014339343"></a>0</p>
322</td>
323<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p1453023323419"><a name="p1453023323419"></a><a name="p1453023323419"></a>UART设置设备属性成功</p>
324</td>
325</tr>
326<tr id="row6531163373412"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p16530123310345"><a name="p16530123310345"></a><a name="p16530123310345"></a>负数</p>
327</td>
328<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p1953118334347"><a name="p1953118334347"></a><a name="p1953118334347"></a>UART设置设备属性失败</p>
329</td>
330</tr>
331</tbody>
332</table>
333
334设置UART的设备属性的实例如下:
335
336```
337int32_t ret;
338struct UartAttribute attribute;
339attribute.dataBits = UART_ATTR_DATABIT_7;   /* UART传输数据位宽,一次传输7个bit */
340attribute.parity = UART_ATTR_PARITY_NONE;   /* UART传输数据无校检 */
341attribute.stopBits = UART_ATTR_STOPBIT_1;   /* UART传输数据停止位为1位 */
342attribute.rts = UART_ATTR_RTS_DIS;          /* UART禁用RTS */
343attribute.cts = UART_ATTR_CTS_DIS;          /* UART禁用CTS */
344attribute.fifoRxEn = UART_ATTR_RX_FIFO_EN;  /* UART使能RX FIFO */
345attribute.fifoTxEn = UART_ATTR_TX_FIFO_EN;  /* UART使能TX FIFO */
346/* 设置UART设备属性 */
347ret = UartSetAttribute(handle, &attribute);
348if (ret != 0) {
349    HDF_LOGE("UartSetAttribute: failed, ret %d\n", ret);
350}
351```
352
353### UART获取设备属性<a name="section18689637165812"></a>
354
355设置UART的设备属性后,可以通过获取设备属性接口来查看UART当前的设备属性,获取设备属性的函数如下图所示:
356
357int32\_t UartGetAttribute\(DevHandle handle, struct UartAttribute \*attribute\);
358
359**表 6**  UartGetAttribute参数和返回值描述
360
361<a name="table17532123316342"></a>
362<table><thead align="left"><tr id="row18531193383420"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p85311833143420"><a name="p85311833143420"></a><a name="p85311833143420"></a>参数</p>
363</th>
364<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p17531103319348"><a name="p17531103319348"></a><a name="p17531103319348"></a>参数描述</p>
365</th>
366</tr>
367</thead>
368<tbody><tr id="row35311533153413"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p453133333418"><a name="p453133333418"></a><a name="p453133333418"></a>handle</p>
369</td>
370<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p753193323420"><a name="p753193323420"></a><a name="p753193323420"></a>UART设备句柄</p>
371</td>
372</tr>
373<tr id="row1953103315344"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p35315333346"><a name="p35315333346"></a><a name="p35315333346"></a>attribute</p>
374</td>
375<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p14531633133416"><a name="p14531633133416"></a><a name="p14531633133416"></a>接收UART设备属性的指针</p>
376</td>
377</tr>
378<tr id="row45321433143415"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p653273363417"><a name="p653273363417"></a><a name="p653273363417"></a><strong id="b19531153314349"><a name="b19531153314349"></a><a name="b19531153314349"></a>返回值</strong></p>
379</td>
380<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1653203312347"><a name="p1653203312347"></a><a name="p1653203312347"></a><strong id="b185321330348"><a name="b185321330348"></a><a name="b185321330348"></a>返回值描述</strong></p>
381</td>
382</tr>
383<tr id="row175320339342"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p10532163383412"><a name="p10532163383412"></a><a name="p10532163383412"></a>0</p>
384</td>
385<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p5532143319341"><a name="p5532143319341"></a><a name="p5532143319341"></a>UART获取设备属性成功</p>
386</td>
387</tr>
388<tr id="row125327337340"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p19532153317345"><a name="p19532153317345"></a><a name="p19532153317345"></a>负数</p>
389</td>
390<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p175321933163410"><a name="p175321933163410"></a><a name="p175321933163410"></a>UART获取设备属性失败</p>
391</td>
392</tr>
393</tbody>
394</table>
395
396获取UART的设备属性的实例如下:
397
398```
399int32_t ret;
400struct UartAttribute attribute;
401/* 获取UART设备属性 */
402ret = UartGetAttribute(handle, &attribute);
403if (ret != 0) {
404    HDF_LOGE("UartGetAttribute: failed, ret %d\n", ret);
405}
406```
407
408### 设置UART传输模式<a name="section72713435918"></a>
409
410在通信之前,需要设置UART的传输模式,设置传输模式的函数如下图所示:
411
412int32\_t UartSetTransMode\(DevHandle handle, enum UartTransMode mode\);
413
414**表 7**  UartSetTransMode参数和返回值描述
415
416<a name="table131892266313"></a>
417<table><thead align="left"><tr id="row018922615318"><th class="cellrowborder" valign="top" width="49.980000000000004%" id="mcps1.2.3.1.1"><p id="p131891826835"><a name="p131891826835"></a><a name="p131891826835"></a>参数</p>
418</th>
419<th class="cellrowborder" valign="top" width="50.019999999999996%" id="mcps1.2.3.1.2"><p id="p101894269314"><a name="p101894269314"></a><a name="p101894269314"></a>参数描述</p>
420</th>
421</tr>
422</thead>
423<tbody><tr id="row11893261734"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p81897261333"><a name="p81897261333"></a><a name="p81897261333"></a>handle</p>
424</td>
425<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p5190142618310"><a name="p5190142618310"></a><a name="p5190142618310"></a>UART设备句柄</p>
426</td>
427</tr>
428<tr id="row1119082615317"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p1519012261314"><a name="p1519012261314"></a><a name="p1519012261314"></a>mode</p>
429</td>
430<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p121901026632"><a name="p121901026632"></a><a name="p121901026632"></a>待设置的传输模式,</p>
431</td>
432</tr>
433<tr id="row19190152612317"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p131900266316"><a name="p131900266316"></a><a name="p131900266316"></a><strong id="b61902026833"><a name="b61902026833"></a><a name="b61902026833"></a>返回值</strong></p>
434</td>
435<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p1519022616315"><a name="p1519022616315"></a><a name="p1519022616315"></a><strong id="b319014261837"><a name="b319014261837"></a><a name="b319014261837"></a>返回值描述</strong></p>
436</td>
437</tr>
438<tr id="row919016261932"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p10190526334"><a name="p10190526334"></a><a name="p10190526334"></a>0</p>
439</td>
440<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p1219012264318"><a name="p1219012264318"></a><a name="p1219012264318"></a>UART设置传输模式成功</p>
441</td>
442</tr>
443<tr id="row1219017262313"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p15190162616316"><a name="p15190162616316"></a><a name="p15190162616316"></a>负数</p>
444</td>
445<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p131906262311"><a name="p131906262311"></a><a name="p131906262311"></a>UART设置传输模式失败</p>
446</td>
447</tr>
448</tbody>
449</table>
450
451假设需要设置的UART传输模式为UART\_MODE\_RD\_BLOCK,设置传输模式的实例如下:
452
453```
454int32_t ret;
455/* 设置UART传输模式 */
456ret = UartSetTransMode(handle, UART_MODE_RD_BLOCK);
457if (ret != 0) {
458    HDF_LOGE("UartSetTransMode: failed, ret %d\n", ret);
459}
460```
461
462### 向UART设备写入指定长度的数据<a name="section128001736155919"></a>
463
464对应的接口函数如下所示:
465
466int32\_t UartWrite\(DevHandle handle, uint8\_t \*data, uint32\_t size\);
467
468**表 8**  UartWrite参数和返回值描述
469
470<a name="table27825111368"></a>
471<table><thead align="left"><tr id="row1578171123619"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p078112115360"><a name="p078112115360"></a><a name="p078112115360"></a>参数</p>
472</th>
473<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p37811711163612"><a name="p37811711163612"></a><a name="p37811711163612"></a>参数描述</p>
474</th>
475</tr>
476</thead>
477<tbody><tr id="row1878291143611"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p07818112360"><a name="p07818112360"></a><a name="p07818112360"></a>handle</p>
478</td>
479<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p178281113369"><a name="p178281113369"></a><a name="p178281113369"></a>UART设备句柄</p>
480</td>
481</tr>
482<tr id="row7782811123614"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p8782911173610"><a name="p8782911173610"></a><a name="p8782911173610"></a>data</p>
483</td>
484<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p17782171120366"><a name="p17782171120366"></a><a name="p17782171120366"></a>待写入数据的指针</p>
485</td>
486</tr>
487<tr id="row1578251112367"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p3782911183612"><a name="p3782911183612"></a><a name="p3782911183612"></a>size</p>
488</td>
489<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p17782161110366"><a name="p17782161110366"></a><a name="p17782161110366"></a>待写入数据的长度</p>
490</td>
491</tr>
492<tr id="row1378281113363"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p87821411183616"><a name="p87821411183616"></a><a name="p87821411183616"></a><strong id="b157825113363"><a name="b157825113363"></a><a name="b157825113363"></a>返回值</strong></p>
493</td>
494<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p13782111116361"><a name="p13782111116361"></a><a name="p13782111116361"></a><strong id="b978211113366"><a name="b978211113366"></a><a name="b978211113366"></a>返回值描述</strong></p>
495</td>
496</tr>
497<tr id="row47822112365"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p107821011103613"><a name="p107821011103613"></a><a name="p107821011103613"></a>0</p>
498</td>
499<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p11782191103610"><a name="p11782191103610"></a><a name="p11782191103610"></a>UART写数据成功</p>
500</td>
501</tr>
502<tr id="row11782911113611"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1578221111367"><a name="p1578221111367"></a><a name="p1578221111367"></a>负数</p>
503</td>
504<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p9782151110366"><a name="p9782151110366"></a><a name="p9782151110366"></a>UART写数据失败</p>
505</td>
506</tr>
507</tbody>
508</table>
509
510写入指定长度数据的实例如下:
511
512```
513int32_t ret;
514uint8_t wbuff[5] = {1, 2, 3, 4, 5};
515/* 向UART设备写入指定长度的数据 */
516ret = UartWrite(handle, wbuff, 5);
517if (ret != 0) {
518    HDF_LOGE("UartWrite: failed, ret %d\n", ret);
519}
520```
521
522### 从UART设备中读取指定长度的数据<a name="section92851601604"></a>
523
524对应的接口函数如下所示:
525
526int32\_t UartRead\(DevHandle handle, uint8\_t \*data, uint32\_t size\);
527
528**表 9**  UartRead参数和返回值描述
529
530<a name="table162341717123713"></a>
531<table><thead align="left"><tr id="row023313171377"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p1123331710376"><a name="p1123331710376"></a><a name="p1123331710376"></a>参数</p>
532</th>
533<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p523321783715"><a name="p523321783715"></a><a name="p523321783715"></a>参数描述</p>
534</th>
535</tr>
536</thead>
537<tbody><tr id="row6234417133712"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p7233121716379"><a name="p7233121716379"></a><a name="p7233121716379"></a>handle</p>
538</td>
539<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p17234101753712"><a name="p17234101753712"></a><a name="p17234101753712"></a>UART设备句柄</p>
540</td>
541</tr>
542<tr id="row18234151718372"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p16234191783711"><a name="p16234191783711"></a><a name="p16234191783711"></a>data</p>
543</td>
544<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p923417175378"><a name="p923417175378"></a><a name="p923417175378"></a>接收读取数据的指针</p>
545</td>
546</tr>
547<tr id="row82341017193711"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p13234917103717"><a name="p13234917103717"></a><a name="p13234917103717"></a>size</p>
548</td>
549<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p182341817153717"><a name="p182341817153717"></a><a name="p182341817153717"></a>待读取数据的长度</p>
550</td>
551</tr>
552<tr id="row102341617123717"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p172341617163712"><a name="p172341617163712"></a><a name="p172341617163712"></a><strong id="b1323411179373"><a name="b1323411179373"></a><a name="b1323411179373"></a>返回值</strong></p>
553</td>
554<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1623431763718"><a name="p1623431763718"></a><a name="p1623431763718"></a><strong id="b1123411173377"><a name="b1123411173377"></a><a name="b1123411173377"></a>返回值描述</strong></p>
555</td>
556</tr>
557<tr id="row4234151719372"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p3234131716375"><a name="p3234131716375"></a><a name="p3234131716375"></a>非负数</p>
558</td>
559<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p7234171783718"><a name="p7234171783718"></a><a name="p7234171783718"></a>UART读取到的数据长度</p>
560</td>
561</tr>
562<tr id="row112340173378"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1423431743714"><a name="p1423431743714"></a><a name="p1423431743714"></a>负数</p>
563</td>
564<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p32349178378"><a name="p32349178378"></a><a name="p32349178378"></a>UART读取数据失败</p>
565</td>
566</tr>
567</tbody>
568</table>
569
570读取指定长度数据的实例如下:
571
572```
573int32_t ret;
574uint8_t rbuff[5] = {0};
575/* 从UART设备读取指定长度的数据 */
576ret = UartRead(handle, rbuff, 5);
577if (ret < 0) {
578    HDF_LOGE("UartRead: failed, ret %d\n", ret);
579}
580```
581
582>![](../public_sys-resources/icon-caution.gif) **注意:**
583>UART返回值为非负值,表示UART读取成功。若返回值等于0,表示UART无有效数据可以读取。若返回值大于0,表示实际读取到的数据长度,该长度小于或等于传入的参数size的大小,并且不超过当前正在使用的UART控制器规定的最大单次读取数据长度的值。
584
585### 销毁UART设备句柄<a name="section1477410521406"></a>
586
587UART通信完成之后,需要销毁UART设备句柄,函数如下所示:
588
589void UartClose\(DevHandle handle\);
590
591该函数会释放申请的资源。
592
593**表 10**  UartClose参数和返回值描述
594
595<a name="table03348317351"></a>
596<table><thead align="left"><tr id="row15334837351"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p933411316354"><a name="p933411316354"></a><a name="p933411316354"></a>参数</p>
597</th>
598<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p16334103143517"><a name="p16334103143517"></a><a name="p16334103143517"></a>参数描述</p>
599</th>
600</tr>
601</thead>
602<tbody><tr id="row733483103513"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p7334530358"><a name="p7334530358"></a><a name="p7334530358"></a>handle</p>
603</td>
604<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p133341331356"><a name="p133341331356"></a><a name="p133341331356"></a>UART设备句柄</p>
605</td>
606</tr>
607</tbody>
608</table>
609
610销毁UART设备句柄的实例如下:
611
612```
613UartClose(handle); /* 销毁UART设备句柄 *
614```
615
616## 使用实例<a name="section35404241311"></a>
617
618UART设备完整的使用示例如下所示,首先获取UART设备句柄,接着设置波特率、设备属性和传输模式,之后进行UART通信,最后销毁UART设备句柄。
619
620```
621#include "hdf_log.h"
622#include "uart_if.h"
623
624void UartTestSample(void)
625{
626    int32_t ret;
627    uint32_t port;
628    DevHandle handle = NULL;
629    uint8_t wbuff[5] = { 1, 2, 3, 4, 5 };
630    uint8_t rbuff[5] = { 0 };
631    struct UartAttribute attribute;
632    attribute.dataBits = UART_ATTR_DATABIT_7;   /* UART传输数据位宽,一次传输7个bit */
633    attribute.parity = UART_ATTR_PARITY_NONE;   /* UART传输数据无校检 */
634    attribute.stopBits = UART_ATTR_STOPBIT_1;   /* UART传输数据停止位为1位 */
635    attribute.rts = UART_ATTR_RTS_DIS;          /* UART禁用RTS */
636    attribute.cts = UART_ATTR_CTS_DIS;          /* UART禁用CTS */
637    attribute.fifoRxEn = UART_ATTR_RX_FIFO_EN;  /* UART使能RX FIFO */
638    attribute.fifoTxEn = UART_ATTR_TX_FIFO_EN;  /* UART使能TX FIFO */
639    /* UART设备端口号,要填写实际平台上的端口号 */
640    port = 1;
641    /* 获取UART设备句柄 */
642    handle = UartOpen(port);
643    if (handle == NULL) {
644        HDF_LOGE("UartOpen: failed!\n");
645        return;
646    }
647    /* 设置UART波特率为9600 */
648    ret = UartSetBaud(handle, 9600);
649    if (ret != 0) {
650        HDF_LOGE("UartSetBaud: failed, ret %d\n", ret);
651        goto _ERR;
652    }
653    /* 设置UART设备属性 */
654    ret = UartSetAttribute(handle, &attribute);
655    if (ret != 0) {
656        HDF_LOGE("UartSetAttribute: failed, ret %d\n", ret);
657        goto _ERR;
658    }
659    /* 设置UART传输模式为非阻塞模式 */
660    ret = UartSetTransMode(handle, UART_MODE_RD_NONBLOCK);
661    if (ret != 0) {
662        HDF_LOGE("UartSetTransMode: failed, ret %d\n", ret);
663        goto _ERR;
664    }
665    /* 向UART设备写入5字节的数据 */
666    ret = UartWrite(handle, wbuff, 5);
667    if (ret != 0) {
668        HDF_LOGE("UartWrite: failed, ret %d\n", ret);
669        goto _ERR;
670    }
671    /* 从UART设备读取5字节的数据 */
672    ret = UartRead(handle, rbuff, 5);
673    if (ret < 0) {
674        HDF_LOGE("UartRead: failed, ret %d\n", ret);
675        goto _ERR;
676    }
677_ERR:
678    /* 销毁UART设备句柄 */
679    UartClose(handle);
680}
681```
682
683