找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
20黑币
我学习单片机一段时间, 现在学习RS485通信.用普中A7
我在12C5A60S2开发板学习了一个用RS485通信的代码, 是可正常运行的, 我用SSCOM32和4IN1的USB->485相互通信也正常.
我把代码修改一下移植到普中A7开发板和KST开发板处, 在SSCOM32发送AA 55, 可以令开发板的LED灯发亮, 但按按键1, SSCOM32显示1个 05后, 开发板就出现死机一样. 要按RESET键.
RESET後按键2, SSCOM32显示01 02 後, 开发板又出现死机.
请问各位我代码用在C51中有什么错误呢?
谢谢

http://www.51hei.com/bbs/dpj-230566-1.html

最佳答案

查看完整内容

/******************************************************************** 发送一个字节 *********************************************************************/ void Send(uchar x) { RS485_DIR=1; //RS485先设置为发送 SBUF = x; //將x放入缓冲区 当程序运行到这里将触发串口中断,中断中TI被清0。等跳出串口中断再执行下面的while(!TI);, 就会永远死在这里。两个TI清0只能选一个使用! while(!TI); //如果还未 ...
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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
}

回复

使用道具 举报

板凳
ID:860248 发表于 2023-7-20 22:48 | 只看该作者
楼上WULIN 你好
谢谢了, 我取消了    if( TI ) TI = 0; //如果发送新字串, 发送完,中断请求,TI软件置0
这一句後, 按K1~K4都发送正常, 太谢谢了

可能我在STC12C5A60S2开发板(不同MCU)正常, 而忽略了这个, 谢谢
但也顺便请教一下, 为什么又正常呢?

按K3K4也可以送发 字串.jpg (257.62 KB, 下载次数: 29)

按K3K4也可以送发 字串.jpg

按K1K2可以不停发整数.jpg (231.38 KB, 下载次数: 27)

按K1K2可以不停发整数.jpg
回复

使用道具 举报

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

有可能是两者的速度不同(1T/12T)形成的差异。在中断和while(!TI); 之间谁先被执行。但你的原代码确实是违反逻辑的。就算表面正常工作但还是存有隐患的,如果发生随机莫名其妙的死机都很难查清原因。上述红色注释已经解释得很清楚了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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