初级会员

- 积分
- 64
- 金钱
- 64
- 注册时间
- 2019-10-21
- 在线时间
- 8 小时
|
5金钱
要实现一个串口通信功能,流程为监听UART3是否有数据传过来(接收中断),若有则在中断处理中对UART3接收标志位置1,此时对接收到的数据进行处理以获得缓存数组,然后将该缓存数组通过UART2(发送中断)发送出来,此时实时监听是否获取到UART2的串口数据,若有则将获取到的数据通过UART3发送出来(发送中断)。其中UART2作为485串口通信。
现在的情况是,UART3能够正常收到串口数据,并执行到UART2的发送步骤,但UART2在发送过程中:1、发送数据不全,例如设置要发送8字节的缓存数组,实际只发送了2字节的数据;2、只能对第一次接收的数据进行转换发送,后续接收到的数据都不能再发送,我怀疑是有其他中断打断了UART2的发送过程。下面是主要代码:
代码主体是通过CUBEMX自动生成的,包括HAL_Init();、SystemClock_Config();、MX_GPIO_Init();,以及正点原子的相关初始化程序delay_init(180);、KEY_Init();、RS485Init(); 我对RS485Init()进行了调整,以符合实际情况:
void RS485Init(void)
{
PCF8574_Init(); //初始化PCF8574,用于控制RE脚
MX_USART2_UART_Init(); //初始化USART2
MX_USART3_UART_Init(); //初始化USART3
RS485_MODE_Set(0); //设置为接收模式
}
然后在进入死循环前,调用HAL_UART_Receive_IT(&huart3,Rx_Buf2,8);以开启UART3的接收中断。
下面进入死循环(只把U3-U2部分的内容放出来):
while (1)
{
if(rx_flag_U3) //UART3收到信息标志,在接收中断回调函数中置1
{
uart_U3toU2(Rx_Buf2);
HAL_UART_Receive_IT(&huart3,Rx_Buf2,8);
}
}
void uart_U3toU2(uint8_t *pData)
{
if(pData[0] == 0x0A)
{
for(i=0;i<4;i++)
{
trans_buffer[0]=slav_num[i];
trans_buffer[1]=pData[1];
trans_buffer[2]=pData[2];
trans_buffer[3]=pData[3];
trans_buffer[4]=0x00;
trans_buffer[5]=0x02;
CRC_value = CRC_Chek((uint8_t*)&trans_buffer,6); //计算CRC值
trans_buffer[6]=(uint8_t)CRC_value; //CRC高8位
trans_buffer[7]=(uint8_t)(CRC_value>>8);
delay_ms(10);
RS485_MODE_Set(1); //设置为发送模式
HAL_UART_Transmit_IT(&huart2,trans_buffer,8); //串口2发送数据
while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET); //等待发送完成
RS485_MODE_Set(0); //设置为接收模式
BEEP();
HAL_UART_Receive_IT(&huart2,Rx_Buf1,9); //串口2接收使能,接收长度为9字节
delay_ms(10); //延时10ms作为结束
}
for(j=0;j<50;j++){trans_buffer[j]=0;pData[j]=0;}
}
}
我这边UART3以100ms的间隔时间持续不断发送14帧串口数据过来,每2s循环一次,例如以100ms的间隔时间发送14帧“0A 01 03 04 00 00 00 00”,每2s重复发送上述14帧数据。
STM32这边监控到每帧数据都能够被接收到,但只有接收到的第一帧数据能够进入上述数据转换/发送的程序(即蜂鸣器会响4次),之后的所有数据都无法发送出去,但能听到蜂鸣器有声音但声音很微弱的响声,应该是执行了上述转换/发送程序的,但是问题来了:
1、串口软件监控显示,第一帧发出来的数据全都不正常,例如为“01 01 FB” “02 01 FB” “03 01 FB” “04 01 FB”;
2、后续就再也没有数据发送出来了,即实际没有执行数据发送函数????
请各位大神帮我看下啊,哪里有问题,谢谢了!!!
|
|