单片机发送字符串 数字转字符串

单片机通信十六进制字符串转化为字符数组的程序以及对程序的解释
单片机通信之求十六进制字符串转化为字符数组的程序以及你们对程序的解释http:www.outhead--1.htmlvoidHex2Byte(ucha*st,ucha*yte){uchawhile(*st!=0){tmp=((*st)4)&0xf0;st++;if(*st==0){*yte=(tmp4)&0x0f;etun;}tmp+=(*st)&0x0f;*yte=yte++;}}这个破程序就是流行很多书籍的一个关于十六进制字符串转换成字符数组的一个小程序,但是我怎么也看不懂,我自我反思是因为,我对单片机存储字母的方式不甚了解。如果哪位大侠对这个比较了解,可以结合这个程序给我上一课,好吗?我懂了,比如主机要发十进制数字35.首先主机把它变成十六进制数字:0x23;即二进制数字:;好,针对二进制的数字高四位:0010,它的十六进制数字是“2”此时我查表得“2”的ASII码是:,(当然单片机是用自己的程序算出ASII码值)即(0x32)将它赋值给SBUF,发出去然后,针对二进制的数字低四位:0011,它的十六进制数字是“3”此时查表得“3”的ASII码是:,即(0x33),然后将将它赋值给SBUF,发出去上面这个过程就是把字符数组转换为十六进制字符串的基本过程,当然发完所有的东西以后尾部还要发一个"\0"表示字符串结尾,上面的问题就是在这个背景下提出的现在进入正题:比如说,从机接受上面的数据。首先接收到的是,然后接收到的是:上面的程序就是把接收这两个字节的数据,然后拼成一个字节的数据,而且这个数据就是十进制的35我现在把程序处理数据的步骤系统说一遍首先接收到的是,这个数字算术左移四位是:,然后与0xf0相与,其实还是:其次接收到的是,这个数字与0x0f相与,变成:然后:11,正好是我们要发送的数字:十进制数字35从这个算法中我们总结一下就是:主机会把四个it,变成一个Byte,发出去然后从机会把接收到的这个Byte,通过一些计算,还原成最初的那四个it
& 果果文库所有资源均来源于互联网,仅供网友学习交流,若侵犯了您的权益,请联系我们予以删除。
7407&&人浏览
1711&&人浏览
8547&&人浏览
3572&&人浏览
15657&&人浏览
1189&&人浏览
13658&&人浏览
17678&&人浏览
8401&&人浏览
1122&&人浏览
15075&&人浏览
18797&&人浏览
2659&&人浏览
5728&&人浏览
12128&&人浏览
本文标题:单片机通信十六进制字符串转化为字符数组的程序以及对程序的解释 链接地址:
copyright@ 2013- Inc. All Rights Reserved 果果文库 版权所有 联系站长: ; 经营许可证编号:浙ICP备号我想问问怎么把单片机串口接收到的字符转化为int型赋给程序里面的int型变量 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
我想问问怎么把单片机串口接收到的字符转化为int型赋给程序里面的int型变量
12:38:46  
我的单片机的串口接收到的是字符,例如31、1f、fb等等字符,因为信号在传输过程中是以ASCII码传送的,所以我接收到的也是ADCII码,我想转化为int型,然后赋值给我单片机程序里面的int型的变量。我尝试过强制转换,例如:(int)35,前面这种转换直接就得到了5。而我不想要得到这种结果,我想把“35”按照十六进制转换为int型的3*16+5=53.
&&还想问问有没有人用串口做过通信之类的项目,还有几个问题需要交流。
&&谢谢了!!!!
14:41:34  
你的意思是把16进制转换成十进制是吗?而不是int,int是整型的意思,十六进制也是整型。
助理工程师
17:58:35  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
可不可以这样理解,例如你要接收或发送0x31这个数字,实际使用ASCII码,就是0x33,0x31两个字节
现在收到0x33和0x31之后,你想把它变成31赋值给你的变量
或者你想把0x31发送出去,转换成0x33,0x31
如果是这样,还算简单:
发送可以这样写
&&char data = 0x31;
&&char send_ch[2] = {0} ;
&&unsigned char temp = 0;
&&temp = data & 0x0f
&&if( temp &= 9 )&&//0~9的数字
& && &&&send_ch[0] = temp + 0x30;
&&else&&//a~f的数字转换为ASCII码的字母
& && && &send_ch[0] = temp + 0x51;
& &temp = (data && 4) & 0x0f
&&if( temp &= 9 )&&//0~9的数字
& && &&&send_ch[1] = temp + 0x30;&&//数字0的ASCII码值是0x30,相差0x30,1~9同理
&&else&&//a~f的数字转换为ASCII码的字母
& && && &send_ch[1] = temp + 0x51; //字母a的值是0x61,数字a与其相差0x51,b、c、d、e、f同理
& &SendData( send_ch);&&//发送出去
接收反过来操作就可以了,例如收到0x33,和0x31
unsigned char rx_data[2] = {0x33, 0x31};&&//接收过程我这里就用赋值替代
char data = 0;
if( ( rx_data[0] &= '0' ) && ( rx_data[0] &= '9' ) )&&//低位是数字
& &&&temp =&&rx_data[0] - 0x30;
else if( ( rx_data[0] &= 'a' ) && ( rx_data[0] &= 'f' )&&)&&//低位是字母转换到a~f
& &&&temp =&&rx_data[0] - 0x51;&&
if( ( rx_data[1] &= '0' ) && ( rx_data[1] &= '9' ) )&&//低位是数字
& &&&temp =&&rx_data[0] - 0x30;
else if( ( rx_data[1] &= 'a' ) && ( rx_data[1] &= 'f' )&&)
& &&&temp =&&rx_data[0] - 0x51;
data&&|= (temp && 4);
我写的大概意思,你可以把这些变成一个或两个函数,需要转换的时候调用就可以了
16:51:42  
你的意思是把16进制转换成十进制是吗?而不是int,int是整型的意思,十六进制也是整型。
对对是十进制,不好意思&&没说明白,我已经搞定了,我直接用强制转换就能得到十进制的数了,谢谢了
09:00:53  
对对是十进制,不好意思&&没说明白,我已经搞定了,我直接用强制转换就能得到十进制的数了,谢谢了
不客气& && && && && && && && && && &&&
14:21:59  
对对是十进制,不好意思&&没说明白,我已经搞定了,我直接用强制转换就能得到十进制的数了,谢谢了
怎么个强制转换法?
19:06:37  
怎么个强制转换法?
0x10 十六进制转换成十进制就是16
int temp = (int)0x10;//temp就等于16了。
就可以了。
18:03:32  
0x10 十六进制转换成十进制就是16
int temp = (int)0x10;//temp就等于16了。
好的&&谢谢了啊&&
Powered by
供应链服务
商务及广告合作
Jeffery Guo
关注我们的微信
供应链服务 PCB/IC/PCBA
下载发烧友APP
版权所有 (C) 深圳华强聚丰电子科技有限公司C语言中字符串和数字的相互转换实现代码 - 其他技术 - 电子工程世界网
C语言中字符串和数字的相互转换实现代码
14:54:25来源: eefocus
以下是对中和数字的相实现代码进行了分析介绍,需要的朋友可以参考下
1.数字转换为字符串
sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。
sprintf 是个变参函数,定义如下:
int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。
printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以&%&开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要 的字符串。
如把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
2.字符串转换为数字
函数名: atol
功 能: 把字符串转换成长整型数
用 法: long atol(const char *nptr);
&代码如下:
  #include
  int main(void)
  char *str = "";
  l = atol(str);
  printf("string = %s integer = %ld
", str, l);
  return(0);
关键字:&&&&
编辑:什么鱼 引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
微信扫一扫加关注 论坛活动 E手掌握
微信扫一扫加关注
芯片资讯 锐利解读
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。1 #include&reg52.h&
3 //------------------串口通信协议-----------------//
客户端数据包格式解释(长度恒为15):
例如:A01_fmq_01Off___#
A--------数据包的开始标记(可以为A到Z,意味着数据包可以有26种)
01-----设备代号
fmq_01Off___--------指令(长度恒为10),指令的前4个人字符是指令头部,指令的后6个字符是指令尾部
#---------数据包的结束标记
服务器端数据包格式解释(长度恒为15):
例如:A02_SenT010250#
A--------数据包的开始标记(可以为A到Z,意味着数据包可以有26种)
02-----设备代号
SenT010250--------指令(长度恒为10),指令的前4个人字符是指令头部,指令的后6个字符是指令尾部
#---------数据包的结束标记
19 char buf_string[16];
//定义数据包长度为15个字符
20 #define deviceID_1Bit '0'
//用于串口通信时,定义本地设备ID的第1位
21 #define deviceID_2Bit '2'
//用于串口通信时,定义本地设备ID的第2位
22 #define datapackage_headflag 'A'
//用于串口通信时,定义数据包头部的验证标记
24 char DataPackage_DS18B20[16]={datapackage_headflag,deviceID_1Bit,deviceID_2Bit,'_','S','e','n','T','X','X','X','X','X','X','#'};
25 char HeartBeat[16]={datapackage_headflag,deviceID_1Bit,deviceID_2Bit,'_','B','e','a','t','X','X','X','X','X','X','#'};
26 //----------------------------------------------//
27 /*******************************
MCU:89C52RC
11.0592MHz
31 //11.0592MHz 0xd0 1200bps
32 //12MHz 0xcc 1200bps
33 //11.0592MHz 0xfa 9600bps
34 //0xf4 11.0592MHz
0xf3 12MHz 4800bps
35 //均在SMOD=1的情况下(波特率倍增模式)
36 *******************************/
37 //串口发送函数
38 void PutString(unsigned char *TXStr)
while(*TXStr!=0)
while(TI==0);
50 //串口接收函数
51 bit ReceiveString()
char * RecStr=buf_
char num=0;
unsigned char count=0;
*RecStr=SBUF;
if(num&14)
//数据包长度为15个字符,尝试连续接收15个字符
while(!RI)
if(count&130)return 0;
//接收数据等待延迟,等待时间太久会导致CPU运算闲置,太短会出现"数据包被分割",默认count=130
73 //定时器1用作波特率发生器
74 void Init_USART()
SCON=0x50;
//串口方式1,使能接收
TMOD|=0x20;
//定时器1工作方式2(8位自动重装初值)
TMOD&=~0x10;
PCON|=0x80;
//提高串口中断优先级
//开启串口中断使能
88 //比较指令头部
89 bit CompareCMD_head(char CMD_head[])
unsigned char CharN
for(CharNum=0;CharNum&4;CharNum++)
//指令长度为10个字符
if(!(buf_string[CharNum+4]==CMD_head[CharNum]))
//指令头部匹配失败
//指令头部匹配成功
101 //比较指令尾部(start:从哪里开始比较,quality:比较多少个字符,CMD_tail[]:要比较的字符串)
102 bit CompareCMD_tail(unsigned char start,unsigned char quality,char CMD_tail[])
unsigned char CharN
for(CharNum=0;CharNum&CharNum++)
if(!(buf_string[start+CharNum]==CMD_tail[CharNum]))
114 bit Deal_UART_RecData()
//处理串口接收数据包函数(成功处理数据包则返回1,否则返回0)
//PutString(buf_string);
if(buf_string[0]==datapackage_headflag&&buf_string[14]=='#')
//进行数据包头尾标记验证
switch(buf_string[1])
//识别发送者设备ID的第1位数字
switch(buf_string[2])
//识别发送者设备ID的第2位数字
if(CompareCMD_head("Ligt"))
//判断指令头部是否为"Ligt"
//下面是指令尾部分析
switch(buf_string[8])
switch(buf_string[9])
if(CompareCMD_tail(10,3,"Off"))
//A03_Ligt01Off_#
//要执行的代码140
if(CompareCMD_tail(10,3,"On_"))
if(CompareCMD_head("SenT"))
if(CompareCMD_head("jdq_"))
if(CompareCMD_head("Try!"))
183 /************************
185 ************************/
186 //串口中断服务函数-----------
187 void USART() interrupt 4
//标志位TI和RI需要手动复位,TI和RI置位共用一个中断入口
if(ReceiveString())
//数据包长度正确则执行以下代码
Deal_UART_RecData();
//数据包长度错误则执行以下代码
//LED1=~LED1;
//接收并处理一次数据后把接收中断标志清除一下,拒绝响应在中断接收忙的时候发来的请求
201 /***************************
203 ***************************/
204 void main()
Init_USART();
//PutString(buf_string);//空格20H,回车0DH
这个模块代码用于快速实现可扩展的串口通信
尊重作者的劳动,转载请记得注明来源:/weifeng727/p/5617924.html
阅读(...) 评论()}

我要回帖

更多关于 单片机串口发送字符串 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信