专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
关于单片机串口通信发送字符串问题
2019-07-15 20:12
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
5600
17
1620
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include"delay.h"
#include<stdio.h>
/*------------------------------------------------
硬件端口定义
------------------------------------------------*/
unsigned char rev[12];
unsigned char ser_rev;
unsigned char count=0;
bit flag;
/*------------------------------------------------
函数声明
------------------------------------------------*/
void SendStr(unsigned char *s);
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
TMOD |= 0x20; // TMOD:
ti
mer 1, mode 2, 8-bit 重装
TH1 = 0xfd; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TL1=0xfd;
TR1 = 1; // TR1: timer 1 打开
REN=1;
SM0=0;
SM1=1;
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
InitUART();
while (1)
{
if(flag==1)
{
ES=0;
SendStr(rev);
flag=0;
ES=1;
}
}
}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
/*------------------------------------------------
发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!=' ')// 表示字符串结束标志,通过检测是否字符串末尾
{
SendByte(*s);
s++;
}
}
void ser() interrupt 4
{
if(RI)
{
RI=0;
if(count<=11)
{
ser_rev=SBUF;
rev[count]=ser_rev;
count++;
}
else
{
count=0;
flag=1;
}
}
}
复制代码
本人新手菜鸟用串口助手调试,我发送123456789106,接收到1234567891066或者是2123456789100,数据不仅多了一位还不一致,不知道是什么原因,还望大神门帮忙看看
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
17条回答
zy2014
2019-07-17 16:23
//123456789ab# 第一次输出可能有问题,之后就是正常的 123456789ab
//123456789a# 输出应该没有问题
#include<reg52.h>
#include<stdio.h>
/*------------------------------------------------
硬件端口定义
------------------------------------------------*/
unsigned char rev[12];
unsigned char ser_rev;
unsigned char count=0;
bit flag;
/*------------------------------------------------
函数声明
------------------------------------------------*/
void SendStr(unsigned char *s);
/*
void InitArray()
{
unsigned char len;
for(len=0;len<12;len++)
{
rev[len]=' ';
delay1ms();
}
}
*/
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xfd; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TL1=0xfd;
TR1 = 1; // TR1: timer 1 打开
REN=1;
SM0=0;
SM1=1;
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
InitUART();
while (1)
{
if(flag==1)
{
ES=0;
SendStr(rev);
flag=0;
ES=1;
}
}
}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
/*------------------------------------------------
发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!=' ')// 表示字符串结束标志,通过检测是否字符串末尾
{
SendByte(*s);
s++;
}
}
void ser() interrupt 4
{
if(RI)
{
RI=0;
if(count<11)
{
count++;
ser_rev=SBUF;
rev[count-1]=ser_rev;
if(ser_rev=='#')
{
rev[count-1]=' ';
count=0;
flag=1;
}
}
else
{
count=0;
flag=1;
}
}
}
复制代码
改动过中断函数,输入的字符串以#结尾,别的实在改不动了。
加载中...
查看其它17个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
- //123456789ab# 第一次输出可能有问题,之后就是正常的 123456789ab
- //123456789a# 输出应该没有问题
- #include<reg52.h>
- #include<stdio.h>
- /*------------------------------------------------
- 硬件端口定义
- ------------------------------------------------*/
- unsigned char rev[12];
- unsigned char ser_rev;
- unsigned char count=0;
- bit flag;
- /*------------------------------------------------
- 函数声明
- ------------------------------------------------*/
- void SendStr(unsigned char *s);
- /*
- void InitArray()
- {
- unsigned char len;
- for(len=0;len<12;len++)
- {
- rev[len]=' ';
- delay1ms();
- }
- }
- */
- /*------------------------------------------------
- 串口初始化
- ------------------------------------------------*/
- void InitUART (void)
- {
- TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
- TH1 = 0xfd; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
- TL1=0xfd;
- TR1 = 1; // TR1: timer 1 打开
- REN=1;
- SM0=0;
- SM1=1;
- EA = 1; //打开总中断
- ES = 1; //打开串口中断
- }
- /*------------------------------------------------
- 主函数
- ------------------------------------------------*/
- void main (void)
- {
- InitUART();
- while (1)
- {
- if(flag==1)
- {
- ES=0;
- SendStr(rev);
- flag=0;
- ES=1;
- }
- }
- }
- /*------------------------------------------------
- 发送一个字节
- ------------------------------------------------*/
- void SendByte(unsigned char dat)
- {
- SBUF = dat;
- while(!TI);
- TI = 0;
- }
- /*------------------------------------------------
- 发送一个字符串
- ------------------------------------------------*/
- void SendStr(unsigned char *s)
- {
- while(*s!=' ')// 表示字符串结束标志,通过检测是否字符串末尾
- {
- SendByte(*s);
- s++;
- }
- }
- void ser() interrupt 4
- {
- if(RI)
- {
- RI=0;
- if(count<11)
- {
- count++;
- ser_rev=SBUF;
- rev[count-1]=ser_rev;
- if(ser_rev=='#')
- {
- rev[count-1]=' ';
- count=0;
- flag=1;
- }
- }
- else
- {
- count=0;
- flag=1;
- }
- }
- }
复制代码改动过中断函数,输入的字符串以#结尾,别的实在改不动了。一周热门 更多>