如何只读取前两个数字? python +串口
How to read just the first two numbers ? python +UART
我想在笔记本电脑和模块之间进行通信。为此,我创建了一个 python 文件,它将向 UART 发送一些数据包,它必须读取这些数据包。
我有一个创建数据包的 python 脚本(笔记本电脑):
SOF= '24'
SEND_PLAINTEXT= '72'
SEND_KEY ='73'
RECEIVE_CIPHERTEXT='74'
SIZE_OF_FRAME= '10'
for a in range (0,1):
line_array=lines[a]
plaintxt_16b=line_array[0:32]
plaintext= '24'+'72'+'32'+plaintxt_16b
ser.write (plaintext.encode())
最后的数据包是247232ccddeeff8899aabb4455667700112233
UART 在c 中使用以下代码行读取数据包:
uint8_t rx_buffer[38];
int rx_length = dev_uart_ptr->uart_read(rx_buffer, 38);
if (rx_length <38)
{
printf( rx_buffer);
}
我只需要读取前两个数字即可测试它是否是帧的开头。因此,我更改了我的代码:
uint8_t rx_buffer[2];
int rx_length = dev_uart_ptr->uart_read(rx_buffer,2);
if (rx_length <2)
{
printf( rx_buffer);
}
问题是显示的数字是33
,尽管我想阅读24
,如果你能帮助我,我将不胜感激。
我可以建议你检查 UART 的字节顺序。
我认为您需要阅读最后 2 个标记,而不是前 2 个标记。
编辑:
据我了解,您的 UART 模块是从数据包末尾开始发送数据的。因此,当您尝试读取前两个数字时,您会得到 33
但您应该读取最后两个数字以获得 24
.
勾选this
由于@Jalo 坚持要完整的答案,所以这里是:
正如我上面提到的,您需要阅读最后两个数字。您可以通过将 plaintext= '24'+'72'+'32'+plaintxt_16b
更改为 plaintext = plaintxt_16b + '32' + '72' + '24'
来反转您的输入来实现这一点
这一行plaintext= '24'+'72'+'32'+plaintxt_16b
好像是从右到左执行的。所以缓冲区中的第一件事将是 plaintxt_16b
,然后是其余的。
数据包中的字节顺序也是从右到左247232ccddeeff8899aabb4455667700112233
。所以第一个字节(0
的索引)是0x33
18.| 17.| 16.| 15.| 14.| 13.| 12.| 11.| 10.| 9. | 8. | 7. | 6. | 5. | 4. | 3. | 2. | 1. | 0.
---------------------------------------------------------------------------------------------
24 | 72 | 32 | cc | dd | ee | ff | 88 | 99 | aa | bb | 44 | 55 | 66 | 77 | 00 | 11 | 22 | 33
尝试以下操作:
plaintext= plaintxt_16b + '32' + '72' + '24'
并保持 UART 代码不变。
我想在笔记本电脑和模块之间进行通信。为此,我创建了一个 python 文件,它将向 UART 发送一些数据包,它必须读取这些数据包。 我有一个创建数据包的 python 脚本(笔记本电脑):
SOF= '24'
SEND_PLAINTEXT= '72'
SEND_KEY ='73'
RECEIVE_CIPHERTEXT='74'
SIZE_OF_FRAME= '10'
for a in range (0,1):
line_array=lines[a]
plaintxt_16b=line_array[0:32]
plaintext= '24'+'72'+'32'+plaintxt_16b
ser.write (plaintext.encode())
最后的数据包是247232ccddeeff8899aabb4455667700112233
UART 在c 中使用以下代码行读取数据包:
uint8_t rx_buffer[38];
int rx_length = dev_uart_ptr->uart_read(rx_buffer, 38);
if (rx_length <38)
{
printf( rx_buffer);
}
我只需要读取前两个数字即可测试它是否是帧的开头。因此,我更改了我的代码:
uint8_t rx_buffer[2];
int rx_length = dev_uart_ptr->uart_read(rx_buffer,2);
if (rx_length <2)
{
printf( rx_buffer);
}
问题是显示的数字是33
,尽管我想阅读24
,如果你能帮助我,我将不胜感激。
我可以建议你检查 UART 的字节顺序。
我认为您需要阅读最后 2 个标记,而不是前 2 个标记。
编辑:
据我了解,您的 UART 模块是从数据包末尾开始发送数据的。因此,当您尝试读取前两个数字时,您会得到 33
但您应该读取最后两个数字以获得 24
.
勾选this
由于@Jalo 坚持要完整的答案,所以这里是:
正如我上面提到的,您需要阅读最后两个数字。您可以通过将 plaintext= '24'+'72'+'32'+plaintxt_16b
更改为 plaintext = plaintxt_16b + '32' + '72' + '24'
这一行plaintext= '24'+'72'+'32'+plaintxt_16b
好像是从右到左执行的。所以缓冲区中的第一件事将是 plaintxt_16b
,然后是其余的。
数据包中的字节顺序也是从右到左247232ccddeeff8899aabb4455667700112233
。所以第一个字节(0
的索引)是0x33
18.| 17.| 16.| 15.| 14.| 13.| 12.| 11.| 10.| 9. | 8. | 7. | 6. | 5. | 4. | 3. | 2. | 1. | 0.
---------------------------------------------------------------------------------------------
24 | 72 | 32 | cc | dd | ee | ff | 88 | 99 | aa | bb | 44 | 55 | 66 | 77 | 00 | 11 | 22 | 33
尝试以下操作:
plaintext= plaintxt_16b + '32' + '72' + '24'
并保持 UART 代码不变。