完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用STM32G030接收和发送RS485的数据,发送数据正常,接收数据时串口能进中断,但数据不正确(RXD和TXD外部都有上拉电阻10K)。使用USB转串口设备RXD脚接到MCU的RXD口(TTL电平),USB转串口设备能接收正确数据,看有没哪位高手帮忙分析下,代码如下:
void USART1_IRQHandler(void) { u8 UartData; if( LL_USART_IsActiveFlag_RXNE(USART1) == RESET ) //未检测到串口中断 return; UartData=LL_USART_ReceiveData8(USART1); //读取数据 LL_USART_RequestRxDataFlush(USART1); USART1_SendByte(UartData); if( (UartData==0x88)||(UartData==0x99)||(UartData==0xAA)||(UartData==0xBB)||(UartData==0xCC)) LL_GPIO_TogglePin(MCU_RUN_LED_GPIO_Port,MCU_RUN_LED_Pin); } void MX_USART1_UART_Init(void) { LL_USART_InitTypeDef USART_InitStruct = {0}; LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; /* Peripheral clock enable */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); GPIO_InitStruct.Pin = RS485_CTRL_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; LL_GPIO_Init(RS485_CTRL_GPIO_Port, GPIO_InitStruct); LL_GPIO_ResetOutputPin(RS485_CTRL_GPIO_Port,RS485_CTRL_Pin); /***** USART1 GPIO Configuration ******************* PA9 ------> USART1_TX PA10 ------> USART1_RX ******************************************************/ LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); GPIO_InitStruct.Pin = Usart1_TXD_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Alternate = LL_GPIO_AF_1; LL_GPIO_Init(Usart1_TXD_GPIO_Port, GPIO_InitStruct); LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); GPIO_InitStruct.Pin = Usart1_RXD_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Alternate = LL_GPIO_AF_1; LL_GPIO_Init(Usart1_RXD_GPIO_Port, GPIO_InitStruct); /* USART1 interrupt Init */ NVIC_SetPriority(USART1_IRQn, 1); NVIC_EnableIRQ(USART1_IRQn); USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1; USART_InitStruct.BaudRate = BAUDRATE; USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; USART_InitStruct.StopBits = LL_USART_STOPBITS_1; USART_InitStruct.Parity = LL_USART_PARITY_NONE; USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE; USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; LL_USART_Init(USART1, USART_InitStruct); LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8); LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8); LL_USART_DisableFIFO(USART1); //LL_USART_EnableFIFO(USART1); LL_USART_ConfigAsyncMode(USART1); LL_USART_Enable(USART1); LL_USART_EnableIT_RXNE(USART1); LL_USART_EnableIT_PE(USART1); /* Polling USART1 initialisation */ while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1)))) { } } void USART1_SendByte(u8 newData) { LL_GPIO_SetOutputPin (RS485_CTRL_GPIO_Port,RS485_CTRL_Pin); while( LL_USART_IsActiveFlag_TC(USART1)==0 ); //等待串口旧数据发送完成 LL_USART_TransmitData8(USART1,newData); //数据从串口发送出去 while( LL_USART_IsActiveFlag_TC(USART1)==0 ); //等待串口旧数据发送完成 LL_GPIO_ResetOutputPin(RS485_CTRL_GPIO_Port,RS485_CTRL_Pin); } |
|
相关推荐
2个回答
|
|
直接使用UART能接收么?如果可以的话则很可能是RS485电平转换模块的问题。
|
|
|
|
根据你提供的代码和描述,可能出现以下原因导致接收数据错误:
1. USART配置错误:请确认USART的配置是否正确,包括波特率、数据位、校验位等设置。确保与发送设备的设置一致。 2. 中断处理错误:请检查中断处理函数中的代码是否正确,包括正确处理接收到的数据,清除接收中断标志位等。 3. 信号电平问题:请确认RS485通信的电平是否正确。根据你提供的描述,RXD和TXD外部都有上拉电阻10K,但可能需要更多的电平转换电路才能正确处理RS485的信号电平差异。 4. 线路连接问题:请检查RS485通信线路的连接是否正确,包括信号线和地线的连接。 在检查上述问题时,你可以通过以下方法逐步排除错误: 1. 将USART1的配置与发送设备的配置进行比较,确保一致。 2. 可以使用示波器或逻辑分析仪来检查接收线上的信号波形,确保信号线上的数据正确发送。 3. 抓取接收到的数据并打印输出,以验证接收是否正确。 你还可以尝试使用其他方式来验证接收数据的正确性,例如使用其他串口设备连接或简化代码来判断问题所在。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1641 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1562 浏览 1 评论
990 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
691 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1610 浏览 2 评论
1869浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
655浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
525浏览 3评论
541浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
514浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 15:57 , Processed in 1.010031 second(s), Total 85, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号