打印
[51单片机]

如何接收一个字符串后让灯亮起

[复制链接]
1989|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cvgjhuor|  楼主 | 2017-9-26 18:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
wsnsyy| | 2017-9-26 18:07 | 只看该作者
通讯是不是正常?IO口配置有没有问题

使用特权

评论回复
板凳
山东电子小菜鸟| | 2017-9-26 18:35 | 只看该作者
要注意你的格式

使用特权

评论回复
地板
dirtwillfly| | 2017-9-26 20:37 | 只看该作者
建议用逻辑分*析仪观察一下,看上位机是否正常发出了这个字符串。
如果正常发出了,就是单片机程序的问题

使用特权

评论回复
5
cvgjhuor|  楼主 | 2017-9-27 10:05 | 只看该作者
wsnsyy 发表于 2017-9-26 18:07
通讯是不是正常?IO口配置有没有问题

sbuf只能发8位,单个十六进制灯可以亮起,但字符串就不知道怎么弄了,如果可能的话能不能麻烦您给个程序

使用特权

评论回复
6
cvgjhuor|  楼主 | 2017-9-27 10:18 | 只看该作者
dirtwillfly 发表于 2017-9-26 20:37
建议用逻辑分*析仪观察一下,看上位机是否正常发出了这个字符串。
如果正常发出了,就是单片机程序的问题 ...

sbuf只能发8位,单个十六进制灯可以亮起,但字符串就不知道怎么弄了,如果可能的话能不能麻烦您给个程序

使用特权

评论回复
7
dirtwillfly| | 2017-9-27 20:22 | 只看该作者
cvgjhuor 发表于 2017-9-27 10:18
sbuf只能发8位,单个十六进制灯可以亮起,但字符串就不知道怎么弄了,如果可能的话能不能麻烦您给个程序 ...

发送单个字符可以,多次发送单个字符就是发送字符串阿,道理是一样的

使用特权

评论回复
8
ningling_21| | 2017-9-28 08:45 | 只看该作者
cvgjhuor 发表于 2017-9-27 10:05
sbuf只能发8位,单个十六进制灯可以亮起,但字符串就不知道怎么弄了,如果可能的话能不能麻烦您给个程序 ...

每次收一个字符,收4次就可以

使用特权

评论回复
9
gujiamao12345| | 2017-9-28 09:05 | 只看该作者
lz纠结的是字符串什么时候接收结束吧
1.固定长度;
2.特殊结束符;
3.自己定义协议:帧头+帧长+数据+checksum;

使用特权

评论回复
10
cvgjhuor|  楼主 | 2017-9-29 13:14 | 只看该作者
gujiamao12345 发表于 2017-9-28 09:05
lz纠结的是字符串什么时候接收结束吧
1.固定长度;
2.特殊结束符;

谢谢您,现在问题解决了,我是把收到的字符串保存到了数组里,但一次性调用多位我现在是用case语句嵌套来做的,比如调用数组第2和3位,就用了两个case嵌在一起达到目的,这样调用多位的话很麻烦,您有没有什么好的方法呢,而且case执行后语句一直都成立,比如case1:P1=0x01,执行后即使后面不发送1了,P1不变,我如何让当case一旦不持续为1,P1就不等于0x01呢

使用特权

评论回复
11
gujiamao12345| | 2017-9-29 15:29 | 只看该作者
cvgjhuor 发表于 2017-9-29 13:14
谢谢您,现在问题解决了,我是把收到的字符串保存到了数组里,但一次性调用多位我现在是用case语句嵌套来 ...

其他case或者default让P1的最低位置0呗

使用特权

评论回复
12
cvgjhuor|  楼主 | 2017-9-29 15:40 | 只看该作者
gujiamao12345 发表于 2017-9-29 15:29
其他case或者default让P1的最低位置0呗

我用了default让P1置0,但必须发个无效数才置0,如果上位机不发其他数P1依旧为0x01

使用特权

评论回复
13
gujiamao12345| | 2017-9-29 17:02 | 只看该作者
cvgjhuor 发表于 2017-9-29 15:40
我用了default让P1置0,但必须发个无效数才置0,如果上位机不发其他数P1依旧为0x01 ...

来整体程序吧
default应该基本进不了的

使用特权

评论回复
14
IICeeprom| | 2017-9-30 14:47 | 只看该作者
其实还可以这样玩
unsigned char StringCompare(char *Command, char *Command2)
{
    unsigned char i = 0, flag = 0;
    i = 0;
    while((*Command) != '\0')
    {
         if((*Command1) != '\0')
        {
            if((*Command) != (*Command1))
            {
                flag = 1;
                break;
            }
            else
           {
               Command++;
               Command1++;
               i++;
               flag = 0;
           }
        }
        else
        {
            flag = 1;
            break;
        }
    }
    return flag;
}


void main(void)
{
    if(StringCompare("value1",&"value2") == 0)
    {
        //如果两个Value值相同,则进入if语句内
    }
}

使用特权

评论回复
15
零点飞越| | 2017-11-30 17:17 | 只看该作者
用库函数吧,就是用printf 和scanf很简单的。

使用特权

评论回复
16
地瓜patch| | 2017-11-30 22:42 | 只看该作者
先把上位机发来的数据再发回去,确认通讯正常

使用特权

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

本版积分规则

4

主题

31

帖子

0

粉丝