当前位置:   article > 正文

K210与STM32单片机进行通信(数据包形式)_k210怎么与单片机通信的

k210怎么与单片机通信的

目录

1.K210如何打包发送HEX数据包

2.STM32如何发送特定格式数据包

3.STM32如何接收特定格式数据包

4.K210如何接收特定格式数据包


1.K210如何打包发送HEX数据包

1.1导入需要的库

  1. from fpioa_manager import fm #用于映射IO口
  2. from machine import UART #用于串口配置
  3. from machine import Timer #用于产生定时器中断 用于读取是否接收到数据包

1.2串口初始化及定义发送的数据格式

  1. fm.register(17, fm.fpioa.UART1_TX, force=True)
  2. fm.register(21, fm.fpioa.UART1_RX, force=True)
  3. #8位数据位,无校验位,1位停止位 波特率115200 另外一个单片机的配置需要相同
  4. uart_A = UART(UART.UART1, 115200, 8, 0, 1, timeout=1000, read_buf_len=4096)
  5. class K210_transmit():
  6. head = 0xAA
  7. x = 256
  8. y = 312
  9. end = 0xAF
  10. K210 = K210_transmit()
  11. #单片机一般都是一个字节一个字节读取串口数据,所以我们要把数据一个字节一个字节的进行发送
  12. #我们通常使用K210都是发送坐标数据给其它单片机,但是坐标范围明显超过了一个字节大小(255),所以把
  13. #x,y坐标拆分成高8位和低8位发送,确保数据不会因为超出范围产生错误
  14. def K210_data():
  15. data=bytearray([K210.head,
  16. K210.x>>8,K210.x,
  17. K210.y>>8,K210.y,
  18. K210.end])
  19. return data

1.3发送数据包

 uart_A.write(K210_data())

2.STM32如何发送特定格式数据包

STM32单片机的串口初始化我这里就不过多介绍了,相信大家学到了K210单片机,STM32自然是没有问题的,我们只需要将其配置为115200,8位数据位,无校验位,1位停止位即可。

  1. void USART1_init(int botelv)
  2. {
  3. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  5. //发送引脚 PA9 TX
  6. GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体
  7. GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;//复用推挽输出 复用推挽输出可以输出高低电平 复用开漏不接上拉电阻只能输出低电平
  8. GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9;//管脚1
  9. GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;//频率
  10. GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
  11. //接收引脚 PA10 RX
  12. GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;//上拉输入
  13. GPIO_InitStructure.GPIO_Pin= GPIO_Pin_10;//管脚1
  14. GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;//频率
  15. GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化
  16. USART_InitTypeDef USART_InitStructure;
  17. USART_InitStructure.USART_BaudRate=botelv;//波特率
  18. USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不支持硬件流
  19. USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//发送模式 和 接收模式
  20. USART_InitStructure.USART_Parity=USART_Parity_No;//没有奇偶校验
  21. USART_InitStructure.USART_StopBits=USART_StopBits_1;//1个停止位
  22. USART_InitStructure.USART_WordLength=USART_WordLength_8b;//一帧8位
  23. USART_Init(USART1,&USART_InitStructure);
  24. USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  25. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  26. NVIC_InitTypeDef NVIC_InitStructure;
  27. NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
  28. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  29. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  30. NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  31. NVIC_Init(&NVIC_InitStructure);
  32. USART_Cmd(USART1,ENABLE);//使能USART串口
  33. }
  34. void USART1_SendByte(uint8_t Data)//发送一个字节
  35. {
  36. while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待TDR空
  37. USART_SendData(USART1,Data);//发送一个字节
  38. }

通过上面这些配置,可以通过void USART1_SendByte(uint8_t Data)函数发送一个字节,所以发送一个HEX数据包就非常简单了!

  1. USART1_SendByte(0xAA);//发送包头
  2. USART1_SendByte(Data);//发送数据
  3. USART1_SendByte(0xAF);//发送包尾

3.STM32如何接收特定格式数据包

首先就是对串口的配置,如上面的配置一样,可知我们已经开启了串口的接收中断,所以我们在串口接收中断函数中判断数据包是否符合要求即可。这里我们只接收4个字节

  1. uint8_t Rx_DataPack[8]={0,0,0,0};
  2. uint8_t Tx_DataPack[4]={0,0,0,0};
  3. uint8_t Rx_flag=0;
  4. void USART1_IRQHandler(void)
  5. {
  6. static uint8_t Rx_StateFlag=0;
  7. static uint8_t Rx_Datapx=0;
  8. if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
  9. {
  10. uint8_t RxData = USART_ReceiveData(USART1);
  11. if(Rx_StateFlag==0)
  12. {
  13. if(RxData==0xAA)//包头
  14. {
  15. Rx_Datapx=0;//数组指针清零
  16. Rx_StateFlag=1;//接收标志位置一开始接收有用数据
  17. }
  18. }
  19. else if(Rx_StateFlag==1)
  20. {
  21. Rx_DataPack[Rx_Datapx]=RxData;
  22. Rx_Datapx++;
  23. if(Rx_Datapx >= 8)//接收到个指定个数的数据
  24. {
  25. Rx_StateFlag=2;//接收标志位置2判断下一个数据是不是包尾
  26. }
  27. }
  28. else if(Rx_StateFlag==2)
  29. {
  30. if(RxData==0xAF)
  31. {
  32. Rx_StateFlag=0;//是包尾结束
  33. Rx_flag=1;
  34. }
  35. }
  36. USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  37. }
  38. }

4.K210如何接收特定格式数据包

  1. Rx_StateFlag=0 #接收数据包状态标准位
  2. Rx_index=0 #接收数据数组索引下标
  3. Rdata_array=bytearray([0,0,0,0])#接收数据数组
  4. Rx_OK_flag=0 #接收完成标志位 0没有接收成功 1接收成功
  5. def fun(void):
  6. global Rx_StateFlag
  7. global Rx_index
  8. global Rdata_array
  9. global Rx_OK_flag
  10. R_data = uart_A.readchar()
  11. if R_data>0:
  12. if Rx_StateFlag==0:
  13. if R_data==170: #0xAA
  14. Rx_StateFlag=1
  15. Rx_index=0
  16. elif Rx_StateFlag==1:
  17. Rdata_array[Rx_index]=R_data
  18. Rx_index=Rx_index+1
  19. if Rx_index>=4:
  20. Rx_StateFlag=2
  21. elif Rx_StateFlag==2:
  22. if R_data==175:
  23. Rx_StateFlag=0
  24. Rx_OK_flag=1
  25. else :
  26. Rx_StateFlag=0
  27. Rx_OK_flag=0
  28. #初始化定时器0,周期5ms
  29. tim=Timer(Timer.TIMER0,Timer.CHANNEL0,mode=Timer.MODE_PERIODIC,period=1,unit=Timer.UNIT_MS,callback=fun)

这里使用软件定时器的回调函数模拟串口接收中断函数,具体判断数据包是否符合要求的方法与STM32单片机类似。

总结:不难,多用CH340转接口连接到电脑上打开串口助手调试,控制变量法先确保数据是按正常格式发送出去了,再去调试接收函数,不要接收和发送一起调试!!!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/704776
推荐阅读
相关标签
  

闽ICP备14008679号