串口通過UART接口通過USB與上位機(jī)通信,配置成中斷接收和中斷發(fā)送模式馏予,并創(chuàng)建了串口接收環(huán)形隊(duì)列和串口發(fā)送環(huán)形隊(duì)列,中斷接收的數(shù)據(jù)存放在串口接收環(huán)形隊(duì)列里,串口需要發(fā)送的數(shù)據(jù)放到串口發(fā)送環(huán)形隊(duì)列里召川。
為什么要使用環(huán)形隊(duì)列呢,它有什么優(yōu)點(diǎn)胸遇?
環(huán)形隊(duì)列是在實(shí)際編程極為有用的數(shù)據(jù)結(jié)構(gòu),它是一個首尾相連的FIFO的數(shù)據(jù)結(jié)構(gòu)荧呐,采用數(shù)組的線性空間,數(shù)據(jù)組織簡單。能很快知道隊(duì)列是否滿為空。能以很快速度的來存取數(shù)據(jù)坛增。
1.緩沖:使用隊(duì)列可以緩沖數(shù)據(jù)获雕,提升收發(fā)數(shù)據(jù)的性能。
2.高效:相比直線隊(duì)列收捣,空間利用率高届案。
2.多任務(wù):配合中斷,串口和主循環(huán)可以在互不干擾的情況下獨(dú)立工作罢艾。
讀取串口數(shù)據(jù)流程:
串口有數(shù)據(jù)時楣颠,觸發(fā)中斷,讀取串口緩沖區(qū)到讀循環(huán)隊(duì)列rx_buffer咐蚯,主循環(huán)中解析和執(zhí)行rx_buffer中的指令童漩;
寫入串口數(shù)據(jù)流程:
把指令執(zhí)行的結(jié)果消息放入寫循環(huán)隊(duì)列tx_buffer,串口寫緩沖區(qū)為空時觸發(fā)中斷,從寫循環(huán)隊(duì)列讀取數(shù)據(jù)到串口寫緩沖區(qū)春锋。
具體實(shí)現(xiàn):
與串口收發(fā)相關(guān)的源代碼有以下文件:
serial.c:低階串口通信封裝矫膨。
report.c:通知狀態(tài)映射和消息組裝
print.c:不同數(shù)據(jù)結(jié)構(gòu)的格式化
protocol.c:主循環(huán),消費(fèi)讀緩沖區(qū)的數(shù)據(jù)
我們重點(diǎn)分析serial.c,在該文件中定義了串口的初始化期奔,重置侧馅,讀取,寫入和計(jì)數(shù)等功能呐萌,并設(shè)置了串口收發(fā)中斷處理馁痴。