找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2014|回复: 5
打印 上一主题 下一主题
收起左侧

关于51单片机串口通信程序 求思路

[复制链接]
跳转到指定楼层
楼主
ID:689260 发表于 2020-4-13 22:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5黑币
如何用串口助手向单片机发送字符串(不是单个字符),然后单片机做出相应操作。比如我发一个“m1”,单片机亮一个LED灯。

最佳答案

查看完整内容

可以在调试助手里面勾选“发送新行”。然后输入m1,点击发送。 这样单片机收到的就会是字符串m1+“\r\n”。 然后在单片机串口中断里面检测到“\n”,结束一条指令的收集。告诉主程序已经接收完成。 然后在主程序中字符串比较就好啦。 可以参照以下链接中给出的单片机程序。 http://www.51hei.com/bbs/dpj-180566-1.html
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:220005 发表于 2020-4-13 22:16 | 只看该作者
可以在调试助手里面勾选“发送新行”。然后输入m1,点击发送。
这样单片机收到的就会是字符串m1+“\r\n”。
然后在单片机串口中断里面检测到“\n”,结束一条指令的收集。告诉主程序已经接收完成。
然后在主程序中字符串比较就好啦。
可以参照以下链接中给出的单片机程序。
http://www.51hei.com/bbs/dpj-180566-1.html
回复

使用道具 举报

板凳
ID:728625 发表于 2020-4-13 23:07 | 只看该作者
首先第一步用串口助手发送字符串的过程,你只要在助手中输入需要发送的内容,比如“m1”就可以直接发送。
回复

使用道具 举报

地板
ID:689260 发表于 2020-4-14 09:50 | 只看该作者
Flywithliye 发表于 2020-4-14 00:59
可以在调试助手里面勾选“发送新行”。然后输入m1,点击发送。
这样单片机收到的就会是字符串m1+“\r\n” ...

你好,非常感谢,但是我的串口助手没有发送新行这个选项,然后我自己又写了一个程序,但是不对,它单独判断m或者1的时候灯会亮,但是一起判断(就像我下面写的),就不会亮,请问问题出在哪里了
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
               
void UARTInit();
uchar recieve[2];
uchar flag;
void main()
{
        UARTInit();
        while(1)
        {
                if(flag)
                {
                        flag = 0;
                        if(recieve[0] == 'm' && recieve[1] == '1')
                        {
                                P1 = 0xfe;
                        }
                }
        }
}
void UARTInit()
{
        REN = 1;
        TMOD = 0x20;
        TR1 = 1;
        SM0 = 0;        SM1 = 1;
        TH1 = 0xfd;
        TL1 = 0xfd;
        EA = 1;
        ES = 1;
        TR1=1;
}
void UART() interrupt 4
{
        uchar i=0;
        if(RI)
        {
                RI = 0;
                for(i=0; i<2; i++)
                {
                        recieve = SBUF;
                }
                flag = 1;
                SBUF = recieve[0];
                SBUF = recieve[1];
        }
}
回复

使用道具 举报

5#
ID:220005 发表于 2021-9-7 11:27 | 只看该作者
164161297 发表于 2020-4-14 09:50
你好,非常感谢,但是我的串口助手没有发送新行这个选项,然后我自己又写了一个程序,但是不对,它单独判 ...

不好意思隔了一年半才看到,您这个串口中断是不对的。
1. 每次RI被置位,只能读一次SBUF。您在一次中断中,用for读了两次是不可取的。
2. 您需要维护一个全局或静态“指针”,在每次写recieve数组的时候,确定位置。
3.在中断里面连续给SBUF赋值两次也是不可取的。前一句还来不及执行就直接被后一句覆盖了。

还是建议您看一下我上面链接里对应的内容。

啊哈哈,不过一年多过去啦。您应该已经解决了问题,或者已经在研究别的东西啦。
回复

使用道具 举报

6#
ID:624769 发表于 2021-9-7 13:51 | 只看该作者
Flywithliye 发表于 2020-4-13 22:16
可以在调试助手里面勾选“发送新行”。然后输入m1,点击发送。
这样单片机收到的就会是字符串m1+“\r\n” ...

个人觉得,与其判断 \r\n 不如判断超时,来确认字符串接受完毕,反正横竖都要判断超时的.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表