51单片机串口接收数据包的数据怎么转成10进制?

查看: 8257|回复: 6
(求助)51单片机串口接收字符串的问题
当通过串口向单片机发送不确定长度的字符串时,如何校验开始位和结束位,并且最终判断所接收到的字符串的长度?
比如: 开始位用2位”AE“来表示,结束位用2位”BF“来表示, 当向单片机发送如”AE...BF&类型的字符串时, 单片机如何将这一字符串保存到一个预设的数组中,并且正确判断这个字符串的长度?
哪位大虾能否帮忙贴段代码以参考?谢谢先
开始位何结束位这些都是由芯片的自动完成校验的,
/***************串口中断程序***************/& & & &
void&&com()&&interrupt 4& & using 2
& & & & & & & &&&uchar a=0,c=0;
& & & & & & & &&&uint&&b=65535;
& & & & & & & &&&ES=0;
& & & & & & & &&&while(b--)
& & & & & & & && &while(!RI);
& & & & & & & && &RI=0;
& & & & & & & && &c=SBUF;
& & & & & & & && &if(c==0x10||c==0x02||c==0x03)
& & & & & & & && &{
& & & & & & & & & & & && & & & & & if(a!=0)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & && &if(com_bus[a-1]==0x10) {com_bus[a-1]=c;}& & & && && && && & //若接收到的数据前面接收到了0X10 则过滤掉
& & & & & & & & & & & & & & & && &else{com_bus[a]=c; a++; if(c==0x03){bz=1;}}& & & & & & & & & & & & //若接收的数据前面没有0x10则送入缓冲区 若接收到0x03 则置接收完成标志
& & & & & & & & & & & & & & & && &&&
& & & & & & & & & & & & & & & && &}
& & & & & & & & & & & & & & & &&&else& &{com_bus[a]=c; a++; if(c!=0x02) {b=0;} }& & & && &&&//若接收数据帧头不对,则跳出接收& & & & & & & & & & & & & & & && &&&
& & & & & & & && &&&}
& & & & & & & && & else
& & & & & & & && &&&{
& & & & & & & & & & & && &com_bus[a]=c;& & & &&&a++;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //若接收数据帧头不对,则跳出接收
& & & & & & & & & & & && &if(com_bus[0]!=0x02)& & & &&&{b=0;}
& & & & & & & & & & & && &}
& & & & & & & && & if(com_bus[0]==0x02&&c==0x03&&bz==1)& & & & & & & &&&
& & & & & & & && &&&{
& & & & & & & & & & & && & b=0;
& & & & & & & & & & & && & bz=0;
& & & & & & & & & & & &&&}
& & & & & & & && &
& & & && && &}
& &&&& & & && &ES=1;& &
& & & && &}& && & & &
这个是我原来琢磨的,当时跟你的想法一样。这个接收长度可以不确定 ,接收帧头判断不对则退出,收到结尾也退出,数据送到缓冲区,希望对你有帮助
可是会出现数据的传送缺失的情况怎么弄呀比如123456可能变为12356少一些数据呀,这个怎么办呀
数据帧头--数据长度--数据区--数据和
有种方法! 首先发个校验,在发个字符长度,
然后 接受端就 循环取那个长度的个数!至于后面的问题可以 返回去学学 C语言的一些基础!
Powered by字符和数据之间的转换
查看: 2640|
摘要:   我们学串口通信的应用主要是实现单片机和电脑之间的信息互发,可以用电脑控制单片机的一些信息,可以把单片机的一些信息状况发给电脑上的软件。下面我们就做一个简单的例程,实现单片机串口调试助手发送的数据, ...
  我们学串口通信的应用主要是实现和之间的信息互发,可以用电脑控制单片机的一些信息,可以把单片机的一些信息状况发给电脑上的软件。下面我们就做一个简单的例程,实现单片机串口调试助手发送的数据,在我们开发板上的数码管上显示出来。
#include&&reg52.h&
sbit&ADDR3&=&P1^3;&&&&&&//LED选择地址线3
sbit&ENLED&=&P1^4;&&&&&&//LED总使能引脚
unsigned&char&code&LedChar[]&=&{&&//数码管显示字符转换表
&&&&0xC0,&0xF9,&0xA4,&0xB0,&0x99,&0x92,&0x82,&0xF8,
&&&&0x80,&0x90,&0x88,&0x83,&0xC6,&0xA1,&0x86,&0x8E
unsigned&char&LedBuff[6]&=&{&&//数码管
&&&&0xFF,&0xFF,&0xFF,&0xFF,&0xFF,&0xFF
unsigned&char&T0RH&=&0;&&//T0重载值的高字节
unsigned&char&T0RL&=&0;&&//T0重载值的低字节
unsigned&char&RxdByte&=&0;&&//串口接收到的字节
void&ConfigTimer0(unsigned&int&ms);
void&ConfigUART(unsigned&int&baud);
void&main&()
&&&&P0&=&0xFF;&&//P0口初始化
&&&&ADDR3&=&1;&&//选择数码管
&&&&ENLED&=&0;&&//LED总使能
&&&&EA&=&1;&&&&&//开总中断
&&&&ConfigTimer0(1);&&&//配置T0定时1ms
&&&&ConfigUART(9600);&&//配置波特率为9600
&&&&while(1)
&&&&{&&&//将接收字节在数码管上以十六进制形式显示出来
&&&&&&&&LedBuff[0]&=&LedChar[RxdByte&&&0x0F];
&&&&&&&&LedBuff[1]&=&LedChar[RxdByte&&&&4];
void&ConfigTimer0(unsigned&int&ms)&&//T0配置函数
&&&&unsigned&long&
&&&&tmp&=&&/&12;&&&&&&//定时器计数频率
&&&&tmp&=&(tmp&*&ms)&/&1000;&&//计算所需的计数值
&&&&tmp&=&65536&-&&&&&&&&&//计算定时器重载值
&&&&tmp&=&tmp&+&31;&&&&&&&&&&&//修正中断响应延时造成的误差
&&&&T0RH&=&(unsigned&char)(tmp&&&&8);&&//定时器重载值拆分为高低字节
&&&&T0RL&=&(unsigned&char)
&&&&TMOD&&=&0xF0;&&&//清零T0的控制位
&&&&TMOD&|=&0x01;&&&//配置T0为模式1
&&&&TH0&=&T0RH;&&&&&//加载T0重载值
&&&&TL0&=&T0RL;
&&&&ET0&=&1;&&&&&&&&//使能T0中断
&&&&TR0&=&1;&&&&&&&&//启动T0
void&ConfigUART(unsigned&int&baud)&&//串口配置函数,baud为波特率
&&&&SCON&=&0x50;&&&//配置串口为模式1
&&&&TMOD&&=&0x0F;&&//清零T1的控制位
&&&&TMOD&|=&0x20;&&//配置T1为模式2
&&&&TH1&=&256&-&(/32)&/&&&//计算T1重载值
&&&&TL1&=&TH1;&&&&&//初值等于重载值
&&&&ET1&=&0;&&&&&&&//禁止T1中断
&&&&ES&&=&1;&&&&&&&//使能串口中断
&&&&TR1&=&1;&&&&&&&//启动T1
void&LedScan()&&//LED显示扫描函数
&&&&static&unsigned&char&index&=&0;
&&&&P0&=&0xFF;&&&&&&&&&&&&&&&&&//关闭所有段选位,显示消隐
&&&&P1&=&(P1&&&0xF8)&|&&&//位选索引值赋值到P1口低3位
&&&&P0&=&LedBuff[index];&&&&&&&//相应显示缓冲区的值赋值到P0口
&&&&if&(index&&&5)&&&&&&&&&&&&&//位选索引0-5循环,因有6个数码管
&&&&&&&&index++;
&&&&&&&&index&=&0;
void&InterruptTimer0()&interrupt&1&&//T0中断服务函数
&&&&TH0&=&T0RH;&&//定时器重新加载重载值
&&&&TL0&=&T0RL;
&&&&LedScan();&&&//LED扫描显示
void&InterruptUART()&interrupt&4
&&&&if&(RI)&&//接收到字节
&&&&&&&&RI&=&0;&&//手动清零接收中断标志位
&&&&&&&&RxdByte&=&SBUF;&&//接收到的数据保存到接收字节变量中
&&&&&&&&SBUF&=&RxdB&&//接收到的数据又直接发回,这叫回显-"echo",以提示用户输入的信息是否已正确接收
&&&&if&(TI)&&//字节发送完毕
&&&&&&&&TI&=&0;&&//手动清零发送中断标志位
  大家在做这个实验的时候,有个小问题要注意一下。因为我们STC89C52RC下载程序是使用了UART串口下载,下载完程序后,程序运行起来了,可是下载软件最后还会通过串口发送一些额外的数据,所以程序刚下载进去不是显示00,而可能是其他数据。大家只要把开关关闭,重新打开一次就好了。
  细心的同学可能会发现,在串口调试助手发送选项和接收选项处,还有个“字符格式发送”和“字符格式显示”,这是什么意思呢?
  先抛开我们使用的汉字不谈,那么我们常用的字符就包含了0~9的数字、A~Z/a~z的字母、还有各种标点符号等。那么在单片机系统里面我们怎么来表示它们呢?ASCII码(American&Standard&Code&for&Information&Interchange,即美国信息互换标准代码)可以完成这个使命:我们知道,在单片机中一个字节的数据可以有0~255共256个值,我们取其中的0~127共128个值赋予了它另外一层涵义,即让它们分别来代表一个常用字符,其具体的对应关系如下表。
  表1&ASCII表
  这样我们就在常用字符和字节数据之间建立了一一对应的关系,那么现在一个字节就既可以代表一个整数又可以代表一个字符了,但它本质上只是一个字节的数据,而我们赋予了它不同的涵义,什么时候赋予它那种涵义就看编程者的意图了。ASCII码在单片机系统中应用非常广泛,我们后续的课程也会经常使用到它,下面我们来对它做一个直观的认识,同学们一定要深刻理解其本质。
  对照上述表格,我们就可以实现字符和数字之间的转换了,比如还是这个程序,我们发送的时候改成字符格式发送,接收还是用十六进制接收,这样接收和数码管好做一下对比。
  我们用字符格式发送一个小写的a,返回一个十六进制的0x61,数码管上显示的也是61,ASCII码表里字符a对应十进制是97,等于十六进制的0x61;我们再用字符格式发送一个数字1,返回一个十六进制的0x31,数码管上显示的也是31,ASCII表里字符1对应的十进制是49,等于十六进制的0x31。这下大家就该清楚了:所谓的十六进制发送和十六进制接收,都是按字节数据的真实值进行的;而字符格式发送和字符格式接收,是按ASCII码表中字符形式进行的,但它实际上最终传输的还是一个字节数据。这个表格,当然不需要大家去记住,理解它,用的时候过来查就行了。
  通信的学习,不像前边控制部分那么直观了,通信部分我们的程序只能获得一个结果,而其过程我们却无法直接看到,所以慢慢的可能大家就会知道有和逻辑分析仪这类测量仪器。如果学校实验室或者公司里有示波器或者逻辑分析仪这类仪器,可以拿过来抓一下串口波形,直观的了解一下。如果暂时还没有这些仪器,先知道这么回事,有条件再说。因为工具类的东西有的比较昂贵,有条件可以尽量使用学校或者公司的。在这里我用一款简易的逻辑分析仪把串口通信的波形抓出来给大家看一下,大家了解一下即可,如图1所示。
图1&逻辑分析仪串口数据示意图
  分析仪和示波器的作用,就是把通信过程的波形抓出来进行分析。先大概说一下波形的意思。波形左边是低位,右边是高位,上边这个波形是电脑发送给单片机的,下边这个波形是单片机回发给电脑的。以上边的波形为例,左边第一位是起始位0,从低位到高位依次是,顺序倒一下,就是数据0x31,也就是ASCII码表里的‘1’。大家可以注意到分析仪在每个数据位都给标了一个白色的点,表示是数据,起始位和无数据的时候都没有这个白点。时间标T1和T2的差值在右边显示出来是0.102ms,大概是9600分之一,稍微有点偏差,在容许范围内即可。通过图11-7,我们可以清晰的了解了串口通信的收发的详细过程。
  那我们这里再来了解一下,如果我们使用串口调试助手,用字符格式直接发送一个“12”,我们在我们的数码管上应该显示什么呢?串口调试助手应该返回什么呢?经过试验发现,我们数码管显示的是32,而串口调试助手返回十六进制显示的是31、32两个数据,如图2所示。
图2&串口调试助手数据显示
  我们用逻辑分析仪把这个数据抓出来看一下,如图3所示。
图3&逻辑分析仪抓取数据
  对于ASCII码表来说,数字本身是字符而非数据,所以如果发送“12”的话,实际上是是分别发送了“1”和“2”两个字符,单片机呢,先收到第一个字符“1”,在数码管上会显示出31这个对应数字,但是瞬间马上就又收到了“2”这个字符,数码管瞬间从31变成了32,而我们视觉上呢,根本是没有办法发现这种快速变化的,所以我们感觉数码管直接显示的是32。
上一篇:下一篇:
Powered by &
这里是—这里可以学习 —这里是。
栏目导航:&>&51单片机串口通信并用数码管显示接收数据
51单片机串口通信并用数码管显示接收数据
上传大小:2KB
通过数码管将51单片机从电脑上接收来的数据进行转换并显示出来!
综合评分:4.3(36位用户评分)
所需积分/C币:
下载个数:166
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var q = $("#form1").serializeArray();
console.log(q);
var res_area_r = $.trim($(".res_area_r").val());
if (res_area_r == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
var mess = $(".res_area_r").val();
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, _username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click",'.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
$(".res_area_r").val($.trim($(".res_area").val()));
评论共有20条
正在学习中,借鉴参考,谢谢。
还行,可以参考参考
下载下来很有帮助
还是不错的,谢谢
程序非常好 很有帮助。
很好,很不错
还不错,但在实验板上运行还要调整一些参数
资源还不错,就是使用时要改改程序的一些参数,谢谢分享
有一定参考价值
行哦,基本没问题的,
审核通过送C币
c自学入门到进阶
创建者:weixin_
Setup Factory合集(6.0~9.5)
创建者:caozhy
上传者其他资源上传者专辑
矩阵键盘的检测并用数码管显示
数字温度计通过18b20并用1602液晶显示
自己制作小冰箱(测速,控速)
开发技术热门标签
VIP会员动态
下载频道积分规则调整V1710.18
CSDN下载频道积分调整公告V1710.17
开通VIP,海量IT资源任性下载
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
CSDN&VIP年卡&4000万程序员的必选
为了良好体验,不建议使用迅雷下载
51单片机串口通信并用数码管显示接收数据
会员到期时间:
剩余下载个数:
剩余C币:593
剩余积分:786
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
(仅够下载10个资源)
全站1200个资源免积分下载
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
全站1200个资源免积分下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
全站1200个资源免积分下载
为了良好体验,不建议使用迅雷下载
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
warrior__zhang
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
51单片机串口通信并用数码管显示接收数据// 相关信息串行口发送/接收程序,每接收到字节即发送出去// 和微机相接后键入的字符回显示在屏幕上// 可用此程序测试//#include &reg51.h&#define XTAL
// CUP 晶振频率#define baudrate 9600
// 通信波特率void main(void){ TMOD = 0x20;
// 定时器1工作于8位自动重载模式, 用于产生波特率 TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
// 定时器0赋初值 SCON = 0x50; PCON = 0x00;
TR1 = 1; IE = 0......
// 相关信息串行口发送/接收程序,每接收到字节即发送出去// 和微机相接后键入的字符回显示在屏幕上// 可用此程序测试//#include &reg51.h&#define XTAL
// CUP 晶振频率#define baudrate 9600
// 通信波特率void main(void){ TMOD = 0x20;
// 定时器1工作于8位自动重载模式, 用于产生波特率 TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
// 定时器0赋初值 SCON = 0x50; PCON = 0x00;
TR1 = 1; IE = 0x00;
// 禁止任何中断 while(1) {
while(RI == 0);
// 从缓冲区中把接收的字符放入c中
// 要发送的字符放入缓冲区
while(TI == 0);
TI = 0; }}
其他答案(共3个回答)
一般单片机与计算机通信设置为9600比较常用,当然也可以4800或者19200等
串口通信的基本概念
1,什么是串口?
2,什么是RS-232?
3,什么是RS-422?
4,什么是RS-485?
5,什么是握手?
1,什么是串口?
串口是计...
你可以到google上面搜索一下,有作者的网址可以看到,上面有具体的讲解.
讲的特别详细.应该有用吧!
换机子试试啊
答: 孕十周突然不吐了是正常的吗?前几天特别的痛苦呀,不会是有什么问题吧。
答: 慢慢弄。
我最开始只会装游戏;
后来中国有了网络慢慢跟朋友上聊天室聊天;
后来出了OICQ(现在叫QQ),又用那东西聊;
然后上联众玩在线游戏(棋牌类);
答: 七十年代的计算机网络
X.25 分组交换网:各国的电信部门建设运行
各种专用的网络体系结构:SNA,DNA
Internet 的前身ARPANET进行实验运行
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区}

我要回帖

更多关于 单片机串口接收程序 的文章

更多推荐

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

点击添加站长微信