在Linux系統(tǒng)下調(diào)試串口(如RS232/485)時,新手常面臨兩類典型問題:發(fā)送數(shù)據(jù)出現(xiàn)亂碼、終端回顯干擾接收結(jié)果。實際上,僅需通過系統(tǒng)自帶的stty指令完成基礎(chǔ)配置,配合雙終端測試,即可快速實現(xiàn)穩(wěn)定的串口通信。本文基于通用操作場景,總結(jié)一套“即學(xué)即用”的串口設(shè)置與測試方案。
一、核心痛點解析:為何需配置串口參數(shù)?
直接使用echo發(fā)送數(shù)據(jù)、cat接收數(shù)據(jù)前,串口默認(rèn)配置存在三類影響通信的問題:
1.亂碼問題:默認(rèn)啟用的onlcr模式會將“換行符(n)”自動轉(zhuǎn)換為“回車+換行(rn)”,若對接設(shè)備不兼容該格式,接收端會出現(xiàn)亂碼;
2.回顯干擾:默認(rèn)echo模式會重復(fù)顯示輸入字符(如發(fā)送“123”時,終端會額外回顯“123”),導(dǎo)致接收端獲取的數(shù)據(jù)混入冗余內(nèi)容;
3.緩沖延遲:默認(rèn)icanon規(guī)范模式下,數(shù)據(jù)需等待“回車”指令才會發(fā)送,實時性較差,測試過程中無法即時查看傳輸結(jié)果。
針對上述問題,核心配置指令(如stty -F /dev/ttyS0 -echo -onlcr、stty -F /dev/ttyS0 -echo -icanon)可實現(xiàn)精準(zhǔn)解決。

二、Linux串口操作3步方案(含指令解析)
第一步:確認(rèn)串口設(shè)備,避免操作錯誤
首先通過ls命令查看系統(tǒng)中已識別的串口設(shè)備(常見路徑為/dev/ttyS*或/dev/ttyUSB*,前者為硬件串口,后者為USB轉(zhuǎn)串口設(shè)備),示例如下:
|
#列出系統(tǒng)中所有ttyS類串口設(shè)備,確認(rèn)目標(biāo)串口存在
ls -l /dev/ttyS*
|
示例輸出(確認(rèn)/dev/ttyS0串口存在):
|
crw-rw---- 1 root dialout 4, 64 2025-09-01 10:00 /dev/ttyS0
|
注意:若執(zhí)行命令時提示“Permission denied”,后續(xù)所有操作需添加sudo權(quán)限,或切換至root用戶(通過su -指令)。
第二步:用stty配置串口,解決亂碼與回顯
基于/dev/ttyS0串口,針對不同通信需求,分兩類場景進(jìn)行配置,覆蓋多數(shù)測試場景:
場景1:通用測試(解決亂碼+關(guān)閉回顯)
適用于多數(shù)串口通信場景,通過關(guān)閉回顯和換行轉(zhuǎn)換,避免基礎(chǔ)通信問題:
|
#核心指令:配置/dev/ttyS0,關(guān)閉回顯(-echo)、關(guān)閉換行符轉(zhuǎn)換(-onlcr)
stty -F /dev/ttyS0 -echo -onlcr
|
指令解析:
?stty:Linux系統(tǒng)自帶的串口參數(shù)配置工具;
?-F /dev/ttyS0:指定待配置的串口設(shè)備路徑(-F為“File”縮寫,用于明確操作對象);
?-echo:關(guān)閉“輸入回顯”功能——發(fā)送數(shù)據(jù)時,終端不再重復(fù)顯示發(fā)送內(nèi)容,避免干擾接收端數(shù)據(jù)讀??;
?-onlcr:關(guān)閉“輸出換行轉(zhuǎn)回車”功能(onlcr全稱“Output NewLine to Carriage Return”)——禁用后,換行符(n)將直接發(fā)送,不額外轉(zhuǎn)換為“回車+換行”,解決格式不兼容導(dǎo)致的亂碼。
場景2:實時傳輸測試(低延遲+關(guān)閉回顯)
針對傳感器數(shù)據(jù)采集、實時指令下發(fā)等對傳輸延遲要求較高的場景,需額外關(guān)閉icanon規(guī)范模式,啟用“原始模式”:
|
#進(jìn)階指令:配置/dev/ttyS0,關(guān)閉回顯(-echo)、關(guān)閉規(guī)范模式(-icanon)
stty -F /dev/ttyS0 -echo -icanon
|
關(guān)鍵補充:
?-icanon:關(guān)閉規(guī)范模式,進(jìn)入“原始模式”——數(shù)據(jù)無需等待“回車”指令,發(fā)送后立即傳輸,實時性顯著提升,測試中可即時觀察接收結(jié)果;
?若需固定波特率(如9600、115200),可在指令末尾追加波特率參數(shù),示例:stty -F /dev/ttyS0 -echo -icanon 9600(串口波特率需與對接設(shè)備保持一致,否則會出現(xiàn)亂碼)。
驗證配置有效性
配置完成后,通過stty指令查看/dev/ttyS0當(dāng)前參數(shù),確認(rèn)目標(biāo)配置已生效:
|
#查看/dev/ttyS0的當(dāng)前配置,重點確認(rèn)-echo、-onlcr、-icanon是否存在
stty -F /dev/ttyS0
|
正確輸出特征:參數(shù)列表中顯示-echo(回顯關(guān)閉)、-onlcr(換行轉(zhuǎn)換關(guān)閉)、-icanon(規(guī)范模式關(guān)閉,若配置該參數(shù)),無echo、onlcr、icanon原始參數(shù)。
第三步:雙終端實戰(zhàn)測試,驗證通信穩(wěn)定性
配置完成后,打開兩個終端,分別執(zhí)行“接收”和“發(fā)送”操作,驗證/dev/ttyS0串口通信是否正常:
終端1:接收端(監(jiān)聽串口數(shù)據(jù))
將/dev/ttyS0設(shè)為接收端,通過cat指令持續(xù)讀取串口數(shù)據(jù):
|
#終端1執(zhí)行:持續(xù)接收/dev/ttyS0串口的數(shù)據(jù)
cat /dev/ttyS0
|
提示:cat指令會保持阻塞狀態(tài)以等待數(shù)據(jù),需終止時按Ctrl+C即可。
終端2:發(fā)送端(發(fā)送測試數(shù)據(jù))
在另一個終端中,向/dev/ttyS0串口發(fā)送測試數(shù)據(jù)(如“test_data”):
|
#終端2執(zhí)行:向/dev/ttyS0串口發(fā)送“test_data”(-n選項避免自動追加換行符)
echo -n "test_data" > /dev/ttyS0
|
預(yù)期結(jié)果:終端1會即時顯示“test_data”,無亂碼、無冗余回顯內(nèi)容,表明串口配置正確且通信正常。
進(jìn)階:回環(huán)測試(無外部設(shè)備時自測)
若暫無對接設(shè)備,可通過“回環(huán)測試”驗證串口自身功能是否正常:
1.用導(dǎo)線短接/dev/ttyS0對應(yīng)的TX引腳(發(fā)送引腳)與RX引腳(接收引腳)(需參考硬件手冊確認(rèn)引腳定義,如部分設(shè)備中/dev/ttyS0的TX為PIN10、RX為PIN9);
2.終端1執(zhí)行:cat /dev/ttyS0(持續(xù)接收數(shù)據(jù));
3.終端2執(zhí)行:echo -n "loop_test" > /dev/ttyS0(發(fā)送測試數(shù)據(jù));
4.若終端1成功接收“l(fā)oop_test”,說明/dev/ttyS0串口硬件功能正常。
三、常見問題解決方案(新手必看)
1.問題1:執(zhí)行指令提示“Permission denied”
?原因:當(dāng)前用戶無/dev/ttyS0串口的讀寫權(quán)限;
?解決方案:通過chmod指令臨時賦予全用戶讀寫權(quán)限,示例:
|
sudo chmod 666 /dev/ttyS0
|
1.問題2:配置后仍出現(xiàn)亂碼
?原因:串口波特率、數(shù)據(jù)位、校驗位與對接設(shè)備不匹配(如本地配置為9600波特率,對接設(shè)備為115200波特率);
?解決方案:統(tǒng)一雙方參數(shù),以9600波特率為例,配置指令:
|
stty -F /dev/ttyS0 -echo -onlcr 9600
|
1.問題3:指令無報錯,但接收端無數(shù)據(jù)
?原因1:物理連接異常(如TX/RX引腳接反、未共地);
?原因2:SELinux攔截(CentOS、RHEL等系統(tǒng)默認(rèn)啟用SELinux,可能限制串口操作);
?解決方案:檢查物理接線是否正確;臨時關(guān)閉SELinux(僅用于測試),指令:
|
sudo setenforce 0
|
1.問題4:發(fā)送數(shù)據(jù)后,接收端延遲較長才顯示
?原因:未關(guān)閉icanon規(guī)范模式,數(shù)據(jù)滯留在緩沖區(qū),需等待“回車”觸發(fā)發(fā)送;
?解決方案:添加-icanon參數(shù)配置串口,指令:
|
stty -F /dev/ttyS0 -echo -onlcr -icanon
|
四、方案優(yōu)勢總結(jié)
1.簡潔高效:無需安裝第三方工具(如minicom),僅依賴系統(tǒng)自帶的stty、echo、cat指令,新手可在5分鐘內(nèi)掌握基礎(chǔ)操作;
2.精準(zhǔn)避坑:通過-echo解決回顯干擾、-onlcr解決亂碼、-icanon解決實時性問題,三個核心參數(shù)覆蓋90%以上的串口測試場景;
3.通用性強:適用于硬件串口(/dev/ttyS*)與USB轉(zhuǎn)串口(/dev/ttyUSB*),僅需替換串口路徑即可復(fù)用操作流程。
若在串口調(diào)試過程中遇到其他問題,可通過查看系統(tǒng)日志(dmesg | grep ttyS0)進(jìn)一步定位故障,或參考硬件手冊確認(rèn)串口引腳與參數(shù)配置。
-
Linux
+關(guān)注
關(guān)注
88文章
11756瀏覽量
218997 -
干擾
+關(guān)注
關(guān)注
0文章
216瀏覽量
28208 -
串口
+關(guān)注
關(guān)注
15文章
1618瀏覽量
82792
發(fā)布評論請先 登錄
怎樣處理串口的回調(diào)函數(shù)?
串口接收數(shù)據(jù)亂碼的問題如何解決
RTThread串口數(shù)據(jù)一切正常,msh回顯亂碼怎么處理?
調(diào)試串口的時候,終端回顯錯誤如何處理?
STM32串口通信數(shù)據(jù)亂碼的相關(guān)問題
知道STM32串口通信亂碼要怎么處理嗎
嵌入式開發(fā)putty串口打印亂碼
CC3200 調(diào)試串口UART出現(xiàn)亂碼
單片機串口通信亂碼問題
STC51和STM32使用串口輸出中文亂碼問題解決
STM32串口通信亂碼解決方法
Linux串口操作指南:3步搞定設(shè)置,告別亂碼與回顯干擾
評論