使用Linux终端从STM32的串口读取数据
Reading data from the serial port of a STM32 using the Linux terminal
我正在尝试使用 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
读写 USB 端口的权限。
- 之后,我使用
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 端口的配置,但考虑到我可以很好地读取数据,我不知道它是否相关。
感谢任何帮助。
提前致谢。
编辑:这是当前项目 - https://github.com/AugustoRiedinger/06TP_E02 ; and the project to read data https://github.com/AugustoRiedinger/06TP_E01
你的循环说“只要不能发送一个字节,无论如何都要反复尝试发送,一旦可以发送一个字节,就丢弃它而不发送”
变化:
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
USART_SendData(USART2, Data);
收件人:
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_SendData(USART2, Data);
我正在尝试使用 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
读写 USB 端口的权限。 - 之后,我使用
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 端口的配置,但考虑到我可以很好地读取数据,我不知道它是否相关。
感谢任何帮助。
提前致谢。
编辑:这是当前项目 - https://github.com/AugustoRiedinger/06TP_E02 ; and the project to read data https://github.com/AugustoRiedinger/06TP_E01
你的循环说“只要不能发送一个字节,无论如何都要反复尝试发送,一旦可以发送一个字节,就丢弃它而不发送”
变化:
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
USART_SendData(USART2, Data);
收件人:
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_SendData(USART2, Data);