C51关于判断串口接收数据的C程序,就判断输入是"az"还是"aa",麻烦帮我修改一下。最好有注释!

作者&投稿:历郝 (若有异议请与网页底部的电邮联系)
C51串口数据接收问题,急急急~

//******************************
//变量声明
//*****************************
unsigned char TimeCount; //用于计时,初始化为零
unsigned char Byte_Count; //用于记录当前帧接收到的字符数,
//初始化为零
bit MssgRdy; //一帧接收完毕标志位
unsigned char Buff[150]; //数据缓冲区

//--------------------------------------------------------------
void Initial_()
{
//此处就是写串口初始化
//以及定时器0、 1的初始化
//还有相关变量的初始化
}

//串口中断server
void Get_Message() interrupt 4 using 2
{
if(RI==1)
{
RI=0;
TimeCount=0; //计数值回零
Byte_Count=Byte_Count+1;
Buff[Byte_Count]=SBUF;
}
}



void Timer0Server() interrupt 1 using 3
{
TH0=0X4C;
TL0=0X00; //定时50Ms
TimeCount=TimeCount+1;
if(TimeCount==10) //说明一帧已经结束
{
//TimeCount=0; //本来想在此处将TimeCount回零,但是如此
//一来可能会导致一个命令帧多次处理的情况
Byte_Count=0;
MssgRdy=1;
}else if(TimeCount>=250)
{
TimeCount=250; //限幅
}
}


// 大概就是这样子了,在主程序里面就是查看MssgRdy标志位判断帧是否接收
//完毕,若接收完毕就解析、处理帧。
// 另外,我不知道你的命令帧是否有特定的帧结构,上面的程序判断一帧完
//毕的条件是空闲时间超过了500ms,如果有特定的帧结束符,那就可以省下
//Timer0这个资源了。
// 上面的程序我没有在编译器中编译过的,你自己在Keil上排错吧,见笑了

for(i=0;i<4;i++)
{
temp=SBUF;
table[i]=temp;
if (i>=4) i=0;
}
你这里写的是连续给4个数组内容复制相同的数据。
当应该不影响那个判断问题
判断问题可能是波特率问题(也就接收过来的数据是错误的)

#include <reg51.h> // 接收 试试
sbit led1=P3^2; // 接收 az , P.2 输出低电平, P3.3 输出高电平。
sbit led2=P3^3; // 接收 aa , P.2 输出高电平, P3.3 输出低电平。
bit t,s;
void main (void)
{
SCON = 0x50; // REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; // 定时器工作方式2
PCON|= 0x80; // 数据位8、停止位1。效验位无 (12M)
TH1 = 0xFD; // TH1 = 0xFD; 波特率 9600
TL1 = 0xFD;
TR1 = 1;
ES = 1; // 开串口中断
EA = 1; // 开总中断
s=1;
while(1)
{
}
}
void chuankou(void) interrupt 4
{
if(RI==1)
{
RI = 0;
TI = 0;
if(t==1)
{
if(SBUF=='z') {led1=0;led2=1; }
if(SBUF=='a') {led1=1;led2=0; }
s=1; t=0;
}
if(SBUF=='a' && s==1) { t=1;s=0;}
}
}

你这个程序不好用吗?需要怎么修改?


求一个基于51单片机的C语言程序,要求从串口接收一组数据,然后将其通过...
{ Init_Com();\/\/串口初始化 \/\/ P1=0xf0;while(1){ if ( RI ) \/\/扫描判断是否接收到数据,{ dat = SBUF;\/\/接收数据SBUF赋与dat RI=0; \/\/RI清零。SBUF = dat;\/\/在原样把数据发送回去 } LED(); \/\/显示接收到的数据 } } ...

一道51单片机的C语言程序,关于串口通讯的,很简单...
uchar code table[]="I receive,thanks"; \/\/定义一个字符串数组 void init(){ } \/\/设置工作方式,这个懂。void main(){ init(); \/\/系统初始化,你懂的 while(1) \/\/主循环部分,一直运行 { if(flag==1) \/\/等待flag标志位置位,当接收到数据的时候在串口接收中断中置位 {...

51单片机一直显示真在检查单片机,是程序问题吗?不是的话是什么问题,型...
检查:1.单片机最小系统供电是否正常。2.检查晶振连接是否正常,可以用万用表测量、正常情况下其他引脚都是高电平而晶振引脚约为1\/2Vcc。3.检查串口连接线缆是否正常,RXD、TXD是否错接,USB转串口下载线要求交叉连接。4.spi下载软件中选择使用外部晶振,核实串口号是否匹配。5.最小系统断电状态点击下载...

51单片机串口连接到电脑上计算机无法显示com端口如何解决(51单片机接收...
1. 51单片机接收不到串口数据 灯亮,证明你的线可以供电, usb有四根线。 usb转串口线不能保证不坏, 驱动不知道能不能再win8用, 目前两种可能,驱动问题,还有就是线坏了。没有了 2. 串口检测不到51单片机 电脑板载的串口不用装驱动,打开设备管理器看看里面有没有串口,有的话看看串口号是...

请问51单片机如何解决多字节串口接收问题
串口的收发可以用查询和中断两个办法来实现。1、查询方法更适合于半双工机制,编写的思路简单,程序结构简单,在全双工通信中易出问题。2、中断方法则更高效。你的程序把两种方法混搭使用,容易出错。以你的程序为例,一旦收到首个23H字符,就停止在中断服务中for循环里面等待5个剩余字符。假设传感器只发...

两个51单片机单片机串口通信,为什么“程序通过检测P0口数据判断设备状态...
兄弟,这个问题得结合实际电路来说,这里肯定P0口接有某一设备的控制线,当输入为 0xab这个值也就是设备发送这个值时表示忙,这是单片机和设备之间的协议决定的。

用51单片机通过串口接受一个数据,我目标是用一个if语句来比较和判别这...
include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit LED0=P1^0;\/\/ sbit LED1=P1^1;\/\/sbit LED2=P1^2;sbit LED3=P1^3;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}\/\/串口初始化void Uart_init(void){ TMOD = 0x20...

51单片机与PC机之间的硬件如何串口连接
单片机通过TXD和RXD两条线 连接MAX232芯片后,转换电平,连接PC串口,一般是2、3脚,5脚是地线。一共三根线。单片机的TXD接电脑的RXD,单片机的RXD接电脑的TXD。地线接地线。VB中要用MSCOMM控件,设置相同的波特率,起始、结束位、校验位,数据位等。VB的MSCOMM控件设置好端口号,然后PORTOPEN= true 就...

51单片机串口查询发送,中断接收同时有问题吗
没有问题。根据查询相关公开信息显示:51单片机串口通信是全双工的,发送和接受可以同时进行。不可以同时进行的是半双工。全双工方式分别由两根不同的传输线传送数据时,通信双方都能在同一时刻进行发送和接收操作,通信系统的每一端都设置了发送器和接收器,因此,能控制数据同时在发送和接受两个方向上传送...

怎样通过串口实现51和ZigBee模块的数据通信
1。规定通讯规则,比如“A”代表读温度,“B”代表读压力,这个由收发双方约定 2。设置51串口,举例说——假定用6MHz晶振,用1200波特率,设置参数为:MOV SCON,#50H ;8位+无校验+允许串口接收 MOV TMOD,#21H ;设T1为两个8位寄存器 MOV TH1,#0F3H MOV TL1,#0F3H ;设...

治多县15885243454: 串口接收数据C语言如何判是\r 或\n
哀梅肝欣: 串口接收是一个字节一个字节接收的. 将接收的字节存入缓存中,然后判断存入的数据是否是\r\n就可以了 char recbuf[256] //接收缓存 int recvcount = 0; //接收计数 if (recdata != '\n') { recbuf[recvcount++] = recdata; //如果数据不为'\n'则存入缓存 ...

治多县15885243454: 如何用c语言编程实现c51单片机中从串口接收一个字符串? -
哀梅肝欣: 可以的,定义一个缓冲区(数组)接收,到时单片机把字符串顺序处理一下就行了,一般/n来代表字符串的结束标志.

治多县15885243454: 如何用c语言编程实现c51单片机中从串口接收一个字符串?
哀梅肝欣: 如果用中断方式接收的话,只能接收单个字符.而如果用查询方式的话,接收字符串占用的时间真太长了,整个CPU将陷入一个长期无法工作的状态,按照波特率为19200来算,接收一个字符的时间是573微秒,十个字符的话就是5.73毫秒了,系统无法正常工作.建议用中断接收单个字符.

治多县15885243454: 求单片机C程序,实现功能:串口调试软件发送一个字符,接收区显示该字符 -
哀梅肝欣: 试试下面的行不行,希望能帮到你,你用的是51单片机吧?void init() //串口初始化 { TMOD=0x20;//设置定时器1为工作方式2,8位自己重装用于产生波特率 TH1=0xfd; //波特率9600 TL1=0xfd; TR1=1; //起动时器1 REN=1; //允许串口接收 ...

治多县15885243454: 51单片机串口接收数据如何判断成功
哀梅肝欣: RI=0;a=SBUF;//这里电脑发送的数据单片机始终接收不到if(1==(a=SBUF))d=1;elsed=0;

治多县15885243454: 51单片机串口接收单字符后如何进行判断 -
哀梅肝欣: 如果在串口助手上发送字符数据 那么在单片机上接收的就可以用该字符对应的十六进制码进行判断 比如你的数据 0,以字符形式发送0,换成十六进制就是 30 单片机用0x表示十六进制数据,所以就是 0x30 判断语句如下 if ( c==0x30 ) { LED = ~LED; } 具体的字符与十六进制码对换,可以参考下表

治多县15885243454: 51单片机串口发送数据后怎么判断对方是否接收到数据,我在对面设置了接收数据后会原样发送回来, -
哀梅肝欣: 如果没有对方回送数据,是无法判断的.找你所说,可以用如下程序验证. #include<reg51.h> sbit led=P1^0; unsigned char dat; void delay(int a) { unsigned char i; while(a--)for(i=0;i<120;i++); } void uart() interrupt 4 { if(RI) { RI=0; if(SBUF==dat)led=...

治多县15885243454: 51单片机如何对接收的字符串进行判断? -
哀梅肝欣: 对从s开始直到下一个s(如果有的话,没有则设置命令超时)为止的字符串求CRC,然后switch case 一直都是这么做,串口中断只管接收,不必分析数据格式,如果串格式定长,那更好办了...

治多县15885243454: c51,程序 单片机从串口接收字符串,放到一个数组里面,然后跟另一个 -
哀梅肝欣: #include#include unsigned char a[16],b[16]="0123456789ABCDEF",i,pr; void ser_isr(void) interrupt 3 { if(RI==1) { RI=0; a[pr]=SBUF; pr++; pr&=0x0f; } } main() { TI=1; EA=1; pr=0; while(1){ for(i=0;iif(a[i]!=b[i])break; printf("A=B\n"); } } }

治多县15885243454: 最简单的单片机串口接收c语言程序 -
哀梅肝欣: #include<stc12c5a60s2.h> /***************************************************** 函数功能:接收一个字节数据 ***************************************************/ unsigned char Receive(void) {unsigned char dat;while(RI==0) //只要接收中断标志位RI没有被...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网