你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

485通信在发送状态切换到接收状态多发送个0怎么回事

[复制链接]
人之颠 提问时间:2015-7-16 09:37 /
本帖最后由 人之颠 于 2015-7-16 15:02 编辑

大家好,我用的是max3430芯片,和stm32f107通信。在485芯片由发送状态切换到接收状态时,电脑上的串口助手会多接收一个“0”字节,正常运行和单步调试时都会出现这种情况。这是我设计的电路图
485.png
我又试了一下,波形没问题,就是发现单片机在一个发送周期内,自己连续发了两个字节,一个是我要发送的一个字节,一个是多出的那个0,但是我的程序写的就是发送一个字节,神马情况啊这是
box.jpg

这是我写的程序代码


daima.png


收藏 评论21 发布时间:2015-7-16 09:37

举报

21个回答
小耳朵1500922649 回答时间:2018-8-31 17:11:49
qwb736727429 发表于 2018-8-31 14:39
那请问下,软件上是怎么写的?
我这边就是开发送时能,发送数据,判断传输完成之后开接收时能。485会收到 ...

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));
   
  /* Transmit Data */
  USARTx->TDR = (Data & (uint16_t)0x01FF);
}

static void RS485_SendData(uint8_t *buff,uint8_t len)
{
        RS485_TX;//切换为发送模式
        while(len--)
        {
                                        while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TXE)==RESET);//等待发送区为空

                                        USART_SendData(USART2,*(buff++));
        }
                                while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)==RESET);//等待发送完成
                                RS485_RX;//切换为接收模式
}
软件上用一个定时器器实现MODBUS,调用RS485_SendData函数即可
小耳朵1500922649 回答时间:2018-8-31 17:07:20
static void RS485_SendData(uint8_t *buff,uint8_t len)
{
        RS485_TX;//切换为发送模式
        while(len--)
        {
                                        while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TXE)==RESET);//等待发送区为空

                                        USART_SendData(USART2,*(buff++));
        }
                                while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)==RESET);//等待发送完成
                                RS485_RX;//切换为接受模式
}

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));
   
  /* Transmit Data */
  USARTx->TDR = (Data & (uint16_t)0x01FF);
}

软件上自己用一个定时器实现MODBUS, 接收验证成功后调用RS485_SendData函数即可
cenzmin 回答时间:2015-7-16 13:15:15
可能这个问题不好解决。
在你的485发送完成后,TX为高电平,485总线上A线电压 > B线电压;
将485从发送切换到接收,485接口芯片的促使A、B线为高阻态;
此时由于你的A、B线之间的匹配电阻120R,使A、B线的电压差减小到0;
但是如果考虑总线上电感的因素,有可能导致B线的电压 > A线电压;
因此,这个时刻对于接收端来说,会出现一个0电平。
在232的硬件里边,接收端RX脚上出现一个下降沿,满足232的起始位条件,可以认为是一个字节传输的开始,是不是就导致了接收端接收了一个“0”字节。
至于接收端认为启动了一个字节的传输,满足了起始条件,但是并不满足232传输的停止位;这个问题就不是很清楚了。
可以建议楼主在485的A、B线上,分别对地接一个小电容;看看有没有改善。
而且,好像120R的匹配电阻,并不是什么情况下都需要接上的。

个人见解,仅供参考。
魅影-2023106 回答时间:2015-7-16 09:44:11
远距离传输会出问题
人之颠 回答时间:2015-7-16 10:02:27
魅影-2023106 发表于 2015-7-16 09:44
远距离传输会出问题

不是远距离,就是通过USB转485和电脑通信进行测试
人之颠 回答时间:2015-7-16 10:45:13
求助啊,好郁闷啊,对这个问题没头绪啊:'(:'(:'(:'(:'(:'(
lkl0305 回答时间:2015-7-16 12:52:53
看看波形,单步,看看在哪里出现
cenzmin 回答时间:2015-7-16 13:16:55
A、B线的电容,应该是A、B间一个,A、B分别对地各一个
人之颠 回答时间:2015-7-16 13:58:26
cenzmin 发表于 2015-7-16 13:15
可能这个问题不好解决。
在你的485发送完成后,TX为高电平,485总线上A线电压 > B线电压;
将485从发送切换 ...

我试试,先谢谢大神
人之颠 回答时间:2015-7-16 14:59:00
cenzmin 发表于 2015-7-16 13:16
A、B线的电容,应该是A、B间一个,A、B分别对地各一个

我试了一下,波形没问题,就是发现单片机在一个发送周期内,自己连续发了两个字节,一个是我要发送的一个字节,一个是多出的那个0,但是我的程序写的就是发送一个字节,神马情况啊这是
qwb 回答时间:2018-8-31 11:15:03
楼主你好,这个问题最后解决了吗。我这边也是用软件使能,电路跟你的也差不多,
也遇到了这个问题。
小耳朵1500922649 回答时间:2018-8-31 13:52:17

485

485

同样使用MAX3430,STM32L0,通讯正常。
jyl_518 回答时间:2018-8-31 14:13:11
发送程序问题可能性较大。
星辰夢 回答时间:2018-8-31 14:18:37
11楼电路比较好,A/B线加上下拉电阻
qwb 回答时间:2018-8-31 14:39:31
小耳朵1500922649 发表于 2018-8-31 13:52
同样使用MAX3430,STM32L0,通讯正常。

那请问下,软件上是怎么写的?
我这边就是开发送时能,发送数据,判断传输完成之后开接收时能。485会收到一个‘0’,但我并没给485这边发东西
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版