完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我现在也能接收,就是一共20多个字符,只能接收前5个,后面接收不到
|
|
|
|
谢谢了
|
|
|
|
别在串口1的接收中断里处理串口2的发送
|
|
|
|
接收不完全就要用仿真器仿真下你保存数据的数组或者变量啥的,看是不是串口1接收正常,接收正常的话再去判断发送到串口2的数据是不是给你串口1接收的数据一致
|
|
|
|
串口1接收到的数据放在一个缓冲区里,串口2定时检测这个缓冲区是否为空,非空就发送
|
|
|
|
我这有个DMA传输的实际工程程序,你参考一下,将USART1_TX的关联参数改到USART2_TX就能运行的
u8 usart_tx_data[18]; //发送寄存器 u8 usart_rx_data[18]; //接收寄存器 void usart_tx_rx_init(void) { usart_io_lever_init(); //USART_DeInit(USART1); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//最高输出速率50MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化外设GPIOx寄存器 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//最高输出速率10MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化外设GPIOx寄存器 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600;//波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据 USART_InitStructure.USART_StopBits = USART_StopBits_1;//在帧结尾传输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(USART1,&USART_InitStructure); USART_Cmd(USART1, ENABLE);//使能或者失能USART外设 } void usart_tx_rx_dma_init(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); //usart_dma_tx 部分INIT DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(USART1->DR);//(USART1_BASE + 0X04);//外设基地址 (u32)&(USART1->DR); DMA_InitStructure.DMA_MemoryBaseAddr = (u32)usart_tx_data;//内存基地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外设作为数据传输的来源 DMA_InitStructure.DMA_BufferSize = 18;//指定DMA通道的DMA缓存的大小,单位为数据单位 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址寄存器不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址寄存器递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//数据宽度为8位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//数据宽度为8位 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//工作在正常模式. DMA_InitStructure.DMA_Priority = DMA_Priority_Low;//非常高优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//非内存到内存传输 DMA_Init(DMA1_Channel4, &DMA_InitStructure);//初始化外设CAN的寄存器 USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); //发送USART1 发送请求 DMA_SetCurrDataCounter(DMA1_Channel4,18);//从新设置缓冲大小,指向数组0 //DMA_Cmd(DMA1_Channel4,ENABLE);//使能或者失能指定的通道x(DMA1 通道4) //android TX DMA 中断配置 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); //usart_dma_RX 部分INIT //DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(USART1->DR);//(USART1_BASE + 0X04);//外设基地址 (u32)&(USART1->DR); DMA_InitStructure.DMA_MemoryBaseAddr = (u32)usart_rx_data;//内存基地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//内存作为数据传输的来源 DMA_InitStructure.DMA_BufferSize = 18;//指定DMA通道的DMA缓存的大小,单位为数据单位 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址寄存器不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址寄存器递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//数据宽度为8位 DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;//数据宽度为8位 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//工作在正常模式. DMA_InitStructure.DMA_Priority = DMA_Priority_Low;//非常高优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//非内存到内存传输 DMA_Init(DMA1_Channel5, &DMA_InitStructure);//初始化外设DMA的寄存器 USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE); //发送USART1 发送请求 DMA_SetCurrDataCounter(DMA1_Channel5,18);//从新设置缓冲大小,指向数组0 DMA_Cmd(DMA1_Channel5,ENABLE);//使能或者失能指定的通道x(DMA1 通道4) //android RX DMA 中断配置 //NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE); } /* DMA_USART1 TX 传输完成中断服务函数 */ void DMA1_Channel4_IRQHandler(void) { if(DMA_GetITStatus(DMA1_FLAG_TC4)) /* 获取 DMA_USART1传输完成中断标志 */ { DMA_Cmd(DMA1_Channel4, DISABLE); /* 失能 DMA_USART1 */ DMA_ClearITPendingBit(DMA1_IT_GL4); /* 清除 DMA_USART1 传输完成中断标志位,否则程序会无限陷入中断 */ DMA_SetCurrDataCounter(DMA1_Channel4,18);//从新设置缓冲大小,指向数组0 //DMA_Cmd(DMA1_Channel4, ENABLE); /* 重新使能 DMA_USART1 */ //不能加以上这句,不然它会连续发送. } } /* DMA_USART1 RX 传输完成中断服务函数 */ void DMA1_Channel5_IRQHandler(void) { if(DMA_GetITStatus(DMA1_FLAG_TC5)) /* 获取 DMA_USART1传输完成中断标志 */ { DMA_Cmd(DMA1_Channel5, DISABLE); /* 失能 DMA_USART1 */ DMA_ClearITPendingBit(DMA1_IT_GL5); /* 清除 DMA_USART1 传输完成中断标志位,否则程序会无限陷入中断 */ DMA_SetCurrDataCounter(DMA1_Channel5,18);//从新设置缓冲大小,指向数组0 DMA_Cmd(DMA1_Channel5, ENABLE); /* 重新使能 DMA_USART1 */ //接收的可以加以上这句,随时准备接收. } } 具体自己理解,反正我这是正常的程序,一次要连续发18个字节数据,当然你可改为你想要的数量字节 |
|
|
|
只有小组成员才能发言,加入小组>>
请问下图大疆lightbridge2遥控器主板电源芯片型号是什么?
4466 浏览 1 评论
使用常见的二极管、三极管和mos做MCU和模组的电平转换电路,但是模组和MCU无法正常通信,为什么?
341浏览 2评论
为了提高USIM卡电路的可靠性和稳定性,在电路设计中须注意的点有哪些?
342浏览 2评论
368浏览 2评论
362浏览 2评论
407浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 16:53 , Processed in 1.144529 second(s), Total 89, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号