搞定485通讯
程序员文章站
2022-06-04 12:53:48
...
准备一:实物连接图,两线连通,USB接PC
准备二:485通讯实际测试时发现:MCU引出的 A B线和PC接反了,
也是有数据的 不过全部是乱码,所以不要慌,交换就对头了。
准备三:原理图
准备四:参考埃士GEEK的电表
485需要3根线:
A
B
ENABLE --据说可以放弃,在电路中加一个三极管。
硬件原理如下,用STM32的USART2
初始化:A B
void Ammeter_Init(void)
{
USART_Config(2, 9600, USART_WordLength_8b, USART_Parity_No, 2, 0, ENABLE, DISABLE);
}
就是给串口2的配置,GEEK在串口3做了影射。我现在tsl修改过来。
初始化:ENABLE
void RS485_En_Init(void)
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
此后就可以收发了。
void SendEMMsgs(u8 *Msg, u8 Len)
{
OSTimeDlyHMSM(0, 0, 0, 300);
USART_GetFlagStatus(EM_UART_PORT,USART_FLAG_TC);
if(Len)
{
USART2_EN_ON();//----------------------------------------------
USART_SendData(EM_UART_PORT, 0xFE);
while(USART_GetFlagStatus(EM_UART_PORT, USART_FLAG_TC)==RESET)
;
USART_SendData(EM_UART_PORT, 0xFE);
while(USART_GetFlagStatus(EM_UART_PORT, USART_FLAG_TC)==RESET)
;
USART_SendData(EM_UART_PORT, 0xFE);
while(USART_GetFlagStatus(EM_UART_PORT, USART_FLAG_TC)==RESET)
;
USART_SendData(EM_UART_PORT, 0xFE);
while(USART_GetFlagStatus(EM_UART_PORT, USART_FLAG_TC)==RESET)
;
while(Len--)
{
USART_SendData(EM_UART_PORT, *(Msg++));
while(USART_GetFlagStatus(EM_UART_PORT, USART_FLAG_TC)==RESET);
}
if(MsgTimeoutCnt<255)
{
MsgTimeoutCnt++;
}
USART2_EN_OFF();//-----------------------------------------------
}
}
上面就是发送消息代码。
控制脚拉高---开始发送直到发送完毕---控制脚拉低-----其实一般控制脚是低电平(要发的时候拉起来)也就是处在等待接收状态
现在我遇到的问题:http://www.openedv.com/forum.php?mod=viewthread&tid=276891&extra=
我485是OK的,发送完毕以后,控制脚一拉下来,见鬼了,LCD显示没有了。呵呵。
我必须一直保持控制脚是高电平。
实际测试也是的,我一直可以发送出去MCU到PC,但是不拉低的话就不能接受PC发来的消息
上一篇: 网站国际化多语言版本怎么做啊?
下一篇: 字典树