我正在嘗試使用 RS232-USB 電纜通過 STM32F429ZI 讀取和發送資料。
對于硬體,我使用的是連接到 STM32 的 UART2 埠 PA2 和 PA3 的 RS232 DB9 到 TTL MAX3232 轉換器。我不知道這是否相關,但我正在使用幾根 10 厘米長的電纜將 RS232 模塊的 TX-RX 連接到 STM32。
然后,我嘗試使用 Kubuntu 上的 Linux 終端從 uC 發送和讀取資料。這些是我正在執行的配置連接的步驟:
- 使用
ls -lah /dev/我查看 RS232-USB 的連接位置。就我而言,我可以看到它連接到/dev/ttyUSB0. - 然后我授予我的用戶使用
sudo chmod o rw /dev/ttyUSB0. - 之后,我用
stty命令配置連接的波特率。就我而言,我將 STM32 配置為以每秒 9600 波特的速度作業,因此stty -F /dev/ttyUSB0 9600. 使用stty -F /dev/ttyUSB0 -a,我可以看到速度實際上是每秒 9600 波特。
到現在為止還挺好。我可以毫無問題地將資料從我的計算機發送到 STM32。為了測驗這一點,我正在執行以下操作:
- 我有一個連接到 STM32 的 2x16 LCD 顯示幕,用于列印從計算機發送的資料。
- 要從終端發送資料,我只是在做
echo -n 'a' > /dev/ttyUSB. 這似乎作業得很好,因為我可以在 LCD 顯示幕中正確列印資料。 - 我什至測驗了一個程式來計算檔案上的字符數和操作所需的時間,以證實 9600 波特率。為此,我創建了一個包含 9600 個字符
cat test.txt | tr '\n' '#' > /dev/ttyUSB0的檔案,并將該檔案發送到 STM32。這大部分作業正常,我通常會得到正確的答案,但有時我不會。盡管如此,它不起作用的次數很少,所以我假設這是由于噪音。
因此,經過測驗我實際上可以將資料從我的計算機發送到 STM32,我嘗試做相反的事情:將資料從 STM32 發送到我的計算機。但這似乎不起作用,因為我無法在計算機中真正讀取任何內容。
我在幾個論壇上讀到要從 Linux 控制臺上的串行讀取資料,只需cat在設備上使用命令即可。所以,我以多種方式嘗試過,但我什么也讀不懂:
cat /dev/ttyUSB0什么也沒顯示,我必須用 Ctrl C 退出。cat -v /dev/ttyUSB0什么也沒顯示,我必須用 Ctrl C 退出。cat < /dev/ttyUSB0什么也沒顯示,我必須用 Ctrl C 退出。cat /dev/ttyUSB0 &只顯示一個數字,它就完成了。
所以,我不知道我是否只是使用了cat錯誤的命令,或者它是否是硬體問題,或者為什么我可以從我的計算機發送資料但無法讀取。
這是我在 STM32 中用于讀取和發送資料的程式部分(C 語言):
while(1)
{
if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET)
{
Data = USART_ReceiveData(USART2);
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
USART_SendData(USART2, Data);
}
}
如果有人需要它,我可以上傳USART埠的配置,但我不知道它是否相關,因為我可以很好地讀取資料。
任何幫助表示贊賞。
提前致謝。
Edit: here's the current project - https://github.com/AugustoRiedinger/06TP_E02 ; and the project to read data https://github.com/AugustoRiedinger/06TP_E01
uj5u.com熱心網友回復:
你的回圈說“只要不可能發送一個位元組,無論如何都要反復嘗試發送它,只要有可能發送一個位元組,就丟棄它而不發送”
改變:
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
USART_SendData(USART2, Data);
到:
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_SendData(USART2, Data);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314575.html
標籤:linux bash serial-port embedded stm32
上一篇:在否定匹配上列印單行
