Python学习:使用PySerial实现Python与STM32串口通信
目录
安装pyserial库
python代码 接收到数据后打印(然后发送回去 注释了)
stm32代码 发送心跳包 stm32f03c8t6 Hal库 serial1
新建工程
代码
定义的数据
中断函数
重写printf函数
main函数
安装pyserial库
pip install pyserial
python代码 接收到数据后打印(然后发送回去 注释了)
#串口与stm32通信
import serial
# 串口打开函数
def open_ser():
port = 'com5' # 串口端口号
baudrate = 115200 # 波特率
try:
global ser #新建serial对象
ser = serial.Serial(port, baudrate, timeout=2) #初始化串口
if (ser.isOpen() == True): #判断是否打开
print("串口打开成功")
except Exception as exc:
print("串口打开异常", exc)
# 数据发送
def send_msg(sedata):
try:
# send_datas = input("请输入要发送的数据\n")+ '\r\n'
# ser.write(str(send_datas).encode("gbk"))
# print("已发送数据:",send_datas)
send_datas1 = sedata + '\r\n' #加换行
ser.write(str(send_datas1).encode("gbk")) #向串口写数据 gbk编码
print("已发送数据:", send_datas1)
except Exception as exc:
print("发送异常", exc)
# 接收数据
def read_msg():
try:
print("等待接收数据")
while True:
data = ser.read(ser.in_waiting).decode('gbk') #等待判断是否有数据
if data != '': #数据不为空
break
print("已接受到数据:", data)
return data #返回数据
except Exception as exc:
print("读取异常", exc)
# 关闭串口
def close_ser():
try:
ser.close() #关闭serial
if ser.isOpen(): #判断关闭了没有
print("串口未关闭")
else:
print("串口已关闭")
except Exception as exc:
print("串口关闭异常", exc)
if __name__ == '__main__':
open_ser() # 打开串口
while 1:
redata = read_msg() # 读数据
#send_msg(redata) # 写数据
close_ser() # 关闭串口
stm32代码 发送心跳包 stm32f03c8t6 Hal库 serial1
新建工程
代码
定义的数据
定义的数据
//串口接收缓存(1字节)
uint8_t buf=0;
//定义最大接收字节数 200,可根据需求调整
#define UART1_REC_LEN 200
// 接收缓冲, 串口接收到的数据放在这个数组里,最大UART1_REC_LEN个字节
uint8_t UART1_RX_Buffer[UART1_REC_LEN];
// 接收状态
// bit15, 接收完成标志
// bit14, 接收到0x0d
// bit13~0, 接收到的有效字节数目
uint16_t UART1_RX_STA=0;
中断函数
// 接收完成回调函数,收到一个数据后,在这里处理
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
// 判断中断是由哪个串口触发的
if(huart->Instance == USART1)
{
// 判断接收是否完成(UART1_RX_STA bit15 位是否为1)
if((UART1_RX_STA & 0x8000) == 0)
{
// 如果已经收到了 0x0d (回车),
if(UART1_RX_STA & 0x4000)
{
// 则接着判断是否收到 0x0a (换行)
if(buf == 0x0a)
// 如果 0x0a 和 0x0d 都收到,则将 bit15 位置为1
UART1_RX_STA |= 0x8000;
else
// 否则认为接收错误,重新开始
UART1_RX_STA = 0;
}
else // 如果没有收到了 0x0d (回车)
{
//则先判断收到的这个字符是否是 0x0d (回车)
if(buf == 0x0d)
{
// 是的话则将 bit14 位置为1
UART1_RX_STA |= 0x4000;
}
else
{
// 否则将接收到的数据保存在缓存数组里
UART1_RX_Buffer[UART1_RX_STA & 0X3FFF] = buf;
UART1_RX_STA++;
// 如果接收数据大于UART1_REC_LEN(200字节),则重新开始接收
if(UART1_RX_STA > UART1_REC_LEN - 1)
UART1_RX_STA = 0;
}
}
}
// 重新开启中断
HAL_UART_Receive_IT(&huart1, &buf, 1);
}
}
重写printf函数
int fputc(int ch, FILE *f)
{
unsigned char temp[1]={ch};
HAL_UART_Transmit(&huart1,temp,1,0xffff);
return ch;
}
main函数
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
// 开启接收中断
HAL_UART_Receive_IT(&huart1, &buf, 1);
while (1)
{
//判断判断串口是否接收完成
if(UART1_RX_STA & 0x8000)
{
//printf("收到数据:%s\n",UART1_RX_Buffer);
// 将收到的数据发送到串口
HAL_UART_Transmit(&huart1, UART1_RX_Buffer, UART1_RX_STA & 0x3fff, 0xffff);
// 等待发送完成
while(huart1.gState != HAL_UART_STATE_READY);
printf("\r\n");
// 重新开始下一次接收
UART1_RX_STA = 0;
}
printf("hello python\r\n");
HAL_Delay(1000);
}
}
作者:码农小白