标题: 关于51单片机串口通信程序 求思路 [打印本页]

作者: 164161297    时间: 2020-4-13 22:16
标题: 关于51单片机串口通信程序 求思路
如何用串口助手向单片机发送字符串(不是单个字符),然后单片机做出相应操作。比如我发一个“m1”,单片机亮一个LED灯。

作者: Flywithliye    时间: 2020-4-13 22:16
可以在调试助手里面勾选“发送新行”。然后输入m1,点击发送。
这样单片机收到的就会是字符串m1+“\r\n”。
然后在单片机串口中断里面检测到“\n”,结束一条指令的收集。告诉主程序已经接收完成。
然后在主程序中字符串比较就好啦。
可以参照以下链接中给出的单片机程序。
http://www.51hei.com/bbs/dpj-180566-1.html
作者: azjzg10000    时间: 2020-4-13 23:07
首先第一步用串口助手发送字符串的过程,你只要在助手中输入需要发送的内容,比如“m1”就可以直接发送。
作者: 164161297    时间: 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];
        }
}

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

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

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

啊哈哈,不过一年多过去啦。您应该已经解决了问题,或者已经在研究别的东西啦。
作者: 188610329    时间: 2021-9-7 13:51
Flywithliye 发表于 2020-4-13 22:16
可以在调试助手里面勾选“发送新行”。然后输入m1,点击发送。
这样单片机收到的就会是字符串m1+“\r\n” ...

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1