柯铭凯 发表于 2016-4-14 09:46:24

串口接收没有实现,不科学,不理解

大神们好,我的目的是要实现串口接收一组字符串并作出相应动作,下面的程序本意是要其接收到串口助手发送的11111111时P1^0置1,接收到22222222时P1^1置1的,但是我昨晚试了没有成功实现,楼主能帮我看看哪里不行?
#include <reg52.h>
#include <intrins.h>
#define uch unsigned char
#define uint unsigned int


uch idata buf;


void init(void)
{
TMOD = 0X20;
TH1 = 0XE8;
TH1 = 0XE8;
TR1 = 1;
SCON = 0X50; // 1 ,REN = 1
P1 = 0X00;
}


void receive(uch idata * d)
{
uch i;
while(RI == 0);
for(i=0; i<8; i++)
{
d = SBUF;
}
if(d == 1)
{
P1 = 0x01;
}
if(d == 2)
{
P1 = 0x02;
}
if(d == 3)
{
P1 = 0x04;
}
RI = 0;
}


void main(void)
{
while(1)
{
init();
receive(buf);
}
}

337zhang 发表于 2016-4-14 09:51:25

if(d == 1)--->if(d == '1')
if(d == 2)--->if(d == '2')
试试

mailyyg@163.com 发表于 2016-4-14 10:03:52

本帖最后由 mailyyg@163.com 于 2016-4-14 10:06 编辑

将接收到的字符从串口发送出去,看看接收到的字符具体是什么,晶振频率不合适的话,波特率误差比较大,容易有丢帧错帧的现象。

chaojikoushuige 发表于 2016-4-14 10:14:15

你发送的是十六进制还是字符???

chaojikoushuige 发表于 2016-4-14 10:15:03

怎么没有写串口中断程序呢?

zhuxm 发表于 2016-4-14 10:24:53

拜托,程序重新写过!初始化放在while(1)里,接受中断呢?!找点例程看看!

落叶知秋 发表于 2016-4-14 11:10:49

直白的说,楼主提问题的水平有待提高,编码水平也是…

haibaogk 发表于 2016-4-14 11:12:50

入门级的,还是看下你的数据到底是十六进制还是字符

柯铭凯 发表于 2016-4-14 12:58:44

zhuxm 发表于 2016-4-14 10:24
拜托,程序重新写过!初始化放在while(1)里,接受中断呢?!找点例程看看! ...

可能是我不会找资料吧,就没找到合适的例程,都是这边看看,那边看看,最后理解下自己写的,没有现成的串口接收字符串的例程可以看

柯铭凯 发表于 2016-4-14 13:03:13

haibaogk 发表于 2016-4-14 11:12
入门级的,还是看下你的数据到底是十六进制还是字符

前辈,接收数据是字符的

柯铭凯 发表于 2016-4-14 13:04:04

haibaogk 发表于 2016-4-14 11:12
入门级的,还是看下你的数据到底是十六进制还是字符

接收8个字符。我只是比对最低位的字符而已。

柯铭凯 发表于 2016-4-14 13:10:12

chaojikoushuige 发表于 2016-4-14 10:15
怎么没有写串口中断程序呢?

谢谢前辈,我一没留神给乱了
刚试了下,还是没效果,您看能不能再指点我一下?

#include <reg52.h>
#include <intrins.h>
#define uch unsigned char
#define uint unsigned int

uch idata buf;

void init(void)
{
        TMOD = 0X20;
        TH1 = 0XE8;
        TH1 = 0XE8;
        TR1 = 1;
        SCON = 0X50; // 1 ,REN = 1       
        P1 = 0X00;
}

void receive(uch idata * d)
{
        uch i;
        while(RI == 0);
        for(i=0; i<8; i++)
        {
                d = SBUF;
        }
                if(d == '1')
        {
                P1 = 0x01;
        }
        if(d == '2')
        {
                P1 = 0x02;
        }
        if(d == '3')
        {
                P1 = 0x04;
        }
        RI = 0;
}

void main(void)
{
        while(1)
        {
        init();
        }
}

void REC() interrupt 4 using 0
{
        receive(buf);
}

柯铭凯 发表于 2016-4-14 13:13:05

337zhang 发表于 2016-4-14 09:51
if(d == 1)--->if(d == '1')
if(d == 2)--->if(d == '2')
试试

前辈对不起,没成,这个肯定是对的,我写的时候没留意。我照着您说的改正了,不过估计我还弄出了其他问题,哎,又没成功

steaven2016 发表于 2016-4-14 13:44:45

while(RI == 0);
for(i=0; i<8; i++)
{
d = SBUF;
}

------------------

for 你个鬼,第一行:等待串口字符过来;第2~:5行:明明收到的是一个字符,连续读8次SBUF你到底想作什么?

柯铭凯 发表于 2016-4-14 14:09:49

steaven2016 发表于 2016-4-14 13:44
while(RI == 0);
for(i=0; i

有道理,我改下。
但是前辈,我用串口助手发的8个1过去。11111111也是没有动作,按理说d【0】比对到的也是1啊。

zhuxm 发表于 2016-4-14 14:41:08

把init函数放到在main()里这么难吗?{:dizzy:},不断地给T1赋值,P0置0,中断能有吗?去下载《划时代-51 单片机C 语言全新教程》仔细研读下,跟着做,或者上STC官网,下例程和手册,里面已经很详细了。

柯铭凯 发表于 2016-4-14 14:58:01

zhuxm 发表于 2016-4-14 14:41
把init函数放到在main()里这么难吗?,不断地给T1赋值,P0置0,中断能有吗?去下载《划时代-51 ...

谢谢,前辈,千言万语尽在不言中
页: [1]
查看完整版本: 串口接收没有实现,不科学,不理解