OpenEdv-开源电子网

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

AT指令发送hex数据问题,使用的是sprintf函数

[复制链接]

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
发表于 2020-12-24 15:44:13 | 显示全部楼层 |阅读模式
25金钱
本帖最后由 lyy26655 于 2020-12-25 16:04 编辑

目前想用NB模块发送数据到平台,格式为AT+SENDHEX=1,length,string
想要发送的数据我存到了数组temp中,uint8_t temp[256];

用memcpy(temp,&trandata,sizeof(tandata_T))拷贝到temp后用HAL_Transmit(&huart1,temp,length,0xffff)发送到1号串口的数据都正常,输出为16进制数,想请问memcpy是不会做类型转换的是吗?

NB模块这个串口需要加上AT指令AT+SENDHEX=,所以我用了sprintf(temp2,"AT+SENDHEX=1,%d,%s",strlen(temp),temp),

temp开头 5A 00 12 34 56

经过这一步因为strlen遇到00,只能输出一个字符,发现sprintf将temp里的内容转为了ASIIC,只能输出0x5A代表的一个字符Z就停止了,是因为sprintf会做类型转换吗?就算将%s换为%x也不行

为什么memcpy就可以输出原样数据,sprintf就不可以混合字符+16进制数据输出呢?  在网上查了下,sprintf叫格式化输出,请问什么叫格式化输出呢

现在想要做的就是将  AT+SENDHEX=1,length,5A 00 12 34 56 原样的输出到temp2里,请问怎么做呢?



用7#的笨办法解决了,后面找到更合理的方法会更新在这儿,有做过单片机发送网络模块AT+指令=HEX数据的同学也可以把经验分享一下

最佳答案

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

strlen以内存为空作为长度的判断依据
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2020-12-24 15:44:14 | 显示全部楼层
strlen以内存为空作为长度的判断依据
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-24 15:53:00 | 显示全部楼层
本帖最后由 lyy26655 于 2020-12-25 16:03 编辑

在网上看到一个方法,不知道可行不可行,请大佬们评估下:C语言实现AT指令ASCII码的拼接处理流程 https://blog.csdn.net/morixinguan/article/details/82966871

//将字符串(只包含数字)全部转换成ascii
int strnumber_to_asciistr(char *dest,const char *src,int len)
{
        int i = 0 ;
        if(0 == len || NULL == src || NULL == dest)
                return -1;
        else
        {
                for(i = 0 ; i < len ; i++,src++)
                {
                        if(*src < '0' || *src > '9')
                                return -2 ;
                        *dest++ = "0123456789"[*src >> 4];
                        *dest++ = "0123456789"[*src & 0x0f];
                }
                *dest = '\0';
                return 0 ;
        }
}

平台不支持ASCII,删了
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-24 16:40:19 | 显示全部楼层
用了这个函数,并不好用
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-12-24 17:01:27 | 显示全部楼层
temp不是字符串,不能strlen. 灵活使用格式化输出跟memcpy即可:
  1.     uint8_t temp[256];
  2.     int n, length;

  3.     n = snprintf(temp, sizeof(temp), "AT+SENDHEX=1,%u,", (unsigned int)sizeof(tandata_T));
  4.     memcpy(temp + n, &trandata, sizeof(trandata));

  5.     length = n + sizeof(trandata);
复制代码
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-24 17:05:46 | 显示全部楼层
ufbycd 发表于 2020-12-24 17:01
temp不是字符串,不能strlen. 灵活使用格式化输出跟memcpy即可:

太感谢您了,我去试试
回复

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
金钱
1053
注册时间
2020-5-11
在线时间
253 小时
发表于 2020-12-24 17:46:32 | 显示全部楼层
本帖最后由 thisisdemo 于 2020-12-24 17:47 编辑

回复错了回复错了
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-25 09:15:48 | 显示全部楼层
本帖最后由 lyy26655 于 2020-12-25 16:01 编辑
ufbycd 发表于 2020-12-24 17:01
temp不是字符串,不能strlen. 灵活使用格式化输出跟memcpy即可:

您好,昨天应该没有太表示清楚,按照您的方法现在程序输出的是AT+SENDHEX=1,length,5A 00 12 34 56 ,到串口调试助手显示的是
AT+SENDHEX=1,length,ASCII码,如果想在串口调试助手输出AT+SENDHEX=1,length,5A 00 12 34 56 是不是得程序输出的是AT+SENDHEX=1,length,ASCII码,还得在程序里将5A 00 12 34 56转为ASCII码才行
想了下这样应该做不到或者不容易做到,找到一个方法
sprintf(temp,"AT+SENDHEX=1,%d,5A00%2X%2X%2X%2X%2X%2X…………",length,trandata.data1[1],trandata.data1[2],trandata.data1[3],trandata.data1[4],trandata.data1[5],trandata.data1[6])
但现在一包数据字节非常多,这样弄不仅工作量大而且容易出错

回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2020-12-25 16:03:51 | 显示全部楼层
ricefat 发表于 2020-12-25 13:21
strlen以内存为空作为长度的判断依据

感谢,自己的确是基础不牢靠
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 12:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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