stm32 做rs485通信,MCU可以接收数据,但不能发数据?stm32 做rs485通信,MCU可以接收数据,但不能发数据

a_woxinfeiyang_a 2013-05-18 10:17:09
#include "stm32f10x_lib.h"
#include"delay.h"

/*
RS485_TX----PC10-----USART3_TX
RS485_RX---- PC11-----USART3_RX
RS485_DIR----PC12
*/
#define RS485_DIR_TX GPIO_SetBits(GPIOC, GPIO_Pin_12)
#define RS485_DIR_RX GPIO_ResetBits(GPIOC, GPIO_Pin_12)


void USART3_Configuration(void)
{
USART_InitTypeDef USART_InitStruct;
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);
//RS485_DIR--PC12
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出;
GPIO_Init(GPIOC, &GPIO_InitStructure);

//RS485_TX--PC10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);

//RS485_RX--PC11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);


USART_StructInit(&USART_InitStruct);//将结构体设置为缺省状态
USART_InitStruct.USART_BaudRate=9600;//波特率设置为9600
USART_InitStruct.USART_WordLength=USART_WordLength_8b;//一帧数据的宽度设置为8bits
USART_InitStruct.USART_StopBits=USART_StopBits_1;//在帧结尾传输1个停止位
USART_InitStruct.USART_Parity=USART_Parity_No;//奇偶失能模式,无奇偶校验
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制失能
USART_InitStruct.USART_Mode=USART_Mode_Tx |USART_Mode_Rx; //使能发送/接收使能
USART_Init(USART3, &USART_InitStruct);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//打开串口3接受中断
//USART_ITConfig(USART3, USART_IT_TXE, ENABLE);//打开串口1的中断响应函数
USART_Cmd(USART3, ENABLE);//打开USART1

USART_ClearFlag(USART1,USART_FLAG_TC);//清除发送完成标志位

RS485_DIR_RX;
}

void USART485_SendChar(u8 data)
{
RS485_DIR_TX;
delay_ms(1);
USART_SendData(USART3,data);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);
delay_ms(1);
RS485_DIR_RX;
}
程序及电路图截图如下:



...全文
1809 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_22251123 2014-11-05
  • 打赏
  • 举报
回复
能帮我,看个程序?qq 1034082432
hfutzhl 2014-07-13
  • 打赏
  • 举报
回复
我也遇到这个问题,采用TC标志位来判断就可以了。TC标识位表示串口数据发送完毕,TXE 标志位表示发送寄出器空,但移位寄存器并没有空。 当你速度比较快时,采用TXE是发不出数据的。
a_woxinfeiyang_a 2013-05-20
  • 打赏
  • 举报
回复
引用 1 楼 youzi722 的回复:
搞不懂你是串口1还是串口3啊,数据发到串口3上,你查串口1的状态干嘛呢 另外,这个也很好测吧,首先看程序,不行找个3用表或示波器从CPU往外倒
谢谢@youzi722的提示,我用的是USART3做RS485通信,上面是笔误。不过你提到的用示波器查是个好方法。现在MCU向PC发数据已经没问题了……继续调试其他部分。
a604771785 2013-05-19
  • 打赏
  • 举报
回复
我之前也遇到过,后来换了条通信线就可以了
youzi722 2013-05-18
  • 打赏
  • 举报
回复
搞不懂你是串口1还是串口3啊,数据发到串口3上,你查串口1的状态干嘛呢 另外,这个也很好测吧,首先看程序,不行找个3用表或示波器从CPU往外倒

27,511

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧