打印

51单片机串口收发字符串求助

[复制链接]
楼主: stcome
手机看帖
扫描二维码
随时随地手机跟帖
21
stcome|  楼主 | 2012-9-20 17:12 | 只看该作者 回帖奖励 |倒序浏览
19楼 JOYME
是的,我是用STC 51的单片机.你的程序我会再试试,如果可以,可发发你整个程序给我,让我多了解了解你的思路,TKS

使用特权

评论回复
22
joyme| | 2012-9-20 17:29 | 只看该作者
if(strcmp(str,"good") == 0)
这句话是错的
可以直接用定义的数组,str在我的程序里是没有用到的
写出if(strcmp(rxd_buf,"good") == 0)或不该,将str赋值
str = rxd_buf

使用特权

评论回复
23
stcome|  楼主 | 2012-9-20 19:10 | 只看该作者
我用了if(strcmp(rxd_buf,"good") == 0) 但是接受不了数据,正在分析中

使用特权

评论回复
24
stcome|  楼主 | 2012-9-20 19:13 | 只看该作者
为什么用strcmp一定要用数组呢,用指针不行么? 我就不明解,为什么跟C语言不一样,不能完全一样才执行,假如在C++6.0,用strcmp一定是跟GOOD完全一样,但到了MCU环境下就是输入不管你是什么字符串只要存在GOOD就执行IF 里面的语句,,,为什么,,,,WHY

使用特权

评论回复
25
mcuexplore| | 2012-9-20 20:18 | 只看该作者
我这边调试是通过的 你那边是用串口助手 吗
如果不是 是不是上位机处理有问题

使用特权

评论回复
26
stcome|  楼主 | 2012-9-20 23:06 | 只看该作者
我是用串口助手的,我朋友那边也出现这种问题,你原程序是什么,我是用你之前发的程序,可是不行,会出现有残留的字符

使用特权

评论回复
27
mcuexplore| | 2012-9-21 07:01 | 只看该作者
两个需要修改的地方:
1. 请将uint len = 0; 改成uint len;
2. 在主函数while 内的开始处加入len = 0;

一个需要确认的地方:
请问你是如何发送回车的?
(你可以先将串口中断中ch == '\n'改成ch == 'z', 然后用串口助手发送abcz试一下)

使用特权

评论回复
28
stcome|  楼主 | 2012-9-21 10:21 | 只看该作者
MCUEXPLORE 还是出现乱码现象,同上回原因一样,还有残留的旧数据, 我正在找原因

使用特权

评论回复
29
stcome|  楼主 | 2012-9-21 11:47 | 只看该作者
MCUEXPLORE,
关于你的程序我已修改,如下:
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

#define BUF_LEN 50

sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;

uint inbuf[BUF_LEN];

uchar flag, a, i, count,clean;

void init();

void main()
{
    uint len ;

    init();   
    while (1)
    {
                len = 0;
        while (inbuf[len] != '\z')

    len++;

        if (flag == 1)
        {
            flag = 0;   
            ES = 0;
            for (i = 0; inbuf !='\z'; i++)
            {
                SBUF = inbuf;
                while (!TI);
                TI = 0;
            }
            ES = 1;     
                        for(clean=0; clean < BUF_LEN; clean++ )
                        inbuf[clean] = '\0';
        }
    }
}

void init()
{
    TMOD = 0x20;  
    TH1 = 0xfd;   
    TL1 = 0xfd;        
    SCON = 0X50;
        TR1 = 1;            
    ES = 1;      
    EA = 1;     
}

void ser() interrupt 4
{
    uchar ch;

    if (RI)
    {
        RI = 0;
        count++;
        ch = SBUF;
        inbuf[count - 1] = ch;
        if (ch == '\z')
        {
            inbuf[count] = '\z';
            count = 0;
            flag = 1;
        }
    }
}

程序中的蓝字部分是我修改后的,不过还有一个问题,刚输入的时候还是有一段乱码,不知道为什么,同时还想提一下,串口调试助手的回车不是'\n'吗????????

使用特权

评论回复
30
stcome|  楼主 | 2012-9-21 11:55 | 只看该作者
已找到原因,一开始没有清空数组,我把
for(clean=0; clean < BUF_LEN; clean++ )
                        inbuf[clean] = '\0';        }
在主函数一开始就清零就好了
不过,如果是回车键识别就不行了

使用特权

评论回复
31
stcome|  楼主 | 2012-9-21 16:08 | 只看该作者
假如用STRCMP用来对比输入的字符串那该怎么写,我编了好久也不能实现,

使用特权

评论回复
32
mcuexplore| | 2012-9-21 17:08 | 只看该作者
1. 如果仅仅比较单个字符 , 不是可以用 == 比较就可以了吗?
2. 比较字符串不是可以调用库函数 strcmp吗(头文件: #include <string.h>)

使用特权

评论回复
33
stcome|  楼主 | 2012-9-22 09:23 | 只看该作者
strcmp 用这个函数的时候不方便,它中介比较内容,没有比较长度,,,,能有更好的函数么?

使用特权

评论回复
34
mcuexplore| | 2012-9-22 09:51 | 只看该作者
不太懂你的意思 strcmp函数在字符比较的过程中包含了长度考虑,
比如, abc,  abcd比较
前面三个字符一样, 第四个字符比较时, abc的第四个字符为\0, abcd的第四个字符为d, d的asill码大于\0, 不就相当于abc的长度,小于abcd的长度吗

还有个问题,  就是你说的 "换行符"在串口助手中的表示(调试了很久, 我也没有找到), 其实这里的每次结束串口输入, 你可以采用"#", 就是说你在串口中断函数中, 当串口接收到"#", 就退到主函数中执行串口输出,
而你写的"\z"不知道是什么意思

使用特权

评论回复
35
stcome|  楼主 | 2012-9-22 16:24 | 只看该作者
呵呵,回车\r 我找出来了,
我说strcmp 不方便的意思,是这样的你可以试试,假设我用if (strcmp(str,"open") ==0 )  作比较时,会出现这种情况,当STR字符串前四位是open之后不管是什么字符都可以进入IF 语句,输入是opendfdfwedfsddf 它也会进入, 搞不清楚,没办法,只好 再加长度比较 if(strlen(str)== strlen("open")) 但还是不行,,,暂时还不知道是什么原因!

使用特权

评论回复
36
mcuexplore| | 2012-9-22 17:47 | 只看该作者
你方便把程序贴出来吗

使用特权

评论回复
37
stcome|  楼主 | 2012-9-24 08:55 | 只看该作者
#include <reg52.h>
#include <string.h>


#define uchar unsigned char
#define uint unsigned int

#define BUF_LEN 50

sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;

uchar inbuf[BUF_LEN];
uchar innbuf[] = "strong";

uchar flag, a, i,temp = 0, count = 0 ,clean;

void init();
uint BOOLstrcmp(const char *s1, const char *s2);
void main()
{

     
        for(clean=0; clean < BUF_LEN; clean++ )
                        inbuf[clean] = '\0';
                        init();
                          
    while (1)
    {
       
                if (strcmp(inbuf,"strong")==0)
                        P1 = 0X00;
                       
               
        if (flag == 1)
        {
            flag = 0;
               
                       

         
            ES = 0;
            for (i = 0; inbuf[i] !='\0'; i++)
            {
                SBUF = inbuf[i];
                while (!TI);
                TI = 0;
            }
            ES = 1;     
                        for(clean=0; clean < BUF_LEN; clean++ )
                        inbuf[clean] = '\0';
                        temp = 0;
        }
               
    }
}

void init()
{
    TMOD = 0x20;  
    TH1 = 0xfd;   
    TL1 = 0xfd;        
    SCON = 0X50;
        TR1 = 1;            
    ES = 1;      
    EA = 1;     
}

void ser() interrupt 4
{
    uchar ch;

    if (RI)
    {
        RI = 0;
        count++;
        ch = SBUF;
        inbuf[count - 1] = ch;
        if (ch == '\#')
        {
                        inbuf[count-1]= '\0';
           // inbuf[count] = '\n';
            count = 0;
            flag = 1;
                       

        }
                temp++;
    }
}

就是这个程序!

使用特权

评论回复
38
mcuexplore| | 2012-9-24 13:53 | 只看该作者
char sTmp[] = "strong";

if (strcmp(inbuf,sTmp)==0 && (strlen(inbuf) == strlen(sTmp)))
    P1 = 0X00;

使用特权

评论回复
39
taokan1991| | 2012-9-24 16:04 | 只看该作者
你的我没看,但我给你写了一份,经调试可用但要注意 要11.0592M的晶振(用9600的波特率是12M的晶振是有误差的),你以16进制发送1或0,以字符格式显示看看效果,再看看代码,再想想

使用特权

评论回复
40
taokan1991| | 2012-9-24 16:04 | 只看该作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag=1,a,i;
uchar code table1[]=" I love you ";
uchar code table2[]=" you love me ";
void init()
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=1;
        SM1=1;
        EA=1;
        ES=1;
}
void main()
{
        init();
        while(1)
        {
                if(flag==1)
                {
                        ES=0;
                        if(a==1)
                        {
                                  for(i=0;i<12;i++)
                                {
                                        SBUF=table1[i];
                                        while(!TI);
                                        TI=0;       
                                }       
                                SBUF=a;
                                while(!TI);
                                TI=0;
                        }
                        else if(a==0)
                        {
                                  for(i=0;i<14;i++)
                                {
                                        SBUF=table2[i];
                                        while(!TI);
                                        TI=0;       
                                }       
                                SBUF=a;
                                while(!TI);
                                TI=0;
                        }
                        ES=1;
                        flag=0;
                }
        }
}

void ser() interrupt 4
{
        RI=0;
        a=SBUF;
        flag=1;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则