运用STM32做为操控器,板上要求有4个485接口,一个232接口,当232有数据抵达时,按条件转发给485,当485有数据抵达时,无条件转给232
刚开始编写代码时,因为对485运用不熟悉,不知道该留意哪些,就直接编写程序:
1.装备管脚,这儿管脚装备232与485是相同的,但485要用一个管脚的凹凸电平操控输入输出方向,这儿运用运用4个管脚对串口2–串口4操控
2.中止装备,每个串口给与翻开对应的中止线,并给与必定的优先级
3.串口装备,这儿包括时钟、波特率、8N1等,并挑选运用的中止事情,这儿一切串口都选用接纳中止
232装备和485装备是相同的,无非485是半双工的,需求操控方向,还有一个特别留意的当地,也是我记载这个文档的原因:
因为硬件是我手艺制造,不确定所用串口都能运用,所以运用循环输出测验是否到pc的串口帮手,测验成果发现程序一向会进入
输入中止,没错是输入中止,发送数据进入输入中止,后经细心研讨发现问题,代码如下:
主函数
int main(void)
{
u8 cmd = 0xaa;
//装备进程不写了
while(1)
{
serial3_putchar(cmd);
}
}
串口接纳中止我已翻开,这儿不写了
串口3发送字节函数
void Serial3PutChar(u8 c)
{
int i;
MAX485EN3(); //485输出操控 GPIO_SetBits(GPIOE, GPIO_Pin_15)
USART_SendData(USART3, c);
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
MAX485RE3(); //485输入操控 GPIO_ResetBits(GPIOE, GPIO_Pin_15)
}
串口中止服务子程序
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
Serial1PutChar(Serial3GetChar()); //串口1发送串口2接纳到的数据
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
}
后来通过自己查找资料及重复思量,发现问题是485发送数据的时刻不行,后经修正波特率为9600,输入中止不再发生,
但发送数据与接纳到的数据不相同,后在发送函数内加了必定时刻延时,方可!
void Serial3PutChar(u8 c)
{
int i;
MAX485EN3(); //485输出操控 GPIO_SetBits(GPIOE, GPIO_Pin_15)
delay_mS(1);
USART_SendData(USART3, c);
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
delay_mS(10);
MAX485RE3(); //485输入操控 GPIO_ResetBits(GPIOE, GPIO_Pin_15)
}