使用python测试stm32串口

本文介绍了一种使用Python脚本对STM32进行串口通信测试的方法,通过读取CSV文件中的身份证信息,模拟大型设备与STM32之间的数据交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文首发于在下的个人博客blog.keysking.com

前段时间有个项目,要用stm32跟一个比较大,比较重的设备进行频繁的串口通信,因为设备移动起来不方便,遂想写个脚本,代替设备,对stm32的通信逻辑进行测试.

于是有了以下代码:

# coding=utf-8
import serial
import threading
import csv
import random

identitys_csv = csv.reader(open('./identitys.csv','r'))
# identitys_csv = csv.reader(open('./identitys_less.csv','r'))
identitys = list()
ser = serial.Serial("COM13",9600)

askData = bytes([0xA0, 0x0D, 0x01, 0x8A, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03, 0x01, 0x00, 0x0A, 0xB4])



def receiveFunc():
    print("---------------测试开始--------------")
    serData = bytes()
    while len(identitys) != 0:
        if ser.inWaiting() > 0 :
            out = ser.read(1)
            serData += out
            if len(serData) == 15:
                if serData == askData:
                    print("-------------设备请求数据------------")
                    num = random.randint(5,15)
                    if num > len(identitys):
                        num = len(identitys)
                    print("--------------发送"+str(num)+"个数据------------")
                    for identity in identitys[0:num]:
                        print(identity)
                        identityFormatData = transToFormat(identity)
                        ser.write(identityFormatData)
                        for i in identityFormatData:
                            print('0x%02x'%i,end=' ')
                        print("")
                    del identitys[0:num]
                else:
                    print("------------不知是啥的数据-----------")
                    for i in out:
                        print('0x%02x'%i,end=' ')
                    print("")
                serData = bytes()
    print("---------------测试结束--------------")

def transToFormat(identity):
    if identity[-1] == "X":
        identity = identity.replace("X",":")
    formatData = bytes([0xA0,0x13,0x01,0x8A,0x00,0x00,0x00])
    for i in range(len(identity)//2):
        temp = ((identity[2*i].encode('utf-8')[0] - 0x30) << 4) + (identity[2*i+1].encode('utf-8')[0] - 0x30)
        formatData += bytes([temp])
    formatData += bytes([0x00,0x00,0x00,0x00])
    checkSum = 0
    for i in formatData:
        checkSum += i
    checkSum = checkSum & 0x00FF
    checkSum = 0x100 - checkSum
    if checkSum == 256:
        checkSum = 0
    formatData += bytes([checkSum])
    return formatData

if __name__== '__main__':
    print("---------正在读取测试数据列表--------")
    for i in identitys_csv:
        identitys.append(i[0])
    print("---------共"+str(len(identitys))+"条测试数据--------")

    receiveThread = threading.Thread(target=receiveFunc,name="receive")
    receiveThread.start()

主要作用是将存在csv文件中的很多身份证信息取出来,然后等stm32那边通过串口发来请求信息(ackData)的时候,就随机取5到15个身份证信息,按照一定数据格式发送给stm32.

<think>嗯,用户想要实现PythonSTM32通过串口通信,并发送Hex数据。首先,我需要回想一下串口通信的基本步骤。Python这边通常用pyserial库,对吧?用户可能需要安装这个库,所以应该先提到安装命令pip install pyserial。 然后,STM32那边需要配置UART,设置正确的波特率、数据位、停止位等,确保两边参数一致。用户发送的是Hex数据,所以需要注意Python中如何将数据转换为字节格式。比如,使用bytes.fromhex()方法或者struct.pack()来处理。比如发送0xAA 0xBB,应该写成b'\xAA\xBB'或者用fromhex('AABB')。 接下来,可能需要一个Python的示例代码,包含打开串口、发送数据、关闭串口的部分。还要注意异常处理,比如串口无法打开的情况。用户可能不太清楚如何正确格式化数据,所以得详细说明数据转换的部分。 STM32端的代码示例也是必要的,但用户可能更熟悉Arduino的库,比如HAL库的使用。比如使用HAL_UART_Transmit函数,在main循环中接收数据。需要提醒用户根据实际使用STM32型号和库来调整代码。 然后,常见问题部分,比如波特率不匹配、数据格式错误、流控制设置,这些都需要提到。特别是Hex和字符串之间的转换容易出错,比如用户可能直接发送字符串而不是字节,导致数据不正确。 用户可能还需要了解如何测试串口通信,比如先用串口调试助手验证STM32的接收,再结合Python脚本。另外,数据校验和流量控制也可能需要考虑,但用户的问题可能主要集中在基本通信的实现上。 最后,生成相关问题,帮助用户深入理解,比如错误处理、接收数据、提高通信速度等。同时,要确保引用正确的参考资料,比如参考引用[1]和[3]中的相关内容,虽然具体的引用内容可能与加密有关,但可能涉及安全通信的部分,可以适当关联。</think>### PythonSTM32串口通信发送Hex数据实现步骤 #### 1. 环境准备 - **Python端**:安装`pyserial`库(串口通信) ```bash pip install pyserial ``` - **STM32端**:配置UART外设(波特率、数据位、校验位需与Python端一致) #### 2. Python发送Hex数据示例 ```python import serial import time def send_hex_data(port, baudrate, data_hex): try: ser = serial.Serial(port, baudrate, timeout=1) # 将Hex字符串转为字节数据(例如:"AABB" -> b'\xaa\xbb') data_bytes = bytes.fromhex(data_hex) ser.write(data_bytes) print(f"Sent: {data_bytes.hex().upper()}") ser.close() except Exception as e: print(f"Error: {str(e)}") # 示例:向COM3发送AABBCCDD(波特率115200) send_hex_data('COM3', 115200, "AABBCCDD") ``` #### 3. STM32接收代码要点(基于HAL库) ```c // 在main.c中添加UART接收回调 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { // 处理接收到的数据(存储在接收缓冲区) // 例如:通过DMA或中断模式读取 } } // 主循环中初始化接收 uint8_t rx_buffer[4]; HAL_UART_Receive_IT(&huart1, rx_buffer, sizeof(rx_buffer)); ``` #### 4. 关键注意事项 - **波特率匹配**:双方需使用相同波特率(如9600、115200) - **Hex数据格式**:Python输入需为**无分隔符的十六进制字符串**(如`"AABB"`而非`"AA BB"`) - **流控制**:若硬件支持,可启用RTS/CTS避免数据丢失[^1] - **数据验证**:建议添加校验位(如CRC)确保完整性[^3] #### 5. 完整通信流程 ``` PythonSTM32端 | -- Hex字节流 --> 串口TX引脚 | 触发接收中断 | <-- 响应数据 -- 串口RX引脚(可选) ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值