[TOC]
># 前言
最近做開發工作已經逐步轉到Linux系統上來了,linux上的終端是很方便的工具,在做開發的時候我們往往會用串口來和電腦通信,比如做FPGA開發,我們調試的時候想看一下FPGA內部的寄存器值,或者獲取FPGA內部經過數字電路后的輸出結果,我們就可以在FPGA里面加入串口模塊,實現與PC的通訊,當然,對于樹莓派,licheepi,ARM等的調試,我們都可以這樣做。<br/>
在windows下我們經常使用圖形化的串口調試工具,當我們熟悉linux的操作模式后,也許會對命令模式情有獨鐘,因此雖然在linux環境下有圖形化的串口調試助手,但是使用起來總不如在控制臺中用命令來的靈活。<br/>
因此此次我以licheepi為例,說明如何在linux終端通過串口來實現與licheepi的交互。
># linux下串口操作
linux是文件系統,是直接可以像操作文件一樣操作串口的,具體介紹如下
[使用linux shell來讀寫串口](http://www.hmoore.net/dlover/fpga/1858266)
># 針對嵌入式串口調試的bash腳本
有了上面介紹的知識,于是就想實現在沒有網絡模塊時,在linux上操作樹莓派,licheepi就如同在本地終端操作一樣的效果,顯然萬能的`shell`可以幫我們完成這個任務,我根據自己的使用習慣,寫了一個腳本,為`mtty.sh`,
mtty.sh文件的內容如下:
```bash
#!/usr/bin/env bash
#-------------------------------------------------------
# FileName : mtty.sh
# Author :hpy
# Date :2020年08月09日
# Description :基于linux終端的串口工具
# :連接樹莓派,licheepi等
#-------------------------------------------------------
#++++++++++++++++ 串口參數設置+++++++++++++++++++++
#目標串口設置 /dev/ttyUSB*
fdtty=/dev/ttyUSB0
#波特率設置
baud=115200
#+++++++++++++++++++++++++++++++++++++++++++++++++++
tp="/tmp/$(date +%N).txt"
exUsb(){
if [ ! -c $fdtty ];then
echo "不存在目標串口($fdtty)!退出腳本"
exit 0
fi
}
#自動檢測目標usb 未完成
checkUsb(){
t1=$(ls /dev/ttyUSB*)
if [[ $? -gt 0 ]];then
read -p "請插入串口后,是否繼續檢測串口y/n?" chechin
if [ "$chechin" = "y" ] || [ "$chechin" = "yes" ]
then
fdtty=$(ls /dev/ttyUSB*)
fi
else
t2=$(ls /dev/ttyUSB*)
fi
}
#鍵盤輸入
getData(){
while((1))
do
exUsb
read readd
echo -e -n "$readd\n" > $fdtty
done
}
#串口有數據接收時就返回
dis(){
while ((1))
do
exUsb
cat $fdtty | tail -n +2 >> $tp
#cat $fdtty >> /tmp/usbget.txt
if [[ -s $tp ]];then
cat $tp
cat /dev/null > $tp #顯示過的就在文件中清除
fi
done
}
info(){
echo "歡迎使用linux終端上的嵌入式串口工具!"
echo "使用 <Ctrl-c> 退出"
echo ""
}
main(){
info
exUsb
stty -F $fdtty -echo raw speed $baud min 0 time 2 &> /dev/null
#cat /dev/null > /tmp/usbget.txt
echo -e -n "\n" >$fdtty #啟動時發送,以獲取反饋顯示
dis & #顯示線程
getData #鍵盤輸入線程
exit 0
}
main
```
看一看跑這個腳本實現和licheepi交互的效果:
本地linux電腦的終端如下圖:

使用腳本licheepi后的終端效果:


># 連接方法
linux下的串口設備為`/dev/ttyUSB*`,于是我們首先可以先將連接到licheepi的串口從`linux`電腦上拔出,然后在終端輸入命令
`ls /dev/ttyUSB*`
查看當前有哪些串口,如果沒有串口設備將會報錯,如下

然后我們連接好接到`licheepi`的串口,在運行上面的命令查看增了那個串口,那它就是我們的目標串口。

然后我們把文件中的串口和波特率修改成我們需要的后執行腳本即可。


**當然這只是一個基本的數據傳輸的,是不能夠在腳本中使用vim命令的,否則顯示會亂糟糟的。**
[源碼下載](https://gitee.com/yuan_hp/mtty.git)
- 序
- 第1章 Linux下開發FPGA
- 1.1 Linux下安裝diamond
- 1.2 使用輕量級linux仿真工具iverilog
- 1.3 使用linux shell來讀寫串口
- 1.4 嵌入式上的linux
- 設備數教程
- linux C 標準庫文檔
- linux 網絡編程
- 開機啟動流程
- 1.5 linux上實現與樹莓派,FPGA等通信的串口腳本
- 第2章 Intel FPGA的使用
- 2.1 特別注意
- 2.2 高級應用開發流程
- 2.2.1 生成二進制bit流rbf
- 2.2.2 制作Preloader Image
- 2.2.2.1 生成BSP文件
- 2.2.2.2 編譯preloader和uboot
- 2.2.2.3 更新SD的preloader和uboot
- 2.3 HPS使用
- 2.3.1 通過JTAG下載代碼
- 2.3.2 HPS軟件部分開發
- 2.3 quartus中IP核的使用
- 2.3.1 Intel中RS232串口IP的使用
- 2.4 一些問題的解決方法
- 2.4.1 關于引腳的復用的綜合出錯
- 第3章 關于C/C++的一些語法
- 3.1 C中數組作為形參不傳長度
- 3.2 匯編中JUMP和CALL的區別
- 3.3 c++中map的使用
- 3.4 鏈表的一些應用
- 3.5 vector的使用
- 3.6 使用C實現一個簡單的FIFO
- 3.6.1 循環隊列
- 3.7 C語言不定長參數
- 3.8 AD采樣計算同頻信號的相位差
- 3.9 使用C實現棧
- 3.10 增量式PID
- 第4章 Xilinx的FPGA使用
- 4.1 Alinx使用中的一些問題及解決方法
- 4.1.1 在Genarate Bitstream時提示沒有name.tcl
- 4.1.2 利用verilog求位寬
- 4.1.3 vivado中AXI寫DDR說明
- 4.1.4 zynq中AXI GPIO中斷問題
- 4.1.5 關于時序約束
- 4.1.6 zynq的PS端利用串口接收電腦的數據
- 4.1.7 SDK啟動出錯的解決方法
- 4.1.8 讓工具綜合是不優化某一模塊的方法
- 4.1.9 固化程序(雙核)
- 4.1.10 分配引腳時的問題
- 4.1.11 vivado仿真時相對文件路徑的問題
- 4.2 GCC使用Attribute分配空間給變量
- 4.3 關于Zynq的DDR寫入byte和word的方法
- 4.4 常用模塊
- 4.4.1 I2S接收串轉并
- 4.5 時鐘約束
- 4.5.1 時鐘約束
- 4.6 VIVADO使用
- 4.6.1 使用vivado進行仿真
- 4.7 關于PicoBlaze軟核的使用
- 4.8 vivado一些IP的使用
- 4.8.1 float-point浮點單元的使用
- 4.10 zynq的雙核中斷
- 第5章 FPGA的那些好用的工具
- 5.1 iverilog
- 5.2 Arduino串口繪圖器工具
- 5.3 LabVIEW
- 5.4 FPGA開發實用小工具
- 5.5 Linux下繪制時序圖軟件
- 5.6 verilog和VHDL相互轉換工具
- 5.7 linux下搭建輕量易用的verilog仿真環境
- 5.8 VCS仿真verilog并查看波形
- 5.9 Verilog開源的綜合工具-Yosys
- 5.10 sublim text3編輯器配置verilog編輯環境
- 5.11 在線工具
- 真值表 -> 邏輯表達式
- 5.12 Modelsim使用命令仿真
- 5.13 使用TCL實現的個人仿真腳本
- 5.14 在cygwin下使用命令行下載arduino代碼到開發板
- 5.15 STM32開發
- 5.15.1 安裝Atollic TrueSTUDIO for STM32
- 5.15.2 LED閃爍吧
- 5.15.3 模擬U盤
- 第6章 底層實現
- 6.1 硬件實現加法的流程
- 6.2 硬件實現乘法器
- 6.3 UART實現
- 6.3.1 通用串口發送模塊
- 6.4 二進制數轉BCD碼
- 6.5 基本開源資源
- 6.5.1 深度資源
- 6.5.2 FreeCore資源集合
- 第7章 常用模塊
- 7.1 溫濕度傳感器DHT11的verilog驅動
- 7.2 DAC7631驅動(verilog)
- 7.3 按鍵消抖
- 7.4 小腳丫數碼管顯示
- 7.5 verilog實現任意人數表決器
- 7.6 基本模塊head.v
- 7.7 四相八拍步進電機驅動
- 7.8 單片機部分
- 7.8.1 I2C OLED驅動
- 第8章 verilog 掃盲區
- 8.1 時序電路中數據的讀寫
- 8.2 從RTL角度來看verilog中=和<=的區別
- 8.3 case和casez的區別
- 8.4 關于參數的傳遞與讀取(paramter)
- 8.5 關于符號優先級
- 第9章 verilog中的一些語法使用
- 9.1 可綜合的repeat
- 第10章 system verilog
- 10.1 簡介
- 10.2 推薦demo學習網址
- 10.3 VCS在linux上環境的搭建
- 10.4 deepin15.11(linux)下搭建system verilog的vcs仿真環境
- 10.5 linux上使用vcs寫的腳本仿真管理
- 10.6 system verilog基本語法
- 10.6.1 數據類型
- 10.6.2 枚舉與字符串
- 第11章 tcl/tk的使用
- 11.1 使用Tcl/Tk
- 11.2 tcl基本語法教程
- 11.3 Tk的基本語法
- 11.3.1 建立按鈕
- 11.3.2 復選框
- 11.3.3 單選框
- 11.3.4 標簽
- 11.3.5 建立信息
- 11.3.6 建立輸入框
- 11.3.7 旋轉框
- 11.3.8 框架
- 11.3.9 標簽框架
- 11.3.10 將窗口小部件分配到框架/標簽框架
- 11.3.11 建立新的上層窗口
- 11.3.12 建立菜單
- 11.3.13 上層窗口建立菜單
- 11.3.14 建立滾動條
- 11.4 窗口管理器
- 11.5 一些學習的腳本
- 11.6 一些常用的操作語法實現
- 11.6.1 刪除同一后綴的文件
- 11.7 在Lattice的Diamond中使用tcl
- 第12章 FPGA的重要知識
- 12.1 面積與速度的平衡與互換
- 12.2 硬件原則
- 12.3 系統原則
- 12.4 同步設計原則
- 12.5 乒乓操作
- 12.6 串并轉換設計技巧
- 12.7 流水線操作設計思想
- 12.8 數據接口的同步方法
- 第13章 小項目
- 13.1 數字濾波器
- 13.2 FIFO
- 13.3 一個精簡的CPU( mini-mcu )
- 13.3.1 基本功能實現
- 13.3.2 中斷添加
- 13.3.3 使用中斷實現流水燈(實際硬件驗證)
- 13.3.4 綜合一點的應用示例
- 13.4.5 使用flex開發匯編編譯器
- 13.4.5 linux--Flex and Bison
- 13.4 有符號數轉單精度浮點數
- 13.5 串口調試FPGA模板