OpenEdv-开源电子网

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

串口输出16进制,能么?

[复制链接]

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
发表于 2016-8-19 08:53:38 | 显示全部楼层 |阅读模式
1金钱
希望实现的效果:

u8  a=  0xAB;
串口输出,希望在串口助手中显示0xAB  (可以是HEX显示)

如果用原子哥的,printf("%d",a),串口接收到的是10进制 171 ,主要是想进行crc校验~

怎么实现呢?

最佳答案

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

你要的应该是这个吧?比如某模块,向它写命令时需要写十六进制数,就可以这样写 for(t=0;tSR&0X40)==0); USART2->DR = (u8) buf[t]; } 直接向寄存器里写值然后输出,封装好的printf函数都不能显示成十六进制的,会直接转成ASCII。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-8-19 08:53:39 | 显示全部楼层
你要的应该是这个吧?比如某模块,向它写命令时需要写十六进制数,就可以这样写
        for(t=0;t<length;t++)     //发送整包数据
        {
                while((USART2->SR&0X40)==0);
                USART2->DR = (u8) buf[t];
        }
直接向寄存器里写值然后输出,封装好的printf函数都不能显示成十六进制的,会直接转成ASCII。
自在随心
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
 楼主| 发表于 2016-8-19 08:56:22 | 显示全部楼层
当然  如果  
printf("%c",a)的话,显示就是AB了,但是这么好像不对吧
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-8-19 09:17:33 | 显示全部楼层
printf("%x",a),
回复

使用道具 举报

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
发表于 2016-8-19 09:19:21 | 显示全部楼层
%x 就行了
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2016-8-19 09:48:12 | 显示全部楼层
显示出来是171而已,你定义一个uint8_t 的变量存储这个171,照样可以拿去做CRC
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11541
金钱
11541
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-8-19 09:50:09 | 显示全部楼层

串口只懂0和1,进制与它无关。

回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-19 10:26:19 | 显示全部楼层
串口助手显示跟写的人有关,你找个支持hex显示的吧,我见过很多都是支持的啊,你找找界面上是否有显示hex的勾勾。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-8-19 10:53:20 | 显示全部楼层
串口输出十六进制printf("%x",a);,如果想象0XFF这样带0X标记的就用,printf("%#x",a);
开往春天的手扶拖拉机
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-8-19 13:19:20 | 显示全部楼层
本帖最后由 yuzeyuan1 于 2016-8-19 13:21 编辑

你要的应该是这个吧?比如某模块,向它写命令时需要写十六进制数,就可以这样写
        for(t=0;t<length;t++)     //发送整包数据
        {
                while((USART2->SR&0X40)==0);
                USART2->DR = (u8) buf[t];
        }
直接向寄存器里写值然后输出,封装好的printf函数都不能显示成十六进制的,会直接转成ASCII。
自在随心
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
 楼主| 发表于 2016-8-19 14:45:15 | 显示全部楼层
yuzeyuan1 发表于 2016-8-19 13:19
你要的应该是这个吧?比如某模块,向它写命令时需要写十六进制数,就可以这样写
        for(t=0;tSR&0X40 ...

谢谢,我试一下。感觉好像都是ASCLL码的形式呢,十六进制我再试下你说的这样做。
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
 楼主| 发表于 2016-8-19 14:59:18 | 显示全部楼层
正解,这么输出的直接就是16进制的数了。
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
 楼主| 发表于 2016-8-19 15:09:44 | 显示全部楼层
yuzeyuan1 发表于 2016-8-19 13:19
你要的应该是这个吧?比如某模块,向它写命令时需要写十六进制数,就可以这样写
        for(t=0;tSR&0X40 ...

再问下哈,对寄存器不太懂。我要是用库函数接收的话,
C:\Documents and Settings\Administrator\桌面\QQ截图20160819150801

串口助手发什么我就会收到什么吧
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
 楼主| 发表于 2016-8-19 15:10:40 | 显示全部楼层
高天小圣 发表于 2016-8-19 15:09
再问下哈,对寄存器不太懂。我要是用库函数接收的话,

图片没有显示呢

库函数如下

uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  
  /* Receive Data */
  return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
}
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-8-20 09:55:30 | 显示全部楼层
高天小圣 发表于 2016-8-19 15:10
图片没有显示呢

库函数如下

没有玩过这个,不知道01FF是啥,我那块代码的意思是:当检测到发送完成,就再把下一个字节塞进DR这个寄存器,直到所有字节都发完。
你的这个函数看着是“串口助手发什么我就会收到什么”。
下面是触发串口2的中断,然后从串口2读数据,所以你这个看着是对的,自己参考一下。
void USART2_IRQHandler(void)
{
        u8 res;            
        if(USART2->SR&(1<<5))//接收到数据
        {         
                res=USART2->DR;                          
                if(USART2_RX_STA<USART2_MAX_RECV_LEN)                //还可以接收数据
                {
                        TIM4->CNT=0;                                                 //计数器清空
                        if(USART2_RX_STA==0)TIM4_Set(1);                 //使能定时器4的中断
                        USART2_RX_BUF[USART2_RX_STA++]=res;                //记录接收到的值         
                }else
                {
                        USART2_RX_STA|=1<<15;                                        //强制标记接收完成
                }
        }                                                                                           
}
自在随心
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-1 01:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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