找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10424|回复: 9
收起左侧

单片机串口通信接收与发送字符串问题

[复制链接]
ID:185453 发表于 2017-4-9 14:35 | 显示全部楼层 |阅读模式
我的目的是通过电脑给单片机发送一个字符串k+25,单片机接收到该字符串后,发送给电脑25这两个字符;单片机虽然接受到了该字符串,但是发送到电脑时总是+2
这两个字符。我在发送函数里已经用for(j=2;j<4;j++)来限制只发送25这两个字符了,可是现在一直发送+2这两个字符,麻烦各位大神帮我看一下吧,谢谢了
下面是我写的程序
QQ图片20170409142241.png QQ图片20170409142347.png QQ图片20170409142351.png
下面是串口助手调试情况:
QQ图片20170409142356.png


回复

使用道具 举报

ID:7485 发表于 2017-4-9 18:16 | 显示全部楼层
本帖最后由 ahshmj 于 2017-4-9 18:21 编辑

感觉你的波特率设置不对。晶振是多少?
你电脑界面上选的是“STC89C/LE52RC”,但是STC官方给出的如下:
        SCON = 0x50;                //8位数据,可变波特率
        AUXR &= 0xBF;                //定时器1时钟为Fosc/12,即12T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
        TL1 = 0xE8;                //设定定时初值
        TH1 = 0xFF;                //设定定时初值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1

(11.0592晶振)

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:151348 发表于 2017-4-9 18:25 | 显示全部楼层
来,试试我这个
#include<reg52.h>

unsigned char cntRxd = 0;
unsigned char cmdArrived = 0;
unsigned char bufRxd[40]; //串口接收缓冲区

void ConfigUART(unsigned int baud)  //串口配置函数,baud为波特率
{
    SCON = 0x50;   //配置串口为模式1
    TMOD &= 0x0F;  //清零T1的控制位
    TMOD |= 0x20;  //配置T1为模式2
    TH1 = 256 - (11059200/12/32) / baud;  //计算T1重载值
    TL1 = TH1;     //初值等于重载值
    ET1 = 0;       //禁止T1中断
    ES  = 1;       //使能串口中断
    TR1 = 1;       //启动T1
}
void UartWrite(unsigned char *buf) //串口发送函数
{
        unsigned char i;
    for(i = 0;i<cntRxd;i++)   //发送数据
    {
        SBUF = *buf;
        buf++;
    }
}

void main ()
{
    EA = 1;           //开总中断
    ConfigUART(9600); //配置波特率为9600
    while(1)
    {
             if (cmdArrived) //有命令到达时,读取处理该命令
            {
                cmdArrived = 0;
                        UartWrite(bufRxd);
                        cntRxd = 0;
            }
        }
}

void InterruptUART() interrupt 4  //UART中断服务函数
{
        if(RI)
        {
                bufRxd[cntRxd++] = SBUF; //保存接收字节
        while(!RI);
                RI = 0;   //手动清零接收中断标志位
                cmdArrived = 1;
    }
    if (TI)  //字节发送完毕
        {
              TI = 0;
        }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:185453 发表于 2017-4-9 19:48 | 显示全部楼层
imxuheng 发表于 2017-4-9 18:25
来,试试我这个
#include

恩恩  好的 谢谢了
回复

使用道具 举报

ID:185453 发表于 2017-4-9 20:01 | 显示全部楼层
ahshmj 发表于 2017-4-9 18:16
感觉你的波特率设置不对。晶振是多少?
你电脑界面上选的是“STC89C/LE52RC”,但是STC官方给出的如下:
...

我的是51单片机,但是卖家说STC上没有51,型号选择“STC89C/LE52RC”这个就行,他说没有事儿
回复

使用道具 举报

ID:7485 发表于 2017-4-10 09:09 | 显示全部楼层
FIGHLTDEAME 发表于 2017-4-9 20:01
我的是51单片机,但是卖家说STC上没有51,型号选择“STC89C/LE52RC”这个就行,他说没有事儿

芯片型号 : STC89C51RC/LE51RC

关于此芯片的重要说明:
  固件版本在v7.0及以上时
  . 芯片内部包含有全球唯一ID号
  . 上电复位后,ID号会自动复制到RAM区域的F1H-F7H
  . 更新代码时可使用烧录选项将ID号烧录到程序区的最后7字节中


这是官方的,说明有这个型号。
回复

使用道具 举报

ID:234180 发表于 2017-9-29 21:01 | 显示全部楼层
imxuheng 发表于 2017-4-9 18:25
来,试试我这个
#include

隔了5个月,不知大佬还能看见不,请问下面这行是什么意思呢
receivedate[flag++] = SBUF;

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:234180 发表于 2017-9-29 21:02 | 显示全部楼层
imxuheng 发表于 2017-4-9 18:25
来,试试我这个
#include

隔了5个月,不知大佬还能看见不,请问下面这句话是什么意思呢
bufRxd[cntRxd++] = SBUF;

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:116773 发表于 2018-9-2 08:56 | 显示全部楼层
这句的意思是先将接收缓存SBUF中的数据存放到数据bufRxd[cntRxd]中,然后cntRxd再加1。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:234180 发表于 2018-11-1 19:03 | 显示全部楼层
hujj 发表于 2018-9-2 08:56
这句的意思是先将接收缓存SBUF中的数据存放到数据bufRxd[cntRxd]中,然后cntRxd再加1。

3q,时隔一年的互动
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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