找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2306|回复: 3
收起左侧

求一个PC发送一条字符串单片机收到后原样返回

[复制链接]
ID:184257 发表于 2017-11-21 20:30 | 显示全部楼层 |阅读模式
20黑币
就是PC发送一条字符串,单片机收到后又把收到的那条字符串原样的返给PC,单片机是15W4K56S4,,,串口1。要用定时器2

最佳答案

查看完整内容

//这是我给坛友修改的程序片段,你可以参考一下。 //串口助手发送0x7E xx yy 0x0D,0x7E是数据头,0x0D是数据尾,xx yy是有效数据 #include typedef unsigned char u8; typedef unsigned int u16; u8 rec_buf[4];//接收数据缓存 bit flag=0; //接收完成标志 void InitUART() { TMOD = 0x20; SCON = 0x50; TH1 = 0xFA; TL1 = TH1; PCON = 0x80; EA = 1; ES = 1; TR1 = 1; } ...
回复

使用道具 举报

ID:213173 发表于 2017-11-21 20:30 | 显示全部楼层
//这是我给坛友修改的程序片段,你可以参考一下。
//串口助手发送0x7E xx yy 0x0D,0x7E是数据头,0x0D是数据尾,xx yy是有效数据
#include <reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 rec_buf[4];//接收数据缓存
bit flag=0;        //接收完成标志

void InitUART()
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFA;
    TL1 = TH1;
    PCON = 0x80;
    EA = 1;
    ES = 1;
    TR1 = 1;
}

void SendOneByte(u8 c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
}
void main()
{
        u8 i;
        InitUART();
        while(1)
        {
                if(flag==1)
                {
                        ES=0;                //关串口中断
                        flag=0;
                        if(rec_buf[3]==0x0D)//验证数据尾,否则返回无效信息
                        {                       
                                for(i=0;i<4;i++)
                                SendOneByte(rec_buf[i]);
                        }
                        else SendOneByte(0xFF);
                        ES=1;                //开串口中断
                }
        }
}

void UARTInterrupt() interrupt 4
{
        static u8 num=0;                //静态变量
        RI=0;                                        //接收中断请求标志位清0
        rec_buf[num]=SBUF;                //保存SBUF接收到的数据
        if(rec_buf[0]==0x7E)        //验证数据头,否则放弃
        {
                num++;
                if(num>=4)
                {
                        flag=1;                        //接收完成标志置1
                        num=0;
                }
        }
}
回复

使用道具 举报

ID:164602 发表于 2017-11-22 08:39 | 显示全部楼层
呵呵,算你运气好,我正好做过这个STC15串口的程序,和你的片子一样——STC15W4K58S4。
看看我的程序:
#include <STC15F2K60S2.H>
#include <intrins.h>

void Delay500ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 22;
        j = 3;
        k = 227;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void UartInit(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;
        AUXR = 0x40;
        TMOD &= 0x00;
        TL1 = 0xE0;
        TH1 = 0xFE;
        ET1 = 0;
        TR1 = 1;
        ES=1;
        EA=1;
}

void main(void)
{
        P0M1 = 0;        P0M0 = 0;        //设置为准双向口
        P1M1 = 0;        P1M0 = 0;        //设置为准双向口
        P2M1 = 0;        P2M0 = 0;        //设置为准双向口
        P3M1 = 0;        P3M0 = 0;        //设置为准双向口
        P4M1 = 0;        P4M0 = 0;        //设置为准双向口
        P5M1 = 0;        P5M0 = 0;        //设置为准双向口

        UartInit();
        while(1)
        {
        }
}

void Usart() interrupt 4//串口中断
{
        unsigned char receiveData;

        receiveData=SBUF;//出去接收到的数据
        RI = 0;//清除接收中断标志位
        SBUF=receiveData;//将接收到的数据放入到发送寄存器
        while(!TI);//等待发送数据完成
        TI=0;//清除发送完成标志位
}



回复

使用道具 举报

ID:184257 发表于 2017-11-22 22:59 | 显示全部楼层
HC6800-ES-V2.0 发表于 2017-11-22 08:39
呵呵,算你运气好,我正好做过这个STC15串口的程序,和你的片子一样——STC15W4K58S4。
看看我的程序:
# ...

可能是我没说清楚吧,我想要它先临时做存一下,等到串口收到下一条字符串过后,再两条字符串是一样的就给我返回来
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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