使用485串口通信时,有时候有乱码,有时候就没乱码

下面是代码部分部分

//主函数部分
int main(void)
{
	GPIOInit();//GPIO初始化
	USART3_Init();
	USART_PutStr(USART3, "program haven be load\r\n");
	delay_s(1);
	while(1)
	{
		test1();
}
//测试代码部分
void test1(void)
{
	unsigned char buf[5];
	delay_s(1);//原始
	uart3_Read(buf, sizeof(buf));
		
	USART_PutStr(USART3, buf );

	if( strcmp((const char *)buf, u19) == 0)
	{
		GPIO_SetBits(GPIOC, GPIO_Pin_11);
	}
	else if( strcmp((const char *)buf, d19) == 0)
	{
		GPIO_ResetBits(GPIOC, GPIO_Pin_11);
	}
	else if( strcmp((const char *)buf, u20) == 0)
	{
		GPIO_SetBits(GPIOC, GPIO_Pin_10);
	}
	else if( strcmp((const char *)buf, d20) == 0)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_11);
	}
	
	memset(buf, 0, sizeof(buf));
}
//缓冲区结构体以及中断服务函数部分
#define GET_TESTFLAG (test_flag) 
static volatile struct _uart3_param_tag{
	unsigned char head;
	unsigned char rear;
	char buffer[UART3_MAXBUFLEN+1];
}g_uart3_param;

void USART3_IRQHandler(void)
{	
	//digitalLo(IO_OUT1_GPIO_Port,IO_OUT1_Pin);
	unsigned char Res;
	unsigned char ResFlag;
	if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET)
	{
		USART_ReceiveData(USART3);
		USART_ClearFlag(USART3, USART_FLAG_ORE);
	}
	if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET)
	{
		USART_ClearITPendingBit(USART3,USART_IT_RXNE);
		
		Res=USART_ReceiveData(USART3);
		
		if( (g_uart3_param.head+1) % UART3_MAXBUFLEN == g_uart3_param.rear )
		{
		}
		else
		{
			g_uart3_param.buffer[g_uart3_param.head] = Res;
			g_uart3_param.head++;
			if(g_uart3_param.head >= UART3_MAXBUFLEN)
			{
				//g_uart3_param.buffer[g_uart3_param.head] = '\0';
				g_uart3_param.head = 0;
			}
		}
	}
}
//从串口缓存队列中读取数据
unsigned char uart3_Read(void *vbuf,unsigned char len)
{
	unsigned char i = 0;
	char *buf = (char *)vbuf;
	for(i=0; i<len; i++)
	{
		if(g_uart3_param.rear == g_uart3_param.head)
		{
			break;
		}
		buf[i] = g_uart3_param.buffer[g_uart3_param.rear];
		g_uart3_param.rear ++;
		if(g_uart3_param.rear >= UART3_MAXBUFLEN)
			g_uart3_param.rear = 0;
		__nop();	
	}
	return i;
}
//单片机向串口调试助手发数据
void USART_PutChar(USART_TypeDef* USARTx, uint16_t Data)  
{  
	GPIO_SetBits(GPIOD, DE_Pin);//设置高电平
	delay_ms(1);
  USART_GetFlagStatus(USARTx, USART_FLAG_TC); //避免第一次发送数据的时候丢失首字节的错误
  USART_SendData(USARTx, Data);  
  while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET){}  
	GPIO_ResetBits(GPIOD, DE_Pin);//设置低电平
	delay_ms(1);
}  

void USART_PutStr(USART_TypeDef* USARTx, char *str) 
{
	
	unsigned int i = 0;
	while(*str != '\0' && i < 500)
	{
		USART_PutChar(USARTx, *str++); 
		i++;
	}
	
}

结果时不时出现乱码,但是又时候可以点灯灭灯,有时候不行
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值