开发板串口复用的简单实现(一个串口连接二个串口模块)

开发板串口复用的简单实现(一个串口连接二个串口模块)

ARM开发板在做项目时,串口不够用了打算进行串口复用。一开始准备进行如下的原理图连接:
在这里插入图片描述
  但是不可采用这种方法进行直接连接。这种情况下开发板发送的数据P1与P2都可以收到,但是P1、P2发给开发板的数据可能不会被正常接收,因为P1、P2的T脚可能会相互影响,使开发板的R脚收到错误的数据。
  我加了一个继电器进行控制,解决了上面的引脚的影响问题。先简单介绍一下继电器的原理。
在这里插入图片描述
  控制引脚输入高低电平控制COM端的连接状态。列如:控制引脚为0,COM端和A连接;控制引脚为1,COM端和B进行连接。
  结合继电器得到如下的连接原理图:
在这里插入图片描述
  通过开发板的一个引脚控制继电器,可以选择要进行通信的串口模块,这样开发板就可以正确接收到串口模块发来的消息了。
特别注意:实际连接中继电器要和开发板共地。

  • 14
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,以下是使用STM32F407开发板采集电压并通过串口输出的程序。在本程序中,我们使用了ADC1通道0来采集电压,并将采集到的电压值通过USART2串口输出到PC机上。 ```c #include "stm32f4xx.h" #include "stdio.h" #define ADC1_DR_ADDRESS ((uint32_t)0x4001204C) void USART2_Init(void); void ADC1_Init(void); int main(void) { USART2_Init(); ADC1_Init(); float voltage; while (1) { //启动ADC转换 ADC_SoftwareStartConv(ADC1); //等待转换完成 while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //读取ADC值并计算电压值 uint16_t adc_value = ADC_GetConversionValue(ADC1); voltage = (3.3 * adc_value) / 4096; //将电压值通过串口输出到PC机上 char buffer[50]; sprintf(buffer, "Voltage is %.2f V\r\n", voltage); USART_SendString(USART2, buffer); //延时一段时间 for (int i = 0; i < 1000000; i++); } } void USART2_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; //使能GPIOA和USART2时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //初始化GPIOA2和GPIOA3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA2和PA3引脚复用为USART的TX和RX引脚 GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); //USART2初始化配置 USART_InitStructure.USART_BaudRate = 115200; 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_Tx | USART_Mode_Rx; USART_Init(USART2, &USART_InitStructure); //使能USART2 USART_Cmd(USART2, ENABLE); } void ADC1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; //使能GPIOA和ADC1时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //初始化GPIOA0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); //ADC1初始化配置 ADC_CommonInitTypeDef ADC_CommonInitStructure; ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStructure); //配置ADC1通道0 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_15Cycles); //使能ADC1 ADC_Cmd(ADC1, ENABLE); } ``` 在本程序中,我们使用了USART2串口进行输出。在初始化时,我们将PA2和PA3引脚复用为USART的TX和RX引脚,并使用115200波特率进行通信。 在ADC1初始化时,我们使用了ADC1通道0进行采集,并将采样时间设置为15个时钟周期。在主循环中,我们启动ADC转换,并等待转换完成。之后,我们读取ADC值并计算出电压值,并通过串口输出到PC机上。 为了防止串口输出过快导致数据溢出,我们在输出完一次电压值后进行了一段短暂的延时。 注意:本程序只是一个简单的示例,实际使用中需要根据具体情况进行修改。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值