中级会员
 
- 积分
- 261
- 金钱
- 261
- 注册时间
- 2015-10-8
- 在线时间
- 36 小时
|
STM32利用两个串口通信,串口1通过RS422只接受电脑发送的数据(是中断接受),串口2通过RS422与触摸屏通信(接受数据时也是中断接受),当串口1和串口2同时工作时,串口1接受的数据帧有时候会丢失字节。
下面是两个中断的函数:
u8 RS_485_RECEIVE(u8 * temp,u8 n);
void RS485_SHUCHU(void);
extern u8 temp_value[12];
extern u8 flag_num;
extern u8 xianshi_shuchu;
extern u8 flag_num1;
u16 temp_test;
void USART1_IRQHandler(void)
{
u8 temp,temp1,temp2;
USART1->CR1&=0XFFFFFFDF;
if (USART1->SR&0x00000020)
{
temp=USART1->DR;
if(temp==0x41)
{
flag_num=0;
temp_value[flag_num]=temp;
while (USART1->SR&0x00000020);
temp_test=0xffff;
while ((temp_test!=0)&&(temp_value[flag_num]!=0x42))
{
if (USART1->SR&0x00000020)
{
flag_num++;
temp_value[flag_num]=USART1->DR;
while (USART1->SR&0x00000020);
}
temp_test--;
}
if (temp_value[flag_num]==0x42)
{
if (temp_value[1]!=0x31&&temp_value[1]!=0x32&&temp_value[1]!=0x33&&temp_value[1]!=0x34&&temp_value[1]!=0x35)
asm("nop");
xianshi_shuchu=RS_485_RECEIVE(temp_value,flag_num+1);
flag_num1++;
if (flag_num1>10)
flag_num1=1;
}
}
}
temp1=USART1->SR;
temp2=USART1->DR;
temp_value[0]=0;temp_value[1]=0;temp_value[2]=0;temp_value[3]=0;
USART1->CR1|=0X00000020;
}
void USART2_IRQHandler(void)
{
u8 temp1=0,temp2=0;
LEDCLOSE=!LEDCLOSE;
if (USART2->SR&0x00000020)
{
asm("nop");
u8 RS485_2;
RS485_2=USART2->DR;
if (RS485_2==0x10)
RS485_SHUCHU();
}
temp1=USART2->SR;
temp2=USART2->DR;
}
请求各位大神的帮助
|
|