下面是实现Python与STM32通信方式的完整攻略:
1. 选择通信方式
在实现Python与STM32通信之前,我们需要确定通信的方式。常见的通信方式有串口通信、网络通信和蓝牙通信等。针对STM32来说,串口通信是最常见的方式,因为串口通信使用简单、可靠性高。
2. 配置STM32串口通信
在STM32上实现串口通信,我们需要配置STM32的串口模块。下面以STM32F4为例,讲解如何配置串口通信。
2.1 初始化GPIO
串口通信需要使用到GPIO引脚,我们需要先进行GPIO初始化。以串口1为例,GPIOA的9、10引脚分别对应串口1的TX和RX功能。
/* 使能GPIOA时钟 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* 初始化GPIOA的9和10引脚 */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//选择复用模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 将GPIOA的9和10引脚复用为USART1的TX和RX功能 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
2.2 初始化USART模块
STM32的串口通信使用USART模块,我们需要进行USART模块的初始化。以串口1为例,波特率为115200。
/* 使能USART1时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
/* 初始化USART1 */
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
/* 启动USART1 */
USART_Cmd(USART1, ENABLE);
2.3 发送和接收数据
以上操作完成后,我们就可以使用STM32的串口模块发送和接收数据了。以发送字符为例:
/* 等待串口1准备就绪 */
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
;
/* 发送字符 */
USART_SendData(USART1, 'A');
/* 等待发送完成 */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
;
以接收字符为例:
/* 等待接收到数据 */
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
;
/* 读取接收到的数据 */
char c = USART_ReceiveData(USART1);
3. 在Python中实现串口通信
在Python中实现串口通信,我们可以使用Pyserial库。Pyserial库是Python的串口通信库,支持Windows,Linux和MacOS等系统。下面以Python3.8为例,讲解如何使用Pyserial库实现Python与STM32串口通信。
3.1 安装Pyserial库
使用pip命令安装Pyserial库:
pip install pyserial
3.2 使用Pyserial库
使用Pyserial库进行串口通信,我们需要指定串口号,波特率等参数。以Windows系统为例,串口号为“COM3”,波特率为115200。
import serial
#连接串口
ser = serial.Serial('COM3', 115200)
#发送数据
ser.write(b'A')
#接收数据
data = ser.read(1)
以上代码将连接串口COM3,然后发送字符“A”,接收1个字节的数据。
4. 示例应用
4.1 控制LED灯
在STM32上连接一个LED灯,然后使用Python控制LED的开关。以下为STM32代码:
while (1) {
/* 接收Python发送的数据 */
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) {
char c = USART_ReceiveData(USART1);
if (c == '1') {
GPIO_SetBits(GPIOA , GPIO_Pin_7);
} else if (c == '0') {
GPIO_ResetBits(GPIOA , GPIO_Pin_7);
}
}
}
以上代码每次从串口中读取1个字符,如果读到的字符为“1”则打开LED灯,如果为“0”则关闭LED灯。以下为Python代码:
import serial
import time
#连接串口
ser = serial.Serial('COM3', 115200)
#开启LED灯
ser.write(b'1')
time.sleep(1)
#关闭LED灯
ser.write(b'0')
time.sleep(1)
以上代码将连接串口COM3,然后在开启LED灯1秒后关闭LED灯。
4.2 计算器
在STM32上实现一个简单的加减乘除运算器,并且使用Python进行控制。以下为STM32代码:
while (1) {
/* 接收Python发送的数据 */
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) {
char c = USART_ReceiveData(USART1);
/* 接收第一个操作数 */
char op1_buf[10];
uint8_t op1_index = 0;
while (1) {
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) {
op1_buf[op1_index++] = USART_ReceiveData(USART1);
if (op1_buf[op1_index - 1] == ',') {
op1_buf[op1_index - 1] = '\0';
break;
}
}
}
int32_t op1 = atoi(op1_buf);
/* 接收第二个操作数 */
char op2_buf[10];
uint8_t op2_index = 0;
while (1) {
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) {
op2_buf[op2_index++] = USART_ReceiveData(USART1);
if (op2_buf[op2_index - 1] == ',') {
op2_buf[op2_index - 1] = '\0';
break;
}
}
}
int32_t op2 = atoi(op2_buf);
/* 接收运算符 */
char op;
while (1) {
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) {
op = USART_ReceiveData(USART1);
break;
}
}
/* 进行计算 */
int32_t result = 0;
switch (op) {
case '+':
result = op1 + op2;
break;
case '-':
result = op1 - op2;
break;
case '*':
result = op1 * op2;
break;
case '/':
result = op1 / op2;
break;
}
/* 发送结果 */
char result_buf[10];
itoa(result, result_buf, 10);
USART_SendString(USART1, result_buf);
USART_SendString(USART1, "\r\n");
}
}
以上代码每次从串口中读取3个参数:第一个和第二个操作数以及运算符,然后根据运算符进行计算,并将结果通过串口发送。以下为Python代码:
import serial
import time
#连接串口
ser = serial.Serial('COM3', 115200)
#发送运算请求:1+3
ser.write(b'1,3,+\n')
#等待结果
result = ser.readline().strip()
print(result)
以上代码将连接串口COM3,并发送1+3的运算请求,并等待STM32返回结果,并打印结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:实现Python与STM32通信方式 - Python技术站