找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于串口收发多字节

[复制链接]
跳转到指定楼层
楼主
ID:305998 发表于 2018-6-6 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

我想把它改成 我在串口助手发多少个字节 它就接收多少个字节并返回到串口助手上 返回的格式为
发送 1 2 3  返回 31 32 33
现在这个程序是必须要每次发送四个字节才行,如果每次发送一个字节 则要发送四次才能接收

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:305998 发表于 2018-6-6 15:17 | 只看该作者
程序如下  麻烦大神帮我想想


#include <stc12c5a32s2.h>
#include "usart.h"
#include "delay.h"

#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int


uchar num = 0;
uchar flag=0;
uchar i;
uchar n;
uchar RBuf[4];

/*------------------主程序--------------------*/
void main(void)
{        
//        uchar key ;
        Delay1ms();
        
        ConfigUART();
        lcd_init();
        lcd_clr();
//        key = Key_Scan();
        dprintf(16,0,"欢 迎 光 临",0);
        

        while(1)
        {        

                if(flag == 1)//当接收到数据
                {
                        ES = 0;//关闭串口中断
                        for(i=0;i<4;i++)
                        {
                                SBUF = RBuf[i];
                                while(!TI); TI = 0;
                        }                                                        
                        ES = 1;
                        flag = 0;
                        num = 0;

                }


}




void Uart_Isr() interrupt 4 using 1
{        
        if(RI)
        {        
          RBuf[num] = SBUF;
                while(!RI);
                RI = 0;
                num++;
        }
        if(num == 4)  flag = 1;

        

}
回复

使用道具 举报

板凳
ID:346225 发表于 2018-6-6 16:17 | 只看该作者
串口接收,必须把缓存的数据读出,然后下个数据才能发送, 你可以有数据发送过来就直接接收,然后数据满4个再进行数据处理
回复

使用道具 举报

地板
ID:213173 发表于 2018-6-6 21:11 | 只看该作者
yzcook 发表于 2018-6-6 15:17
程序如下  麻烦大神帮我想想

#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
uchar flag;                //接收完成标志,
uchar a;                //收发变量
void main()                                                       
{
        TMOD=0x20;//定时器1方式2(8位重载)
        TH1=0xfd; //波特率9600
        TL1=0xfd; //波特率9600
        TR1=1;        //开定时器1
        REN=1;        //允许串行接收
        SM0=0;        //设置串口方式1(8位UART波特率可变)
        SM1=1;        //设置串口方式1(8位UART波特率可变)
//        PCON=0x80;        //波特率加倍9600*2
        EA=1;        //总中断开
        ES=1;        //串口中断开
        while(1)
        {
                if(flag==1)                //接收完成标志为1
                {
                        ES=0;                //关串口中断
                        flag=0;                //接收完成标志清0
                        SBUF=a+'0';                //发送数据
                        while(!TI);        //等待发送中断请求标志位为1
                        TI=0;                //发送中断请求标志位清0
                        ES=1;                //开串口中断
                }
        }
}

void ser() interrupt 4
{                                //当接收完成发生中断请求RI由硬件置1
                RI=0;        //接收中断请求标志位清0,必须软件清0
                a=SBUF;//获取SBUF接收到的数据
                flag=1;//接收完成标志置1
}


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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