OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6606|回复: 9

想通过串口1接收数据,然后用串口2发送到调试助手里,希望大家给个思路

[复制链接]

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2018-3-26
在线时间
284 小时
发表于 2018-8-14 10:09:05 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
535
金钱
535
注册时间
2018-8-2
在线时间
54 小时
发表于 2018-8-14 10:42:48 | 显示全部楼层
你没说清楚需求,如果串口2发给调试助手不是要求那么实时的话,我觉得用定时检测发送的方式会不错,例如100ms检测一次是否有串口1接收到数据了,然后把该数据直接通过串口2发送
回复

使用道具 举报

109

主题

5556

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10449
金钱
10449
注册时间
2017-2-18
在线时间
1890 小时
发表于 2018-8-14 10:43:45 | 显示全部楼层
本帖最后由 peng1554 于 2018-8-14 10:45 编辑

有个代码可以参考下。串口1接收程序可以看图 ,另外一个图的程序是将串口3接收到的数据发送到串口1。你那要修改下,改为串口1的数据发送到串口2
串口1接收可以参考的程序.png
串口3的数据发送到串口1.png

(库函数版本,适合战舰V3和精英STM32开发板)扩展实验16 ATK-S1216F8 GPS模块实验.rar

398.26 KB, 下载次数: 70

回复

使用道具 举报

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2018-3-26
在线时间
284 小时
 楼主| 发表于 2018-8-14 10:56:12 | 显示全部楼层
tgw860910 发表于 2018-8-14 10:42
你没说清楚需求,如果串口2发给调试助手不是要求那么实时的话,我觉得用定时检测发送的方式会不错,例如100 ...

我现在也能接收,就是一共20多个字符,只能接收前5个,后面接收不到
回复

使用道具 举报

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2018-3-26
在线时间
284 小时
 楼主| 发表于 2018-8-14 10:56:24 | 显示全部楼层
peng1554 发表于 2018-8-14 10:43
有个代码可以参考下。串口1接收程序可以看图 ,另外一个图的程序是将串口3接收到的数据发送到串口1。你那要 ...

谢谢了
回复

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
535
金钱
535
注册时间
2018-8-2
在线时间
54 小时
发表于 2018-8-14 10:58:34 | 显示全部楼层
支持者2400 发表于 2018-8-14 10:56
我现在也能接收,就是一共20多个字符,只能接收前5个,后面接收不到

别在串口1的接收中断里处理串口2的发送
回复

使用道具 举报

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2018-3-26
在线时间
284 小时
 楼主| 发表于 2018-8-14 10:59:41 | 显示全部楼层
tgw860910 发表于 2018-8-14 10:58
别在串口1的接收中断里处理串口2的发送

我就是这么做的,结果接收不完全,您能指导下吗,最好能有一个代码例子
回复

使用道具 举报

109

主题

5556

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10449
金钱
10449
注册时间
2017-2-18
在线时间
1890 小时
发表于 2018-8-14 11:13:29 | 显示全部楼层
支持者2400 发表于 2018-8-14 10:59
我就是这么做的,结果接收不完全,您能指导下吗,最好能有一个代码例子

接收不完全就要用仿真器仿真下你保存数据的数组或者变量啥的,看是不是串口1接收正常,接收正常的话再去判断发送到串口2的数据是不是给你串口1接收的数据一致
回复

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
535
金钱
535
注册时间
2018-8-2
在线时间
54 小时
发表于 2018-8-14 11:42:48 | 显示全部楼层
支持者2400 发表于 2018-8-14 10:59
我就是这么做的,结果接收不完全,您能指导下吗,最好能有一个代码例子

串口1接收到的数据放在一个缓冲区里,串口2定时检测这个缓冲区是否为空,非空就发送
回复

使用道具 举报

2

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2017-8-20
在线时间
49 小时
发表于 2018-8-17 18:26:06 | 显示全部楼层
我这有个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个字节数据,当然你可改为你想要的数量字节
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-10 08:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表