一.为什么采用16进制数形式?

首先,需要解释一下串口发送的数据都是unsigned char类型的,说成字符和16进制形式,只是我们采用何种方式展示这些数据。字符形式就是把16进制数通过ASCII表一个一个转成字符的。

一开始接触到的串口程序,就是字符形式的,尤其是STM32中被重构的printf()函数,我就先入为主地选择了字符形式。这样比较人性化,因为啥数据都是平时看到的字符,很直观,但是大大降低了通信效率!比如要发送一个数85,字符形式需要发送’8’+‘5’,而16进制只需要发送0x55。还有一点是负数,字符形式多加了一个’-'号,16进制直接发送有符号数就行了。如果要传输大量的数据,应该采用16进制形式。

我在调试STM32与PC(采用Python3编写)串口通信过程中,二者之间需要发送各种类型的数据,uint_8、int16_t、float等等,要将所有类型的数据转换成uint_8类型发送,同时上位机要能转换回来。总之就是拆开发送,接收重组。

二.下位机

uint_8 型

发送:直接利用USART_SendData函数,通常配合检测发送结束位使用,如下:

void usart1_send_data(uint8_t num){

USART_SendData(USART1, num);

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

}

接收:很简单,直接赋值即可。

int16_t型

发送:int16_t型涉及到补码,但是可以留到上位机解决,只要分别发送高低8位数就可以。

void send_int16_t(int16_t num){

uint8_t high_8, low_8;

low_8 = num & 0x00FF;

high_8 = (num>>8) & 0x00FF;

usart1_send_data(high_8);

usart1_send_data(low_8);

}

接收:定义一个int16_t类型的数,将接收到高低八位分别移位即可,贴的代码中的LOW和HIGH变量只是一个例子,参考这个代码改就行。

int16_t temp = 0;

temp |= (int16_t)LOW[4]&0x00FF;

temp |= ((int16_t)HIGH<<8)&0xFF00;

float型

发送:虽然float型比较复杂,但是由于我用到的数都比较小,而且精度不高,所以可以把float分整数、小数发送出去。如果需要发送大数,可以把下面代码中的interger和decimal改成16位类型。

void send_float(float num){

uint8_t integer, decimal;  // 限制在uint8_t型

integer = (uint8_t)num;

decimal = (uint8_t)(( num-(uint8_t)num )*100); // 取两位小数

usart1_send_data(integer);

usart1_send_data(decimal);

}

接收:定义一个float型数,将小数部分*100加上整数部分即可,如下:

float num_f;

num_f = interger + decimal/100.0f;

三.上位机(Python)

uint8_t型

发送:比如要发送16进制的23(10进制35),直接通过pyserial的write函数,发送b"x23"或者bytes([35])。

ser.write(b"x23")  // ser.write(bytes([35]))

接收:调用pyserial的read读取的bytes型,直接取数即可,例如:

response = ser.read(1)

num = response[0]

int16_t型

发送:由于要考虑补码问题,但是可以通过ctypes的c_short(16位有符号整型)解决,不需要自己从补码解到原码,如下:

_num = c_short(num)

high_8 = (_num.value & 0xff00)>>8

low_8 = _num.value & 0x00ff

ser.write(bytes([high_8, low_8]))

接收:

num = c_short(0)

num.value |= high_8 << 8

num.value |= low_8

float型

发送:和下位机一样,分开发送整数和小数即可,如下:

my_byte = bytes([int(num_f), int(100 * (num_f - int(num_f)))])

ser_write(my_byte)

接收:同下位机,如下:

num_f = round(interger + decimal[2]/100, 1)

python3串口通信16进制_STM32串口通信——16进制数形式相关推荐

  1. 串口接收标志位语句_stm32串口——标志位学习

    /*在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送结 ...

  2. c语言串口通信_stm32 串口通信收发说明

    很多网友在stm32 串口通信收发中,发现接收发送函数中,数据都是指针指向首字符的字符串中,下一步进行后续操作就非常吃力了.其实这是对C语言指针的不能熟练应用有关.指针是C语言的灵魂,也是最难的部分, ...

  3. windows通信端口初始化失败_STM32实例——USART串口通信实验(二)

    USART 串口通信配置步骤 在上面的介绍中,可能有的朋友很不理解,不过没有关系,下面我们讲解如何使用库函数对 USART 进行配置.这个也是在编写程序中必须要了解的.具体步骤如下:(USART 相关 ...

  4. 串口触摸屏的使用(与单片机通信,电阻屏)

    相信大家来看这篇文章都知道串口触摸屏,也都知道串口触摸屏能用来干嘛的!这里废话不多说!现在让我们进一步了解串口触摸屏! 1.触摸屏图片 2.触摸屏的选取 其实淘宝上面的串口触摸品都是大同小异的,都是串 ...

  5. 51单片机C语言波特率十六进制,理解51单片机串口通信的波特率与USB转串口通信...

    RS232 在我们电脑上,一般都会有一个9针的串行接口,这个串行接口叫做RS232接口,它和UART通信有关联,但是由于现在笔记本电脑不带9针串口,所以和单片机通信越来越趋于使用USB虚拟串口. 九针 ...

  6. 51单片机stc15w204s串口通信发数据接收数据串口中断发中文字符串完美运行软件延时发送一字节函数全注释

    这里写自定义目录标题 KEIL自己先调试通了然后再说下面的事 51单片机stc15w204s串口通信直接上文件 KEIL自己先调试通了然后再说下面的自己看看就可 KEIL自己先调试通了然后再说下面的事 ...

  7. 计算机串口连接原理,串口通信的原理及USB转串口通信

    串口通信的原理 串口通信(SerialCommunicaTIons)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一 ...

  8. 投影串口测试程序_【原创】串口通信测试程序

    源代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

  9. 梳理STM32F429之通信传输部分---NO.3 串口空闲IDEL中断+DMA+FreeRTOS

    梳理STM32F429之通信传输部分---NO.3 串口空闲IDEL中断+DMA+FreeRTOS 目录 一.串口空闲IDEL中断: 二.串口及串口中断的配置: 三.stm32f4xx_it.h 的配 ...

最新文章

  1. CVPR2020事件相机(Event Camera)研究文章汇总
  2. 虚拟机备份oracle异常,客户端连接虚拟机Oracle服务器异常
  3. mysql 体系结构不匹配_指定的DSN包含驱动程序和应用程序之间的体系结构不匹配...
  4. Android开发之获取通知栏的内容
  5. STM32 system_stm32f10x.c文件分析
  6. properties文件的分类级别
  7. 信息学奥赛一本通(2053:【例3.3】三个数)
  8. ELK下filebeat性能调优
  9. Java read failed_android-获取java.io.IOException:读取失败,套接...
  10. 【AppScan闪退】
  11. 用C++编写一个走迷宫游戏(1.0版)
  12. Java_题目_抽奖的2种实现方法
  13. opencv滤镜-素描
  14. “XXX.exe 中的 0xXXXXXXXX处未处理的异常: 0xC0000005: 读取位置 0xXXXXXXXX 时发生访问冲突”的一种解决方案
  15. 《Cisco防火墙》一6.5 虚拟防火墙的管理访问
  16. 线程安全——strtok VS strtok_r
  17. ARM neon详解
  18. 推荐系统的召回算法(一)—— 协同过滤法(基于用户)
  19. Docker部署及常见问题
  20. MVGCN 人群流量预测模型 笔记

热门文章

  1. 【AWSL】之Linux常用命令,学习Linux,这一篇就够了(type、echo、enable、du、ls、mkdir、touch、ln、cp、rm、mv、find、gzip、bzip、tar)
  2. mysql 8重置root密码_如何在MySQL 8中重置root密码
  3. 1039: 二哥的困惑 Ⅱ
  4. 阿里云微服务引擎MSE网关功能,开启微服务“大门”云化时代
  5. 从0到1,从概念到国际标准,蚂蚁共享智能凭什么?
  6. 阿里云李飞飞:传统数据库步履蹒跚,未来的机会在哪里?
  7. K8s 工程师必懂的 10 种 Ingress 控制器
  8. 文件按m3u8顺序合并_在线视频下载之m3u8篇
  9. 《最终幻想7 重制版》DEMO体验:讨论ATB战斗系统的一些问题
  10. Intel:酷睿第12代CPU在游戏中有很大的优化空间