找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求帮测试一下串口程序

[复制链接]
跳转到指定楼层
楼主
ID:65643 发表于 2015-1-3 10:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面程序是用串口助手向51单片机, 发送 1回 01; 发2回01 02; 发3回 01 02 03 04;发4回 01 02 03 04 05 06 07 08;波特率9600; 16位发送与接收
现在出了个问题: 用 ISP 自带的串口助手就能通讯。用其它串口助手就不能通讯。那位大侠帮用开发板给测试一下,看看是什么地方出了问题。谢谢




#include <reg52.h>

bit cmdArrived = 0;   //命令到达标志,即接收到上位机下发的命令
unsigned char cmdIndex = 0; //命令索引,即与上位机约定好的数组编号
unsigned char cntTxd = 0;   //串口发送计数器
unsigned char *ptrTxd;      //串口发送指针

unsigned char array1[1] = {1};
unsigned char array2[2] = {1,2};
unsigned char array3[4] = {1,2,3,4};
unsigned char array4[8] = {1,2,3,4,5,6,7,8};

void ConfigUART(unsigned int baud);

void main()
{
    EA = 1;  //开总中断
    ConfigUART(9600);  //配置波特率为9600

    while (1)
    {
        if (cmdArrived)
        {
            cmdArrived = 0;
            switch (cmdIndex)
            {
                case 1:
                    ptrTxd = array1;         //数组1的首地址赋值给发送指针 等于ptrTxd = &array1[0];
                                  //  ptrTxd = & array1[0];
                    cntTxd = sizeof(array1); //数组1的长度赋值给发送计数器
                    TI = 1;   //手动方式启动发送中断,处理数据发送
                    break;
                case 2:
                    ptrTxd = array2;
                    cntTxd = sizeof(array2);
                    TI = 1;
                    break;
                case 3:
                    ptrTxd = array3;
                    cntTxd = sizeof(array3);
                    TI = 1;
                    break;
                case 4:
                    ptrTxd = array4;
                    cntTxd = sizeof(array4);
                    TI = 1;
                    break;
                default:
                    break;
            }
        }
    }
}
/* 串口配置函数,baud-通信波特率 */
void ConfigUART(unsigned int 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
}
/* UART中断服务函数 */
void InterruptUART() interrupt 4
{
    if (RI)  //接收到字节
    {
        RI = 0;  //清零接收中断标志位
        cmdIndex = SBUF;  //接收到的数据保存到命令索引中
        cmdArrived = 1;   //设置命令到达标志
    }
    if (TI)  //字节发送完毕
    {
        TI = 0;  //清零发送中断标志位
        if (cntTxd > 0)  //有待发送数据时,继续发送后续字节
        {
            SBUF = *ptrTxd;  //发出指针指向的数据
            cntTxd--;        //发送计数器递减
            ptrTxd++;        //发送指针递增
        }
    }
}



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

使用道具 举报

沙发
ID:58502 发表于 2015-1-4 14:47 | 只看该作者
你串口号没设置好,你用stc-isp用的是com2,而用串口调试精灵确是com1,所以接收不到,把com1改为com2就可以了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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