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

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

[复制链接]
人之颠 提问时间:2015-7-16 09:37 /
阅读主题, 点击返回1楼
收藏 评论21 发布时间:2015-7-16 09:37
21个回答
小耳朵1500922649 回答时间:2018-8-31 13:52:17

485

485

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

那请问下,软件上是怎么写的?
我这边就是开发送时能,发送数据,判断传输完成之后开接收时能。485会收到一个‘0’,但我并没给485这边发东西
小耳朵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函数即可
小耳朵1500922649 回答时间:2018-8-31 17:09:41
跳过MAX3430的485通讯,直接串口调试,先确保串口收发正常
小耳朵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函数即可
qwb736727429 回答时间:2018-8-31 18:06:25
小耳朵1500922649 发表于 2018-8-31 17:11
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */

好的,谢谢,程序差不多一样的。我电路图RN、EN本来是分开用两个IO控制的。看了你的电路,把他们并在一起,用一个IO口控制。现在可以了
Ich_Sun 回答时间:2018-9-1 10:10:17
本帖最后由 Ich_Sun 于 2018-9-1 11:25 编辑

问题解决了
huzhongadd 回答时间:2018-11-4 10:40:47

你好,请问怎么解决的呀? 我也碰到相同问题

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版