串口通信接受数据为负数时的处理方法

串口接收上位机以字符串发送的数字(可以为多位小数,负数) 上位机以字符串形式发送数据;然后单片机通过串口中断接收不定长小数,负数或正数。 阅读详情
AI摘要

本文详细解释了如何在串口通信中正确解析返回的负数,涉及补码表示、字节合并和有符号整数转换,重点在于理解无符号位问题并提供代码示例。

一般串口通信返回得数据为两个字节(byte);

此时两个字节总共有16位,举个例子:

当返回数据位 10时:

返回的两个字节数据16进制数是 0x00,0x0A,

返回的两个字节数据10进制数是00,10,

返回的两个字节数据2进制数是0000 0000 0000 1010;

所以此时直接讲第一个字节数据左移八位后加上第二个字节就是正常数据。

(0x00 << 8) + 0x0A;    *注意:0x00 << 8 要加上括号

代码实现:

int Currentvalue = (byte[0] << 8) + byte[1];

 

当返回数据为负数 -10时:

返回的两个字节数据16进制数是 0xFF,0xF6,这是因为负数在机器中存储为补码(详情搜补码)

返回的两个字节数据2进制数是1111 1111 1111 0110;

如果这个时候我们直接调用上面的代码实现,会发现它的值为65535,很明显值不对。

这是因为有无符号位的问题,此时应该将转化后的数值转化为有符号位的;

int Currentvalue =(short)( (byte[0] << 8) + byte[1]);

此时返回数值为-10,获取正常。

 

 

整型正数与负数是如何在机器(以stm32为例)中存储与传递的--结合C语言的数据类型转换讲解 首先我来说一下我要讲清楚的问题是什么。这样对你好我也好,才是真的好,扯远了哈。问题是:我需要从一块stm32中的寄存器(下面我说A板)中读取一个 8位有符号整型数据,然后储存在另一块stm32的板子(下面我说B板)上,用一个无符号的整型数据储存,然后再把这个数据赋值给一个有符号的整型数据。这里面显然涉及到强制类型转换有人说,会不会存在我读取一个负数然后经过这一强制转换后会不会出现错误。 首先我 阅读详情

相关推荐

STM32与ROS之间的串口通信

STM32与ROS之间的串口通信

mxh3600的博客 4117

串口通信——串口助手发送正数/负数(以ascii码的形式发送或者以16进制形式发送),最后展示出发送的数

先找规律,这里是假设发送的数字是-29987,函数中传入的值一个是数组,一个是数组的总索引值,这里取到的字节首先要减去0X30,得到这个数字是几,然后再乘以10的几次方,2在万位上,需要乘以10000,它的索引值对应的是1,传来的索引总数是6,所以乘的10次方应该是:10的次方数 = 6(总索引值) - 1(2所在的索引值) - 1;9在千位上,需要乘以1000,它的索引值对应的是2,传来的索引总数是5,所以乘的10次方应该是:10的次方数 = 5(总索引值) - 1(2所在的索引值) - 1;

m0_64053511的博客 1万+

单片机串口接收负数的处理方法

如dpm计算的结果,插入dpm后有时候会得到0xFFFFFFFE=-2(从调试界面也可以看到)。dp80中有很多外设处理相关的都是有符号数据。

nuoyigui9889的博客 836

C#串口通信发送与接收负数

C#学习记录

qq_53881113的博客 1457

上位机Qt应用程序与MCU板子之间的串口数据传输算法,举例1字节、2字节、4字节正负数。再加qDebug的重定向显示打印数据。

串口之间的数据传输算法 前言 【1】Qt界面设计图 【2】串口char型举例 串口收发正数举例 串口收发负数举例 【3】串口short 型举例 大端序和小端序 串口收发正数举例 串口收发负数举例 【4】串口int型举例 串口收发正数举例 串口收发负数举例 串口收发正负数(简洁版推荐) 【5】浮点数思路

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 1992

瑞萨单片机-硬件I2C从设备

瑞萨单片机上实现I2C从机,根据主机发来的数据,从机返回或者保存数据2、R5F1115AxFL最多支持3个从设备地址(即可以作为三个从设备)3、从接收模式:直接将数据保存到RAM中,接收完再处理4、从发送模式:按照I2C读取传感器数据经验,主机读取从设备时,从设备需要立刻返回数据的,但是程序要如何实现一收到指令就返回特定的数据?(时钟拉伸)这里先跳过,我们先实现返回固定的数据。

qq_27893147的博客 3220

博客摘录「 串口通信接受数据为负数时的处理方法」2023年9月26日

这是因为有无符号位的问题,此时应该将转化后的数值转化为有符号位的;

weixin_65652643的博客 345

Ubuntu环境下rknn-toolkit2的安装与兼容性解析

本文详细解析了在Ubuntu系统上安装瑞芯微rknn-toolkit2工具链的完整流程与关键注意事项。文章重点剖析了rknn-toolkit2与旧版rknn-toolkit的核心兼容性问题,强调两者在API、模型格式及运行时库上互不兼容,并推荐使用Conda虚拟环境进行隔离管理,为RK3566、RK3588等开发板的AI模型部署提供清晰的实践指南。

weixin_29041767的博客 374

对串口接受到的负数数据进行处理

对串口接收到的负数数据进行处理 因为要做一个电容传感器的项目,写了一个简单的串口通信,但是观察串口数据的时候发现了一个问题,负数数据读不到,所以根据这一问题又修改了代码如下。 # singed_bin2dec.py import os, sys, re def int_convert(data,width): if (data > 2 ** (width - 1) - 1): data = data - 2 ** width return data a = 255

weixin_42716741的博客 5724

【笔记】使用OrCAD对电路进行蒙特卡洛分析和最坏分析

使用OrCAD对电路进行蒙特卡洛分析和最坏分析

fang_dz999的博客 3147

高效搭建微信公众号爬虫全流程

微信公众号爬虫系统成功完成功能测试验证。该系统具备完整的数据采集与管理能力,支持多公众号内容爬取、数据存储与统计分析。通过命令行界面可执行爬取操作(如量子位、新智元等公众号),查看最新文章列表和系统统计信息。测试显示SQLite数据库正常存储数据,所有核心功能(多源支持、文章检索、数据统计)均运行良好。系统采用模块化设计,扩展性强,为后续接入真实API或网页爬取奠定了坚实基础,是AI内容聚合的优质开发平台。🎉

weixin_44975687的博客 1553

嵌入式开发在通讯协议中关于浮点数,负数常用处理方式

本文简单分享了在嵌入式开发中,在通讯协议这一方面关于浮点数,负数的下位机发送与上位机接收以及解析相关内容。包括常用的解决方案,比如协商单位,*10上传或者*100上传;使用c语言特性:联合体,内存拷贝函数,再或者用指针强转法。最后分享了关于C#上位机的一些解码办法。

Joshua的博客 1340

1.30 Cubemx_STM32H743 SD_Card纳入文件管理系统

Cubemx_STM32H743 SD_Card纳入文件管理系统1、简介2、CubeMX配置 1、简介 和前面文章原理其实一样的。 1.29 Cubemx_STM32F429\H743 nandflash、spifalsh纳入文件管理系统 现在一并将SD卡、NandFlash、SPIFlash一并作为文件管理。 下面直接介绍SDcard,其他参考前面文章。 2、CubeMX配置 ...

oDuanYanGuHong的博客 1079

关于串口通信(多个数据包组装成一个包)

参考:http://wenku.baidu.com/view/cc833787bceb19e8b8f6ba53.html1、创建缓存接收数据的类using System; using System.Collections.Generic; /// /// 创建数据接收队列 /// CRecvBuf是一个用于缓存接收数据的类,利用List类来实现。 /// 在创建该类的实例时,要制定参数maxLength,表示队列的总容量。 /// 每当接收到一段数据,就调用Add方法将收到的数据添加到队列中,

qxw88的专栏 5365

汇川EASY521 PLC实战指南:从硬件选型到程序架构与故障排查

可编程逻辑控制器(PLC)是工业自动化系统的核心大脑,其工作原理基于循环扫描机制,持续读取输入、执行用户程序并更新输出。这种确定性控制方式,使其在逻辑控制、顺序控制和运动控制中具有不可替代的技术价值,广泛应用于机械设备、生产线和过程控制等场景。对于汇川EASY521这类紧凑型高性能PLC,其核心优势在于集成了运动控制与丰富通讯接口,为中小型设备提供了高性价比的一站式解决方案。在实际应用中,工程师常需处理如“汇川sv660n”伺服驱动器的集成调试,或利用“hslcommunication”等开源库实现C#上位

weixin_42525264的博客 735

【OpenClaw从入门到精通】第15篇:国产芯片适配实战——昇腾/龙芯/天数智芯全流程跑通(2026实测版)

2026年国产芯片AI适配迎来爆发期,OpenClaw作为轻量化本地AI智能体,已实现华为昇腾、龙芯、天数智芯等主流国产平台的全流程适配。本文基于实测数据,从背景解析、核心原理、算法优化、实操部署四个维度,详细讲解OpenClaw在香橙派昇腾开发板、龙芯3B6000M、天数彤央TY1200及联想开天X7h的部署流程,同时提供统一工具玄武CLI的使用指南。文中包含完整代码、执行结果、避坑技巧及虚拟实战案例,兼顾新手入门与进阶提升,帮助读者快速掌握国产芯片上的本地AI部署能力,实现数据隐私保护与低成本AI落地。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1005

MATLAB十进制转十六进制:整数、小数、负数补码与串口通信实战

进制转换是嵌入式开发与底层通信的基础技术,其中十六进制与十进制的相互转换尤为关键。其原理基于位权展开与补码表示,直接影响数据精度与传输可靠性。在工业控制、汽车电子、仪器仪表等领域,MATLAB常作为上位机算法验证工具,需将十进制数转换为十六进制帧通过串口发送。然而,整数位宽补零、小数精度缩放、负数补码位宽选择等细节极易出错。本文聚焦MATLAB环境,深入解析dec2hex函数陷阱、定点数法、补码转换及向量化批量处理,结合串口字节序与数据帧组装,提供可直接复用的工程代码与避坑指南。

weixin_29169505的博客 175

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C语言实验单片机串口发送int型数据

void SendIint(int n)reentrant { unsigned char s; while(n!=0) { s=(unsigned char)n%10+48; SendByte(s); s=s/10; } } void SendInt(int n) { if(n==0) { SendByte(48); } else if(n>0)...

weixin_30325071的博客 998

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

sprintf的格式化数据的时候,unsigned int 型%d打印为负数的解决办法

#include "string.h" #include "stdlib.h" void main() { unsigned char num[10] = {0}; memset(num, 0, 10); sprintf(num,"%d",(unsigned char)(0xFF)); printf("%s\n",num); sprintf(num,"%d",(sign...

happygrilclh的博客 6238

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

python3串口通信16进制_STM32串口通信——16进制数形式

一.为什么采用16进制数形式?首先,需要解释一下串口发送的数据都是unsigned char类型的,说成字符和16进制形式,只是我们采用何种方式展示这些数据。字符形式就是把16进制数通过ASCII表一个一个转成字符的。一开始接触到的串口程序,就是字符形式的,尤其是STM32中被重构的printf()函数,我就先入为主地选择了字符形式。这样比较人性化,因为啥数据都是平时看到的字符,很直观,但是大大降...

weixin_39892800的博客 2706

Python 与 RS-485 传感器设备进行串口通信, 读取数值

使用Python与RS-485传感器设备, 进行串口通信; 将RS - 485传感器设备先转成RS-232, 然后将RS -232转成USB串口, 插入到串口, 即可使用电脑COM进行串口通信与485设备进行通信

Y_xianlin的博客 1万+

单片机: 自定义串口通信协议的实现

使用51单片机完成一个简单的串口通信协议。 要求: 一个协议帧为8个字节,其中头部两个字节,分别是0xFF,0xFE; 第3个字节代表第一个数据,第4个字节代表第二个数据(均为正数); 第5个字节如果是0,代表两个数据的和,1的话代表两个数据的差; 第6个字节为0,代表使用十进制显示,为1代表十六进制显示; 最后两个字节代表协议尾部,值分别为0xFD,0xFC。 将传输的两个

NK_test的博客 1万+
上一篇: 2021-02-24
下一篇: 对IOC(控制反转)的理解
黄焖大排骨
博客等级 码龄8年 52粉丝 19原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值