OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4908|回复: 4

怎么提取串口的数据变成数字形式赋值给另外一个整型变量

[复制链接]

5

主题

24

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2016-6-8
在线时间
10 小时
发表于 2016-8-7 21:10:41 | 显示全部楼层 |阅读模式
5金钱
我定义了一个u8 的数组USART2_RX_BUF[],我通过电脑串口调试助手给STM32发送数字1500,我怎么把这个整型1500数字提取出来赋给一个变量,让他成为一个数。串口打印到电脑上的1500,但是这个是数组的变量吧?我就是想电脑通过串口调试助手发送1500,讲这个1500数最后提出出来,赋值给CCR电机的占空比来控制转速,,,求解


串口

串口

最佳答案

查看完整内容[请看2#楼]

提取出来, 还要看是附值给什么类型 16位, 32位 ? 按你说的 应该用16位的 那么要看你这1500在这数组中的位置, 一般定义的协议中, 位置固定的 调用处理接收到的数据, rx_len接收到的数据长度 Data_Receive_Anl(USART2_RX_BUF, rx_len); void Data_Receive_Anl(u8 *data_buf, u8 num) { vs16 temp; vs32 temp2; //判断帧头 0,1位是否上位机发来的 if(!(*(data_buf) == 0xAA && *(data_buf + 1) = ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

58

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5460
金钱
5460
注册时间
2016-3-23
在线时间
483 小时
发表于 2016-8-7 21:10:42 | 显示全部楼层
本帖最后由 skygz 于 2016-8-7 22:16 编辑

提取出来, 还要看是附值给什么类型 16位, 32位 ?

按你说的 应该用16位的

那么要看你这1500在这数组中的位置,   

一般定义的协议中,   位置固定的

调用处理接收到的数据, rx_len接收到的数据长度
Data_Receive_Anl(USART2_RX_BUF, rx_len);


void Data_Receive_Anl(u8 *data_buf, u8 num)
{
    vs16 temp;    vs32 temp2;
//判断帧头 0,1位是否上位机发来的

if(!(*(data_buf) == 0xAA && *(data_buf + 1) == 0xAB))                return;                //判断帧头

    //数据 固定在 3,4位置,  前面 一般是 帧头,   没有帧头的 就要自已处理判断了
    //看你数据长度,  1500 转 十六进制 就要占用2个字节,    1个字节 8位,  2个字节就是16位

    temp = (*(data_buf + 3) << 8) | *(data_buf + 4);  //将数据3\4位合并到 vs16位的变量中..

      //如果是32位数据长度, 就占用4个字节,
    temp2 = (*(data_buf + 3) << 24) | (*(data_buf + 4) << 16) | (*(data_buf + 5) << 8) | *(data_buf + 6);  合并到32位变量中..
}

回复

使用道具 举报

10

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2016-4-16
在线时间
13 小时
发表于 2016-8-16 23:38:59 | 显示全部楼层
大哥你这个是用串口的ASCII码而不是16进制发送吗,我最近也是这个问题,如果我发送123,那么串口输出就是31 32 33,这样达不到我要的目的啊,你那个问题程序是怎么解决的啊
回复

使用道具 举报

6

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-12-11
在线时间
53 小时
发表于 2016-8-17 08:07:43 | 显示全部楼层
skygz 发表于 2016-8-7 21:10
提取出来, 还要看是附值给什么类型 16位, 32位 ?

按你说的 应该用16位的

很详细的解释,5星好评!
Try again and there is nothing left to say.
回复

使用道具 举报

2

主题

58

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5460
金钱
5460
注册时间
2016-3-23
在线时间
483 小时
发表于 2016-8-17 13:21:46 | 显示全部楼层
本帖最后由 skygz 于 2016-8-17 13:35 编辑
bosir 发表于 2016-8-16 23:38
大哥你这个是用串口的ASCII码而不是16进制发送吗,我最近也是这个问题,如果我发送123,那么串口输出就是31 ...

不推荐用单片机处理 ASCII数据,  在单片机 等于是 字符串,  你还要转换为数字,  单片机空间小, 处理起来麻烦,       ASCII多长的字符, 发到单片机 就占多长的U8数组, 非常不理想,
例如 123.456  当单片机收到就要占用7个字节,   如果 数据都是不定长的,下次可能是 233.1  这时 收到的又是占用5个字节      单片机这数据 不定长度的数据,  要合并起到一个float变量就麻烦了

如果用 十六进制 就不存在这问题了,    浮点数  就只占 4个字节,  不管你是什么样的浮点数都是 4字节, 单片机 只要将收到的4字节 合并到一个float变量即可




ASCII             0------------9                   小数点.
十六进制         0x30---------0x39             小数点0x2e
十进制            48--------57                    小数点46


单片机里接收到的数据一般是 U8数组,       那么你需要将收到数组 每一个 减去 48值 这时每个U8值就是 对应的数字

那么, 你还要 将数组每个值合并起来到单个   变量里  才能算一个数.......       但是 ASCII字串 不定长度的,  这就不好处理了

回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-6 21:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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