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

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