A. 51单片机 串口通信 检查接收的字符串
首先SBUF只有8位 即一字节,而"adcd"有4字节+‘ ’个,你这把temp和“abcd”比较永远只能为假。所以LED1=!LED1;这条语句不能执行。正确的做法是建立一个变量,将SBUF接受到的字符存入变量,然后再比较
B. 51单片机C语言-串口输入字符串并响应
给你个思路吧,不带通讯协议,不带中断的,你自己往上填
#include "regx52.h"
#define 0x1 OPEN_LED
#define 0x2 CLOSE_LED
main()
{
TH1=0x;//设置波特率
//设置串口通讯方式,8位接收,1停止位
//启动T1
while(1)
{
if(RI)//如果接收到字符
{
switch(SBUF)
{
case OPEN_LED:P4_6=1;break;//如果接收到开灯命令,灯亮
case CLOSE+LED:P4_6=0;break;
default:;
}
RI=0;
}
}
}
C. 51单片机串口收发字符串求助
51单片机串口发字符串的方法有多种,比较容易理解的方法是:先定义一个要发送的字符串,就是一个字符串数组。
发送时,连续发送个数组。
接收字符串,也可以采用类似的方法,先声明一个字符串,接收时,每接收一个就存入这个串中,接收结束,查这个字符串就行了。
D. 51单片机串口接收字符串
51单片机串口接收字符串,接收的字符串长度不定,无结束符,要判断这个字符串结束,确实比较难。如果每个字符串还是连续发送,几乎是无法判断的。如果每个字符串之前有一定的空闲时间,可以根据最短的空闲时间来判断结束。即接收每一个字符都开始计时,接收下一个字符结束计时,如果计时的时间超过最短的空闲时间,则前一个字符为结束,且新字符串开始。并再重新计时。
E. 怎么用51单片机向串口调试助手发送字符串有程序解释更好啊,求解~
ASCII码在单片机中也是用16进制来表示的,只是解码后显示的是字符,你要是随便发一个字符,串口调试助手选择字符显示接收就可以显示一个字符出来(可能我们不认识这个字符)。发送一个字符串就是不停的发送直到发送完毕,51单片机有自己的串行发送端口P3.0和P3.1端口,但是它是一个字节一个字节发送的,发送完一个字节会产生一个中断(也可以用判断TI的方式判断是否发送完),中断响应后再次启动发送SBUF=0Xxx,就会自动连续的发送,再加上判断就可以控制发送的字节数。
串口初始化:
void uart_init()
{
TMOD=0x20;//定时器1,模式2
SCON=0x50;//串口通讯方式1
TH1=0xfd;//波特率9600
TL1=0xfd;
button=0;
delay(1);
TI=0;//发送中断标志位清零
RI=0;//接收中断标志位清零
TR1=1;//启动定时器1
EA=1; //使能全局中断
ES=1; //启动串口中断
}
}
void main()
{ P1=0xff;
uart_init() ;
while(1)
{
}
// 串行中断程序
void commIntProc() interrupt 4
{
if(TI)
{
TI = 0;
if(sendPosi < sendCount) //判断是否发送完成
{
sendPosi++; //发送一次计数器加一
SBUF = sendBuf[sendPosi];//启动发送
}
F. 51单片机,通过串口助手向单片机发送字符串,单片机将字符串逆序发送回计算机,用C语言编程
像这种发送字符串的,需要有一个字符串结束标志,不能用0作为字符串结束标志了!这里以回车作0xd为结束标志!
#include <reg51.h>
typedef unsigned char uint8;
bit flag = 0;
uint8 idata buf[30];
uint8 ct;
void InitUART(void) //串口初始化 9600bps
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void Send(uint8 c)
{
SBUF = c;
while(!TI);
TI = 0;
}
void main(void)
{
char j;
InitUART();
while(1)
{
if(flag) //是否接收到回车 字符串发送完
{
flag = 0;
for(j = ct ; j > 0 ; j--)
{
Send(buf[j-1]);
}
}
}
}
void UARTInterrupt(void) interrupt 4
{
static uint8 i = 0;
if(RI)
{
RI = 0;
buf[i++] = SBUF;
if(SBUF == 0x0d) //接受到回车
{
ct = i-1 ;
flag = 1;
i = 0;
}
}
else
TI = 0;
}
仿真结果
程序作为参考 希望 你自己能理解程序!只有自己掌握了才能很好地用!
G. 51单片机串口接收中断连续接收字符串,中断一直占有CPU时间直到字符串接收完毕
1楼薯誉的说法明显不对,串口接收时有标志位RI,当串口接收到一个字符(8位)时,RI会自动被置1,此时CPU会从主程序转去执行串行中断,普通单串口51单片机一般为 interrupt 4 子程序,当执行完时会自动回渗册到主程序继续执行,因此自 interrupt 4子程序结尾要把RI清零,以接受下一个中断,否则无法再接收下一个数据
interrupt 4主程序中一般处理方式是将接收寄存器SBUF中的数据转存到事先定义的缓存中,如果是接受字符串时请丛手宏注意缓存需移位,例程如下:
void Serial_interrupt() interrupt 4
{
uchar temp;
rec_data[i++]=SBUF; // rec_data为事先定义的接收缓存,可以持续接收,直到你需要串口数据时来取为止
RI=0;//接收中断信号清零,表示将继续接收
}