串口调试汇总

单片机串口调试汇总

最近因为一个简单的单片机对PC的232串口调试,硬是折腾了我两天时间,问题是千奇百怪,为了以后自己不再在这里耽误时间,汇总问题引以为戒。

1、电路图

在这里插入图片描述
在这里插入图片描述
电容选择一般104(100nf)够用,若发现波形干扰、数据丢失现象,可加大至105(1uf)甚至106(10uf)都是可以的。

2、DB9接头,公头和母头,引脚顺序是不一样的

在这里插入图片描述
母头:泛指所有插槽式的接头(5针朝上,从右到左依次是1~9
公头:泛指所有针式的接头(5针朝上,从左到右依次是1~9

公头和母头只是引脚顺序不一样,但是引脚定义都是一样的,引脚定义如下
在这里插入图片描述

开始在电路板上焊的是DB9母头,然后使用USB转串口调试。而我电路板上的引脚顺序是按照DB9公头设计的,因此引脚完全对不上,更不用说联调了!!!

3、MAX232 芯片好坏的判断

(1)MAX3232和MAX232的区别:前者是3.3V供电,后者是5V供电,其余一样
(2)先测量16脚,电压为5V正常,否则检查供电部分电路
测量2脚电压是否在 7V ~12V之间,否则更换芯片
测量6叫电压是否在-7V ~ -12V之间,否则更换芯片
因为在拆DB9的时候,不小心将供电引脚5V的导线弄断了,导致芯片根本就没有供电,换了好多个MAX232芯片后才发现问题 !_!

4、STM32F373 串口源码

void USART1_Init(u32 BaudRate)
{
    GPIO_InitTypeDef   GPIO_InitStructure;
  	USART_InitTypeDef  USART_InitStructure;
	NVIC_InitTypeDef   NVIC_InitStructure;
  
  	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  	GPIO_DeInit(GPIOA);

  	//串口1对应引脚复用映射
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_7); //GPIOA9复用为USART1
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_7); //GPIOA10复用为USART1
	
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9 | GPIO_Pin_10;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  	GPIO_Init(GPIOA, &GPIO_InitStructure); 
  	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    
	NVIC_Init(&NVIC_InitStructure);
	
	USART_DeInit(USART1);
  	USART_InitStructure.USART_BaudRate   = BaudRate;
  	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  	USART_InitStructure.USART_StopBits   = USART_StopBits_1;
  	USART_InitStructure.USART_Parity 	 = USART_Parity_No;
  	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; 
  	USART_Init(USART1, &USART_InitStructure);
	USART_ClearFlag(USART1, USART_FLAG_TC);
	 /* USART enable */
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	USART_Cmd(USART1, ENABLE);
}

void USART_SendToPC(u8 *data, u8 n)
{
	u8 i = 0;
	for(i = 0; i < n; i++)
    {
        USART_ClearFlag(USART1, USART_FLAG_TC);		
        USART_SendData(USART1, data[i]);
		while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    }
}

void USART1_IRQHandler(void)
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        RxData_USART1[RxCount_USART1++] = USART_ReceiveData(USART1);
	}
    if(RxData_USART1[0] != 0xBB ||RxCount_USART1 > 10)
        RxCount_USART1 = 0x00;
	/* 检查 ORE(数据溢出) 标志 */
    if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) == SET) //打开RXNEIE,默认会同时打开RXNE和ORE中断。
    {   //必须第一时间清零RXNE,如没及时清零,下一帧数据过来时就会产生Overrun error!
        USART_ClearFlag(USART1, USART_FLAG_ORE);					 //错误就是ORE导致的。
        RxData_USART1[RxCount_USART1++] = USART_ReceiveData(USART1); //解决办法要清除ORE
    }
    if(RxCount_USART1 == (RxData_USART1[2] + 3))
    {
			if(RxData_USART1[0] == 0xBB && RxData_USART1[1] == 0xAA)
			{
				USART_DataHandler();
			}
			RxCount_USART1 = 0;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值