• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
liuliangdt
liuliangdt
级别: 家园常客
精华主题: 0
发帖数量: 447 个
工控威望: 681 点
下载积分: 66146 分
在线时间: 988(小时)
注册时间: 2010-09-05
最后登录: 2024-10-29
查看liuliangdt的 主题 / 回贴
楼主  发表于: 2014-03-04 23:02
小哥是个单片机业余爱好者,接触单片机有几年了。但很汗颜,水平一直还在入门口徘徊。本来想弄一个类似于多站通信的网络结构程序玩。写相互通信就的地方卡住了,再也写不下去。现在跪求坛友帮忙,因为写不下去已经几个月没碰单片机了。太恨了···
介绍一下通讯方案。一串信息帧有5个字节组成,主站发出一串信息帧后由对于的从站响应。因为从站要快速响应所以就设计在中断程序里回应(回复)。问题就出在这回应的子程序。同一个子程序,在主程序里顺序执行的时候和其它站是正常通讯。但要快速回应还得在中断里执行才行。从中断程序里发出通信信息都乱了,接收方收不到正确的信息。我已经试过了我想到可能性,但都不对。希望坛友们帮忙找出错误。在查错时最好要有两块单片机硬件联机,然后在它们RS-485信号处连到电脑的串口助手里看那些错误的字节。
如有没讲请清楚的地方待补充。
描述:解压文件
附件: 测试字符串通讯0#主机通讯.rar (23 K) 下载次数:28
网站提示: 请不要用迅雷下载附件,容易出错
琴岛工控
级别: 工控侠客
精华主题: 0
发帖数量: 402 个
工控威望: 2629 点
下载积分: 6817 分
在线时间: 345(小时)
注册时间: 2011-11-03
最后登录: 2024-11-25
查看琴岛工控的 主题 / 回贴
1楼  发表于: 2014-03-05 13:39
先下载看看,
本帖最近评分记录:
  • 下载积分:+5(liuliangdt) 感谢分享!
    liuliangdt
    liuliangdt
    级别: 家园常客
    精华主题: 0
    发帖数量: 447 个
    工控威望: 681 点
    下载积分: 66146 分
    在线时间: 988(小时)
    注册时间: 2010-09-05
    最后登录: 2024-10-29
    查看liuliangdt的 主题 / 回贴
    2楼  发表于: 2014-03-05 15:36
    引用
    引用第1楼琴岛工控于2014-03-05 13:39发表的  :
    先下载看看,




    嗯,先看看哪里有错误。最好在硬件上试。
    liuliangdt
    liuliangdt
    级别: 家园常客
    精华主题: 0
    发帖数量: 447 个
    工控威望: 681 点
    下载积分: 66146 分
    在线时间: 988(小时)
    注册时间: 2010-09-05
    最后登录: 2024-10-29
    查看liuliangdt的 主题 / 回贴
    3楼  发表于: 2014-03-05 20:14
    为了吸引大家的关注,我得用英文回贴:Tie zi bu neng chen a!
    supermax
    级别: 工控侠客
    精华主题: 0
    发帖数量: 590 个
    工控威望: 2540 点
    下载积分: 3642 分
    在线时间: 375(小时)
    注册时间: 2011-03-20
    最后登录: 2021-03-26
    查看supermax的 主题 / 回贴
    4楼  发表于: 2014-03-06 07:20
    给楼主一例子,
    //--------------------------------------------------------------
    /*====================================
    *名称:lcd_str.c
    *功能:从串口调试工具发送一字符串到单片机,在lcd1602和串口调试工具上显示【未加入校验】
    *作者:flying 09-2-23
    *修改:
    ======================================*/
    #include<reg51.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit lcden = P3^5;
    sbit lcdrw = P3^6;
    sbit lcdrs = P3^7;
    uchar table[10];
    uchar i, j, flag;
    void delay(uint n)
    {
            uint x,y;
            for( x = n; x > 0; x--)
                    for( y = 110; y > 0; y-- );
    }
    //lcd写命令函数
    void lcdwrite_com( uchar com )
    {
            lcdrs = 0;
            lcdrw = 0;
            P0 = com;
            delay(5);
            lcden = 1;
            delay(5);
            lcden = 0;
    }
    //lcd写数据
    void lcdwrite_date( uchar date )
    {
            lcdrs = 1;
            lcdrw = 0;
            P0 = date;
            delay(5);
            lcden = 1;
            delay(5);
            lcden  = 0;
    }
    //lcd初始化
    void lcd_init()
    {
            lcden = 0;
            lcdwrite_com( 0x38 );//显示模式设置
            lcdwrite_com( 0x0e );//显示光标
            lcdwrite_com( 0x01 );//清屏
            lcdwrite_com( 0x80 + 2 );//数据指针设置
    }
    //串口初始化
    void serial_init()
    {
            TMOD = 0x20;
            TH1 = 0xfd;         //9600赫兹
            TL1 = 0xfd;
            TR1 = 1;        //开启时间中断

            SCON = 0x50;//方式2
            SM2 = 1;        //可以向cpu请求中断
            EA = 1;                //开总中断
            ES = 1;                //开串口中断        
    }
    void putchar( uchar ch )//发送数据
    {
            SBUF = ch;
            while( !TI );
            TI = 0;
    }
    void main()
    {
            lcd_init();
            serial_init();
            while(1)
            {        
                    delay(20);
                    while( table[j] != '\0' && flag == 1 )
                    {
                            j = j >= 10 ? 0 : j;
                            putchar( table[j] );
                            lcdwrite_date( table[j] );
                            j++;
            //                delay(10);
                    }
            }
    }
    void Serial() interrupt 4
    {
            RI = 0;
            if( SBUF != '#')//遇到#终止写
            {
                    table = SBUF;
                    i++;
            }
            else
                    flag = 1;
    }
    本帖最近评分记录:
  • 下载积分:+5(liuliangdt) 热心助人!
    liuliangdt
    liuliangdt
    级别: 家园常客
    精华主题: 0
    发帖数量: 447 个
    工控威望: 681 点
    下载积分: 66146 分
    在线时间: 988(小时)
    注册时间: 2010-09-05
    最后登录: 2024-10-29
    查看liuliangdt的 主题 / 回贴
    5楼  发表于: 2014-03-06 20:45
    引用
    引用第4楼supermax于2014-03-06 07:20发表的  :
    给楼主一例子,
    //--------------------------------------------------------------
    /*====================================
    *名称:lcd_str.c
    *功能:从串口调试工具发送一字符串到单片机,在lcd1602和串口调试工具上显示【未加入校验】
    .......



    哥,我是菜鸟。能告诉我下面这几句是什么意思吗?
    /**table[j] != '\0' && flag == 1**/
    /** j = j >= 10 ? 0 : j;**/
    还有/**table = SBUF;**/,“table”不是一组吗?
    我写的那个例子在主程序扫描中是正常执行的。现在是不知道以后主程序会怎么写、有多长,所以就想把通信那部分集中到中断中来执行。到中断后问题就来了,在对方接收到信息来判断发送就有问题了。
    您说的校验部分我在百度上问过了,不过汗颜我看不懂。百度知道链条:http://zhidao.baidu.com/question/2137614590531493588.html?quesup2&oldq=1
    supermax
    级别: 工控侠客
    精华主题: 0
    发帖数量: 590 个
    工控威望: 2540 点
    下载积分: 3642 分
    在线时间: 375(小时)
    注册时间: 2011-03-20
    最后登录: 2021-03-26
    查看supermax的 主题 / 回贴
    6楼  发表于: 2014-03-07 07:15
    不是一组
    supermax
    级别: 工控侠客
    精华主题: 0
    发帖数量: 590 个
    工控威望: 2540 点
    下载积分: 3642 分
    在线时间: 375(小时)
    注册时间: 2011-03-20
    最后登录: 2021-03-26
    查看supermax的 主题 / 回贴
    7楼  发表于: 2014-03-07 09:06
    table,,是数组,而/**table = SBUF;**/已经注释了被屏蔽了在程序里不起作用。

    supermax
    级别: 工控侠客
    精华主题: 0
    发帖数量: 590 个
    工控威望: 2540 点
    下载积分: 3642 分
    在线时间: 375(小时)
    注册时间: 2011-03-20
    最后登录: 2021-03-26
    查看supermax的 主题 / 回贴
    8楼  发表于: 2014-03-07 09:15
    我的原程没有注释的,但你发问已经打上注释符
    supermax
    级别: 工控侠客
    精华主题: 0
    发帖数量: 590 个
    工控威望: 2540 点
    下载积分: 3642 分
    在线时间: 375(小时)
    注册时间: 2011-03-20
    最后登录: 2021-03-26
    查看supermax的 主题 / 回贴
    9楼  发表于: 2014-03-07 09:17
    那几句意思是:如果 j >= 10,,就 j = 0,
    只是把table 指向 sbuf,
    supermax
    级别: 工控侠客
    精华主题: 0
    发帖数量: 590 个
    工控威望: 2540 点
    下载积分: 3642 分
    在线时间: 375(小时)
    注册时间: 2011-03-20
    最后登录: 2021-03-26
    查看supermax的 主题 / 回贴
    10楼  发表于: 2014-03-07 09:21
    再有不明白你最好请教:shi2999,,我只是他手下,他真是恐怖的高手,我的一切都他教的,我也是刚入门。
    liuliangdt
    liuliangdt
    级别: 家园常客
    精华主题: 0
    发帖数量: 447 个
    工控威望: 681 点
    下载积分: 66146 分
    在线时间: 988(小时)
    注册时间: 2010-09-05
    最后登录: 2024-10-29
    查看liuliangdt的 主题 / 回贴
    11楼  发表于: 2014-03-07 11:27
    引用
    引用第10楼supermax于2014-03-07 09:21发表的  :
    再有不明白你最好请教:shi2999,,我只是他手下,他真是恐怖的高手,我的一切都他教的,我也是刚入门。



    一起共勉一起学习吧!
    那两句我那样写不出来。学习了。
    • «
    • 1
    • 2
    • »
    • Pages: 1/2     Go