OpenEdv-开源电子网

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

0x00如何发送?

[复制链接]

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
发表于 2014-9-26 15:32:17 | 显示全部楼层 |阅读模式
5金钱
请教一下,0x00  和  \0   有什么区别?
库函数  
[mw_shl_code=c,true]void USART_SendData(USART_TypeDef* USARTx, u16 Data) { /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_DATA(Data)); /* Transmit Data */ USARTx->DR = (Data & (u16)0x01FF); }[/mw_shl_code]




这个函数是不是不能发送0x00啊?

最佳答案

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

回复【5楼】fly0000: --------------------------------- 刚刚自己找到问题了,是数组定义小了。。看来还是书看的少了。 书中这样写道:定义字符串数组时,数组长度是其中最多字符数加1.例如,声明拥有长度为10的字符串数组str时,应该书写为:  char str[11]; 改了一下数组大小,数据就不重复了。。 看来果然是沿着地址一直往下找\0。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-9-26 15:32:18 | 显示全部楼层
回复【5楼】fly0000:
---------------------------------
刚刚自己找到问题了,是数组定义小了。。看来还是书看的少了。
书中这样写道:定义字符串数组时,数组长度是其中最多字符数加1.例如,声明拥有长度为10的字符串数组str时,应该书写为:
 char str[11];
改了一下数组大小,数据就不重复了。。
看来果然是沿着地址一直往下找\0。。。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2014-9-26 15:54:44 | 显示全部楼层
看到寄存器操作就头疼,这东西写以后维护成本太高,  ----------------------能发送的 0000 0000 USARTx->DR = (Data & (u16)0x01FF); 01就是DR寄存器一个给发送用(TDR),一个给接收
用(RDR),该寄存器兼具读和写的功能 就是发送用寄存器低位先传输
-----------------------------------------------------------
你还是用库函数 把,孩子,好移植,要是你老板看你一个人用寄存器写程序,谁有耐心看花多大人力成本维护啊,走正道把。USART_SendData(USART1, 0x00);一句就好了
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-9-26 16:48:32 | 显示全部楼层
回复【2楼】cornrn:
---------------------------------
嗯嗯,我是用库函数的。
刚刚发现是接收端接收不到0x00,发送端能够发送出去的。用USART_SendData(USART1, 0x00) 是可以的。
但是我用自己写的
void USART_Printf(USART_TypeDef* USARTx,char *pch) 
{
while(*pch != '\0')
{
        USART_SendData(USARTx,*pch); 
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); 
  USART_ClearFlag(USARTx, USART_FLAG_TXE);
        pch++;
    }
}
确实发送不出0x00。。。。

按理说0x00不等于\0的呀。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-26 22:26:13 | 显示全部楼层
你的串口助手没有设置16进制显示吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-9-27 13:43:16 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
设置了16进制显示,我用单步调试发现,\0在内存中的值就是等于0x0000 0000
也就是说,0x00是无法发送。
这是我发送字符串的函数。
void USART_Printf(USART_TypeDef* USARTx,char *pch) 
{
while(*pch != '\0')
{
        USART_Send_Byte(USARTx,*pch); 
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); 
  USART_ClearFlag(USARTx, USART_FLAG_TXE);
        pch++;
    }
}

现在想发送一个字符串,必须得先求出字符串的长度,然后用
{for(i=0;i<strlen(str);i++)
        USART_Send_Byte(UART5,str);   }

并且我还发现,用上面的那个函数发送字符串的时候。
我定义了好多个字符串。。。我发送一个字符串,他就把从那个字符串地址开始往后的所有字符串都给发送了。   
char s4[4]={0x37,0x30,0x31,0x30,0x37};   
char s5[7]={0x44,0x41,0x2D,0x55,0x32,0x34,0x44};       
char s6[7]={0x34,0x33,0x32,0x33,0x33,0x35,0x34};   
比如我发送
 USART_Printf(UART5,s4);  
  Delay_us(200);
 USART_Printf(UART5,s5);  
  Delay_us(200);
 USART_Printf(UART5,s6);  
  Delay_us(200);
实际上发送出去的是   s4s5s6s5s6s6...这是不是他从发送字符串的地址开始发送,直到遇到一个0x00,它才停止发送啊。。。>
回复

使用道具 举报

10

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2013-12-3
在线时间
83 小时
发表于 2014-9-27 21:39:49 | 显示全部楼层
回复【6楼】fly0000:
---------------------------------
学习了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-1 00:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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