数码之家

 找回密码
 立即注册
搜索
查看: 1980|回复: 19

[C51] 单片机接收十六进制串口发送十进制程序

[复制链接]
发表于 2021-9-5 08:21:05 | 显示全部楼层 |阅读模式
100家元
做一个粉尘传感器,但是粉尘传感器接收的是十六进制的24位的数据,想知道如何让单片机只读取24位中第 14位的数据,图片中画红圈圈的09,让单片机只读取09,并转换成10进制 以串口的形式发送的程序,谢谢!
QQ图片20210905081414.png




发表于 2021-9-5 08:53:05 来自手机浏览器 | 显示全部楼层
把其他位都与0,需要的位与上1,或者用移位指令把他移出来。进制转换更简单对应第几位就省以2^几次方就得了
回复

使用道具 举报

发表于 2021-9-5 10:08:14 | 显示全部楼层
char a[24];
a=xx;//接收的数据
int b=a[13];
xxx;//串口发送b
回复

使用道具 举报

发表于 2021-9-5 10:15:18 | 显示全部楼层
cxw0102 发表于 2021-9-5 10:08
char a[24];
a=xx;//接收的数据
int b=a[13];

一个char非要转成int?
回复

使用道具 举报

 楼主| 发表于 2021-9-5 10:29:24 来自手机浏览器 | 显示全部楼层
cxw0102 发表于 2021-9-5 10:08
char a[24];
a=xx;//接收的数据
int b=a[13];

能不能把完整程序发出来 谢谢了
回复

使用道具 举报

发表于 2021-9-5 10:45:12 | 显示全部楼层
建个数组,把这些存进去,然后单独读需要得位不就行了?
回复

使用道具 举报

 楼主| 发表于 2021-9-5 10:54:33 来自手机浏览器 | 显示全部楼层
奶瓶_NP 发表于 2021-9-5 10:45
建个数组,把这些存进去,然后单独读需要得位不就行了?

数据是每隔一秒自动更新的,怎么个单独读取需要的位?
回复

使用道具 举报

发表于 2021-9-5 11:27:05 | 显示全部楼层
波特率是多少?通讯格式是什么是?用什么型号的单片机?
回复

使用道具 举报

 楼主| 发表于 2021-9-5 12:16:40 来自手机浏览器 | 显示全部楼层
深山老妖 发表于 2021-9-5 11:27
波特率是多少?通讯格式是什么是?用什么型号的单片机?

9600,单片机stc12c2052ad,c语言的
回复

使用道具 举报

 楼主| 发表于 2021-9-5 13:39:07 来自手机浏览器 | 显示全部楼层
深山老妖 发表于 2021-9-5 11:27
波特率是多少?通讯格式是什么是?用什么型号的单片机?

波特率是9600,十六进制格式接收 单片机是stc12c2052ad
回复

使用道具 举报

发表于 2021-9-5 18:24:49 | 显示全部楼层
有点不明白你的需求,你是想将一个0x00-0xFF的unsigned char转换成0-99的BCD码?如果是的话,给你个代码:
unsigned char HEXtoBCD(unsigned char HEX_data)
{
unsigned char i,j;
j=HEX_data%10;//计算十进制个位
i=HEX_data;
i=i/10;
i=i%10;//计算十进制十位
i=i*10+j;//计算十位*10+个位

return i,
}
回复

使用道具 举报

发表于 2021-9-5 20:23:15 来自手机浏览器 | 显示全部楼层
没太看明白要求,0x09应该不是第14位啊
回复

使用道具 举报

 楼主| 发表于 2021-9-5 20:56:25 来自手机浏览器 | 显示全部楼层
hhtlover 发表于 2021-9-5 20:23
没太看明白要求,0x09应该不是第14位啊

我是从42开始数的
回复

使用道具 举报

发表于 2021-9-6 08:05:29 来自手机浏览器 | 显示全部楼层
yyou58 发表于 2021-9-5 20:56
我是从42开始数的

那明白了,是要截取第14个字节!

设置个byte或者u8int接收数组,接到的数据通过校验规则后,截取第14个字节就可以了,注意默认数组索引是13
回复

使用道具 举报

 楼主| 发表于 2021-9-6 08:56:15 来自手机浏览器 | 显示全部楼层
hhtlover 发表于 2021-9-6 08:05
那明白了,是要截取第14个字节!

设置个byte或者u8int接收数组,接到的数据通过校验规则后,截取第14个 ...

代码能不能发一下
回复

使用道具 举报

发表于 2021-9-7 22:34:08 来自手机浏览器 | 显示全部楼层
都是大神的样子………:loveliness:
回复

使用道具 举报

发表于 2021-9-8 14:13:39 | 显示全部楼层
本帖最后由 yuandm1 于 2021-9-8 14:19 编辑

题主应该是想要第14字节的数据啊,不是第14位的数据,按你列出来的数据合适,单片机串口应该能接收到了数据了吧,收到数据保存在一个数组里面,直接用第14个数据就可以了啊。具体的串口收发程序,你可以百度一下,非常多的代码可以参考。
回复

使用道具 举报

发表于 2021-9-8 16:12:25 | 显示全部楼层
玄武狂蛇 发表于 2021-9-5 18:24
有点不明白你的需求,你是想将一个0x00-0xFF的unsigned char转换成0-99的BCD码?如果是的话,给你个代码:
...

uchar Hex2Bcd(uchar ch)
{
     ch = ((ch/10)<<4) + (ch%10);
     return (ch);
}
回复

使用道具 举报

发表于 2021-9-11 12:44:35 | 显示全部楼层
LZ 遗漏了一个重要的细节,导致大家根本没法回答:现有的 C 代码是如何分包的?

你的单片机如何接收现有 24 字节数据包,并判断接收完成(即分包)?
目测 LZ 根本就没有现成的分包代码,在这里求第 14 字节的抽取代码,实际隐含要做分包处理。

如果连分包都要做的话,建议 LZ  准备好银子,100M 币太少。
回复

使用道具 举报

发表于 2021-9-13 10:37:23 | 显示全部楼层
那么简单的事情也要求助?程序不是楼主写的? 数据收下来了要哪个字节不是分分钟的事?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-19 21:55 , Processed in 0.249600 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表