找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

单片机开发板 RS485通信接收可以, 不能发送

查看数: 2590 | 评论数: 3 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-7-20 13:24

正文摘要:

我学习单片机一段时间, 现在学习RS485通信.用普中A7 我在12C5A60S2开发板学习了一个用RS485通信的代码, 是可正常运行的, 我用SSCOM32和4IN1的USB->485相互通信也正常. 我把代码修改一下移植到普中A7开发板和KST ...

回复

ID:213173 发表于 2023-7-21 07:41
kscheang 发表于 2023-7-20 22:48
楼上WULIN 你好
谢谢了, 我取消了     if( TI ) TI = 0; //如果发送新字串, 发送完,中断请求,TI软件置0
...

有可能是两者的速度不同(1T/12T)形成的差异。在中断和while(!TI); 之间谁先被执行。但你的原代码确实是违反逻辑的。就算表面正常工作但还是存有隐患的,如果发生随机莫名其妙的死机都很难查清原因。上述红色注释已经解释得很清楚了。
ID:213173 发表于 2023-7-20 13:24
/********************************************************************
发送一个字节
*********************************************************************/
void Send(uchar x)
{
        RS485_DIR=1; //RS485先设置为发送
        SBUF = x; //將x放入缓冲区
当程序运行到这里将触发串口中断,中断中TI被清0。等跳出串口中断再执行下面的while(!TI);,
就会永远死在这里。两个TI清0只能选一个使用!
        while(!TI); //如果还未发送完,不停发送   等待中断请求标志TI为1
        TI=0; //发送完,中断请求,TI软件置0
        RS485_DIR=0; //RS485设置为接收
}
/********************************************************************
发送接收中断函数
*********************************************************************/
void uart_isr() interrupt 4
{
        if( RI ) //如果接收到新字串
        {
                RI = 0; //接收完. 中断请求, RI软件置0
                dat = SBUF; //將接收缓冲区的值赋值给dat
        }
        if( TI ) TI = 0; //如果发送新字串, 发送完,中断请求,TI软件置0
}

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

Powered by 单片机教程网

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