[其他ST产品] Python与STM32F103串口通讯

[复制链接]
1906|18
 楼主| V853 发表于 2022-9-13 13:39 | 显示全部楼层 |阅读模式
serial库安装
  1. pip install pyserial

python上位机代码
以下功能具体封装成函数了,在实际开发中,接收数据可以和线程配合使用。实现了循环发送与接收
  1. import serial

  2. # 串口打开函数
  3. def open_ser():
  4.     port = 'com5'  # 串口号
  5.     baudrate = 9600  # 波特率
  6.     try:
  7.         global ser
  8.         ser = serial.Serial(port,baudrate,timeout=2)
  9.         if(ser.isOpen()==True):
  10.             print("串口打开成功")
  11.     except Exception as exc:
  12.         print("串口打开异常",exc)
  13.         
  14. # 数据发送
  15. def send_msg():
  16.     try:
  17.         # send_datas = input("请输入要发送的数据\n")
  18.         # ser.write(str(send_datas).encode("gbk"))
  19.         # print("已发送数据:",send_datas)
  20.         send_datas1=875
  21.         ser.write(str(send_datas1).encode("gbk"))
  22.         print("已发送数据:",send_datas1)
  23.     except Exception as exc:
  24.         print("发送异常", exc)
  25.         
  26. # 接收数据
  27. def read_msg():
  28.     try:
  29.         print("等待接收数据")
  30.         while True:
  31.             data = ser.read(ser.in_waiting).decode('gbk')
  32.             if data != '':
  33.                 break
  34.         print("已接受到数据:",data)
  35.     except Exception as exc:
  36.         print("读取异常",exc)
  37.         
  38. # 关闭串口
  39. def close_ser():
  40.         try:
  41.             ser.close()
  42.             if ser.isOpen():
  43.                 print("串口未关闭")
  44.             else:
  45.                 print("串口已关闭")
  46.         except Exception as exc:
  47.             print("串口关闭异常", exc)
  48.             
  49. if __name__ == '__main__':
  50.     open_ser()   # 打开串口
  51.     while 1:
  52.         send_msg()   # 写数据
  53.         read_msg()   # 读数据
  54.     close_ser()  # 关闭串口
stm32端程序
在这里32 的程序没必要太复杂,就写一个串口程序方便测试就行。
以下的32 串口程序的功能是:将接受到的数据原封不动的发送回去。
led的功能只是一个指示功能,表示32系统正常运行。

  1. #include <stm32f10x.h>
  2. #include <SysTick.h>

  3. void USART1_Init(u32 bound)
  4. {
  5.    //端口设置
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. USART_InitTypeDef USART_InitStructure;
  8. NVIC_InitTypeDef NVIC_InitStructure;
  9. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  10. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  11. /*  配置IO口*/
  12. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX PA9
  13. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  14. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;   
  15. GPIO_Init(GPIOA,&GPIO_InitStructure);
  16. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX PA10
  17. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;   
  18. GPIO_Init(GPIOA,&GPIO_InitStructure);
  19.    //USART1 初始化设置
  20. USART_InitStructure.USART_BaudRate = bound;//波特率
  21. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  22. USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  23. USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验
  24. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  25. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  26. USART_Init(USART1, &USART_InitStructure);
  27. USART_Cmd(USART1, ENABLE);  
  28. USART_ClearFlag(USART1, USART_FLAG_TC);
  29. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断
  30. //Usart1 NVIC 中断配置
  31. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断
  32. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
  33. NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;  //子优先级3
  34. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  35. NVIC_Init(&NVIC_InitStructure);
  36. }
  37. /*********中断服务子程序************/
  38. void USART1_IRQHandler(void)                 
  39. {
  40. unsigned char r;
  41. if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
  42. {
  43.   r =USART_ReceiveData(USART1);//(USART1->DR);
  44.   USART_SendData(USART1,r);
  45.   while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
  46. }
  47. USART_ClearFlag(USART1,USART_FLAG_TC);
  48. }
  49. /********LED  IO口配置***********/
  50. void LED_INIT()
  51. {
  52. GPIO_InitTypeDef GPIO_InitStructure;
  53. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  54. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;//PC13
  55. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  56. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;     
  57. GPIO_Init(GPIOC,&GPIO_InitStructure);
  58. GPIO_SetBits(GPIOC,GPIO_Pin_13);  
  59. }
  60. /**************LED闪烁***************/
  61. void display1(void)
  62. {
  63.   GPIO_SetBits(GPIOC,GPIO_Pin_13);//点亮         
  64.   delay_ms(1000);
  65.   GPIO_ResetBits(GPIOC,GPIO_Pin_13);//熄灭         
  66.   delay_ms(1000);
  67. }
  68. /***********主函数**************/
  69. int main()
  70. {
  71. SysTick_Init(72);   
  72. LED_INIT();        //led初始化
  73. USART1_Init(9600);//串口初始化,自动开启串口中断,进行数据自动接收和发送
  74. while(1)
  75. {
  76.   display1();// led闪烁表示系统正常运行
  77. }
  78. }
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hb19odWlfZmVp,size_16,color_FFFFFF,t_70.jpg

一枝香 发表于 2022-11-26 23:20 | 显示全部楼层
Python也能做上位机啊?挺好玩啊

占得人间第一春 发表于 2022-11-26 23:52 | 显示全部楼层
python用的是啥开发环境?

可爱的白兔先生 发表于 2022-11-27 00:24 | 显示全部楼层
现在好像用python写脚本的比较多,再弄弄数据处理之类的

偷吻月亮 发表于 2022-11-27 00:56 | 显示全部楼层
感觉挺不错的,就这点儿代码就能实现这个功能

热爱童话世界 发表于 2022-11-27 01:28 | 显示全部楼层
STM32串口还是比较简单而且好用的

喜爱弄人 发表于 2022-11-27 02:00 | 显示全部楼层
楼主可以试试cubemx,做底层搭建的话,更快

地下縱情搖擺 发表于 2022-11-27 02:32 | 显示全部楼层
自己写串口上位机挺好,可以拓展拓展,丰富一下上位机工具

林间有新绿 发表于 2022-11-27 03:04 | 显示全部楼层
话说,python的话,开发起来简单么?

情和欲 发表于 2022-11-27 03:36 | 显示全部楼层
这种语言一般需要掌握什么啊?就脚本语言就行么?

极客晨星 发表于 2022-11-27 04:08 | 显示全部楼层
根据这个python写的串口助手比较简单啊,没用多少代码就实现了

 楼主| V853 发表于 2022-12-3 20:23 | 显示全部楼层
一枝香 发表于 2022-11-26 23:20
Python也能做上位机啊?挺好玩啊

对啊,Python可以做的东西非常多的。
 楼主| V853 发表于 2022-12-3 20:25 | 显示全部楼层
占得人间第一春 发表于 2022-11-26 23:52
这python用的是啥开发环境?

PyCharm,这个是专门用于Python开发的。
 楼主| V853 发表于 2022-12-3 20:26 | 显示全部楼层
可爱的白兔先生 发表于 2022-11-27 00:24
现在好像用python写脚本的比较多,再弄弄数据处理之类的

对的,还有机器学习哦!
 楼主| V853 发表于 2022-12-3 20:26 | 显示全部楼层
林间有新绿 发表于 2022-11-27 03:04
话说,python的话,开发起来简单么?

非常简单,小学生都可以上手开发的一个开发语言!
 楼主| V853 发表于 2022-12-3 20:27 | 显示全部楼层
情和欲 发表于 2022-11-27 03:36
这种语言一般需要掌握什么啊?就脚本语言就行么?

Python就是一种语言,只要会用它的库就行。
 楼主| V853 发表于 2022-12-3 20:28 | 显示全部楼层
地下縱情搖擺 发表于 2022-11-27 02:32
自己写串口上位机挺好,可以拓展拓展,丰富一下上位机工具

对的,主要可以做调试工具用!
Wordsworth 发表于 2024-11-4 07:05 | 显示全部楼层

从定时器为TIM2,从模式选择为门控模式,触发源选择ITR0,开启定时器2中断。
Clyde011 发表于 2024-11-4 08:08 | 显示全部楼层

根据实际需求选择用哪种方式
公羊子丹 发表于 2024-11-4 09:01 | 显示全部楼层

每条大电流的地线要短而宽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

2223

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部