OpenEdv-开源电子网

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

串口DMA接收不定长数据+双缓存接收方案,移植非常方便,只需要9个字节就可以管理

[复制链接]

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
发表于 2016-7-6 09:44:20 | 显示全部楼层 |阅读模式
学习原子哥的板子已经两年了,现在也如愿以偿的做相关开发工作。在工作中也学习不少软件方案,上次看论坛里有个网友采用串口空闲中断及DMA接收串口不定长数据,感觉这个非常好用。特意花了点时间写好库,方便与大家交流学习。
一、结构体
[mw_shl_code=c,true]__packed typedef struct
{
        u32                              USARTX_Bound;          //波特率
        uint32_t                         USART_RCC      ;              //串口时钟时能
  USART_TypeDef *                  USARTX ;               //串口
        uint8_t                          USART_IRQChannel;      //串口中断线
        uint32_t                         GPIO_RCC_APB2;         //GPIO时钟时能
  GPIO_TypeDef  *                  GPIO_RX;               //GPIO RX端口
  uint16_t                         GPIO_RX_Pin;           //引脚
  GPIO_TypeDef  *                  GPIO_TX;               
  uint16_t                         GPIO_TX_Pin;
  DMA_Channel_TypeDef *            USART_RX_DMA_Channel;  //串口DMA接收通道
        uint8_t                          DMA_IRQChannel            ;      //DMA中断线
        uint32_t                         DMA_FLAG_TC               ;      //DMA传输完成标记      
}
USERT_Irregular_DMA_typ ;    //串口DMA接收不定长数据结构体[/mw_shl_code]

此结构体用于记录此方案所采用的IO、串口、DMA通道等,此结构体的数据一旦确定完成,建议不要改变,此结构体可以直接定义到FLASH中(用关键字 const)


[mw_shl_code=c,true]#define  USART_IrrG_DMA_BUFF_LEN        40   //双缓存大小   最大 65535
__packed typedef struct  
{
u8     RX_BUFF_Comple  : 2 ;   //接收完成标记 0 都没有接收完成   bit0 缓存0接收完成  bit1 缓存1接收完成
u8     RX_BUFF0_STA    : 1 ;   //0 空闲  1 接收完成      
u8     RX_BUFF1_STA    : 1 ;   //0 空闲  1 接收完成  
u8     RX_BUFF_Err     : 2 ;   //0 正常  1 缓存都接收满 未处理   
u8     RX_BUFF_Inx     : 2 ;          //当前正在接收的缓存索引
u16    RX_BUFF0_Size ;         //接收到的数据长度
u8     RX_BUFF0[USART_IrrG_DMA_BUFF_LEN] ;  //数据缓存
u16    RX_BUFF1_Size ;
u8     RX_BUFF1[USART_IrrG_DMA_BUFF_LEN] ;
const  USERT_Irregular_DMA_typ * USERT_Irregular_DMA  ;
}
USART_RX_BUFF;        [/mw_shl_code]

此结构体用于管理双缓存,并向上层提供双缓存当前状态。
宏 USART_IrrG_DMA_BUFF_LEN   用于设置双缓存长度


二、用户调用函数
此方案有三个函数需要用户调用,但不需要更改。
1、初始化
[mw_shl_code=c,true]void USART_DMA_Init(USART_RX_BUFF *USERT_RX_DMA)
{
  //GPIO端口设置
  GPIO_InitTypeDef      GPIO_InitStructure;
        USART_InitTypeDef     USART_InitStructure;
        NVIC_InitTypeDef      NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(USERT_RX_DMA->USERT_Irregular_DMA->GPIO_RCC_APB2, ENABLE);        //使能GPIO时钟
        if(USERT_RX_DMA->USERT_Irregular_DMA->USARTX == USART1)
        {
                RCC_APB2PeriphClockCmd(USERT_RX_DMA->USERT_Irregular_DMA->USART_RCC, ENABLE);          //使能串口1时钟
        }
        else
        {
                RCC_APB1PeriphClockCmd(USERT_RX_DMA->USERT_Irregular_DMA->USART_RCC, ENABLE);         //使能串口时钟
        }
  //USART_TX  
  GPIO_InitStructure.GPIO_Pin = USERT_RX_DMA->USERT_Irregular_DMA->GPIO_TX_Pin ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                   //复用推挽输出
  GPIO_Init(USERT_RX_DMA->USERT_Irregular_DMA->GPIO_TX, &GPIO_InitStructure);
   
//USART_RX         
  GPIO_InitStructure.GPIO_Pin = USERT_RX_DMA->USERT_Irregular_DMA->GPIO_RX_Pin;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;              //浮空输入
  GPIO_Init(USERT_RX_DMA->USERT_Irregular_DMA->GPIO_RX, &GPIO_InitStructure);  
       
        //Usart NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USERT_RX_DMA->USERT_Irregular_DMA->USART_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3      ; //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE         ; //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);                          //根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置
        USART_DeInit(USERT_RX_DMA->USERT_Irregular_DMA->USARTX);     //先复位串口
        USART_InitStructure.USART_BaudRate = USERT_RX_DMA->USERT_Irregular_DMA->USARTX_Bound;      //波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;      //字长为8位数据格式
        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(USERT_RX_DMA->USERT_Irregular_DMA->USARTX, &USART_InitStructure);           //初始化串口
        USART_ClearITPendingBit(USERT_RX_DMA->USERT_Irregular_DMA->USARTX, USART_IT_IDLE) ;    //清除空闲中断
  USART_ITConfig(USERT_RX_DMA->USERT_Irregular_DMA->USARTX, USART_IT_IDLE, ENABLE);      //开启空闲中断

//DMA 配置--------------------------------------------------------------------------------------------------
        USART_DMACmd(USERT_RX_DMA->USERT_Irregular_DMA->USARTX,USART_DMAReq_Rx,ENABLE);  //开启DMA接收       
        MY_USART_Iglr_DMA_CONFIG(USERT_RX_DMA);                                          //DMA配置    先由缓存0 接收
        USART_RX_DMA_START(USERT_RX_DMA);                                                //开启DMA
  USART_Cmd(USERT_RX_DMA->USERT_Irregular_DMA->USARTX, ENABLE);                                                                                                                               //使能串口
}[/mw_shl_code]

此函数是根据结构体指针变量  USERT_RX_DMA   的值 来初始化,其中包括时钟、串口、IO、DMA、中断等配置,无需修改,直接调用


2、串口中断函数
[mw_shl_code=c,true]void  USART_RX_DMA_USART_IRQ(USART_RX_BUFF * USERT_RX_DMA)   //必须在串口中断函数中调用
{
if(USART_GetITStatus(USERT_RX_DMA->USERT_Irregular_DMA->USARTX, USART_IT_IDLE) != RESET)   //如果空闲中断
{
         USERT_RX_DMA->USERT_Irregular_DMA->USARTX->DR ;  //空读一次
   USART_ClearFlag(USART1, USART_IT_IDLE);          //清除空闲中断标记
         
         //标记缓存接收完成--------------------------------------------------
   USERT_RX_DMA->RX_BUFF_Comple |= (0X01<<USERT_RX_DMA->RX_BUFF_Inx );  
         
         if( USERT_RX_DMA->RX_BUFF_Inx == 0)  //如果当前是第0个缓存接收
         {
                //得到缓存长度--------------------------
                USERT_RX_DMA->RX_BUFF0_Size = USART_IrrG_DMA_BUFF_LEN - DMA_GetCurrDataCounter(USERT_RX_DMA->USERT_Irregular_DMA->USART_RX_DMA_Channel);
                USERT_RX_DMA->RX_BUFF_Inx = 1 ;   //设置缓存1 接收数据
         }
         else if( USERT_RX_DMA->RX_BUFF_Inx == 1)
         {
                //得到缓存长度--------------------------
                USERT_RX_DMA->RX_BUFF1_Size = USART_IrrG_DMA_BUFF_LEN - DMA_GetCurrDataCounter(USERT_RX_DMA->USERT_Irregular_DMA->USART_RX_DMA_Channel);
                USERT_RX_DMA->RX_BUFF_Inx = 0 ;   //设置缓存1 接收数据       
         }
         
         if( USERT_RX_DMA->RX_BUFF_Comple == 0x03 )  //如果缓存0 缓存1 都接收满
         {
          USERT_RX_DMA->RX_BUFF_Err = 1 ;  //错误 缓存满标记
         }
         else   //正常   则开启 DMA接收
         {
                USART_RX_DMA_START(USERT_RX_DMA);  //开启DMA
         }
}   
}[/mw_shl_code]

此函数必须在对应的串口中断中调用,起作用是用于判断及设置双缓存状态及切换缓存。无需修改,直接调用。

3、DMA中断函数
[mw_shl_code=c,true]
void  USART_RX_DMA_DMA_IRQ(USART_RX_BUFF * USERT_RX_DMA)  //必须在DMA中断函数中调用
{
if( DMA_GetFlagStatus(USERT_RX_DMA->USERT_Irregular_DMA->DMA_FLAG_TC) != RESET)
{
         DMA_ClearFlag(USERT_RX_DMA->USERT_Irregular_DMA->DMA_FLAG_TC);  //清楚接收完成标记
         
         //标记缓存接收完成--------------------------------------------------         
   USERT_RX_DMA->RX_BUFF_Comple |= (0X01<<USERT_RX_DMA->RX_BUFF_Inx );  //标记缓存接收完成

         if( USERT_RX_DMA->RX_BUFF_Inx == 0)  //如果当前是第0个缓存接收
         {
                //得到缓存长度--------------------------
                USERT_RX_DMA->RX_BUFF0_Size = USART_IrrG_DMA_BUFF_LEN - DMA_GetCurrDataCounter(USERT_RX_DMA->USERT_Irregular_DMA->USART_RX_DMA_Channel);
                USERT_RX_DMA->RX_BUFF_Inx = 1 ;   //设置缓存1 接收数据
         }
         else if( USERT_RX_DMA->RX_BUFF_Inx == 1)
         {
                //得到缓存长度--------------------------
                USERT_RX_DMA->RX_BUFF1_Size = USART_IrrG_DMA_BUFF_LEN - DMA_GetCurrDataCounter(USERT_RX_DMA->USERT_Irregular_DMA->USART_RX_DMA_Channel);
                USERT_RX_DMA->RX_BUFF_Inx = 0 ;   //设置缓存1 接收数据       
         }
         
         if( USERT_RX_DMA->RX_BUFF_Comple == 0x03 )  //如果缓存0 缓存1 都接收满
         {
          USERT_RX_DMA->RX_BUFF_Err = 1 ;  //错误 缓存满标记
         }
         else   //正常   则开启 DMA接收
         {
                USART_RX_DMA_START(USERT_RX_DMA);  //开启DMA
         }
}
}
[/mw_shl_code]

必须在串口中断中调用!此函数与串口中断函数功能一致,用于设置双缓存当前状态及切换缓存。无需修改直接调用。


三、应用例子
先定义一个 USERT_Irregular_DMA_typ 结构体 ,用于加载此双缓存的硬件信息。本例子此结构体定义如下:
[mw_shl_code=c,true]const  USERT_Irregular_DMA_typ  USERT_Irregular_DMA  =
{
   115200,
         RCC_APB2Periph_USART1,
         USART1,
         USART1_IRQn,
         RCC_APB2Periph_GPIOA,
         GPIOA,
         GPIO_Pin_10,
         GPIOA,
         GPIO_Pin_9,
         DMA1_Channel5,
   DMA1_Channel5_IRQn,
         DMA1_FLAG_TC5,
};[/mw_shl_code]

声明保存在FLASH中,用于节约SRAM


再定义一个 USART_RX_BUFF 结构体 ,并把刚才定义的 USERT_Irregular_DMA 变量 加载到结构体中(如果一个个赋值太麻烦),本例子定义如下:
[mw_shl_code=c,true]USART_RX_BUFF   USRT_RX_buff = {        //串口 DMA接收不定长数据 对象
   0,
         0,
         0,
         0,
         0,
         0,
        {0},
         0,
        {0},
         &USERT_Irregular_DMA ,
};[/mw_shl_code]


前5个成员变量用于表示双缓存状态,这里全设为0,接下来4个成员分别为对应缓存接收到的数据长度及接收缓存。最后加载双缓存硬件数据结构体。


主程序如下:
[mw_shl_code=c,true]int main(void)
{
volatile u16  i = sizeof(USART_RX_BUFF) ;          //用于查看变量所用SRAM 大小
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
delay_init();
USART_DMA_Init(&USRT_RX_buff) ;
while(1)
{
  if(USRT_RX_buff.RX_BUFF_Comple > 0)
        {
          if(USRT_RX_buff.RX_BUFF_Comple&0x01)
                {
           //数据处理-------------------------------------------------------------------
                  printf("缓存0已接收完毕\r\n") ;
                        printf("接收数据长度为 :%d \r\n",USRT_RX_buff.RX_BUFF0_Size);
                        printf("数据为: %s \r\n",USRT_RX_buff.RX_BUFF0) ;
                //----------------------------------------------------------------------------
                        USART_DMA_CLR_BUFF(&USRT_RX_buff.RX_BUFF0[0],0,USART_IrrG_DMA_BUFF_LEN) ;   //清空缓存
                        USRT_RX_buff.RX_BUFF_Comple &=~0x01 ;   //清楚接收完成标记
                }
               
                if(USRT_RX_buff.RX_BUFF_Comple&0x02)
                {
                 //数据处理-----------------------------------------------------
                  printf("缓存1已接收完毕\r\n") ;
                        printf("接收数据长度为 :%d \r\n",USRT_RX_buff.RX_BUFF1_Size);
                        printf("数据为: %s \r\n",USRT_RX_buff.RX_BUFF1) ;
                //--------------------------------------------------------------
                        USART_DMA_CLR_BUFF(&USRT_RX_buff.RX_BUFF1[0],0,USART_IrrG_DMA_BUFF_LEN) ;   //清空缓存               
                        USRT_RX_buff.RX_BUFF_Comple &=~0x02 ;   //清楚接收完成标记
                }
                if(USRT_RX_buff.RX_BUFF_Err > 0 )   //如果双缓存 溢出了    接收数据过长   缓存开小了
                {
                  USRT_RX_buff.RX_BUFF_Err  = 0 ;    //清楚错误标记
                        printf("\t\t错误!双缓存溢出!\r\n  \t\t接收数据过长或者双缓存太小\r\n") ;
                         //开启DMA  -----------------
                  USART_RX_DMA_START(&USRT_RX_buff);   //必须要手动开启   否则无法运行
                }
        }
}
}

void DMA1_Channel5_IRQHandler(void)    //DMA 中断函数
{
USART_RX_DMA_DMA_IRQ(&USRT_RX_buff) ;
}


void USART1_IRQHandler(void)                        //串口1中断服务程序
{
  USART_RX_DMA_USART_IRQ(&USRT_RX_buff) ;
}
[/mw_shl_code]


这里 变量i 用于指示 变量 USART_RX_BUFF 占用 SAM大小。
串口中断函数及DMA中断函数写在 main.c 文件中 是用于方便提示两个函数的调用
注意!
  如果接收到的数据长度大于单个缓存长度,则双缓存会关闭,必须要手动开启才能继续运行。这里只把单个缓存长度设为40字节也是为了方便测试出这个情况。


工程代码:
串口DMA接收不定长数据.zip (341.84 KB, 下载次数: 1117)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
682
金钱
682
注册时间
2016-1-27
在线时间
183 小时
发表于 2016-7-6 09:48:19 | 显示全部楼层
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-7-6 10:04:25 | 显示全部楼层
谢谢分享,稍后有时间学习一下...
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-7-6 11:21:20 | 显示全部楼层
漂亮!论坛一代更比一代强
回复 支持 反对

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
 楼主| 发表于 2016-7-6 11:50:52 | 显示全部楼层

呵呵,谢谢,相互学习
回复 支持 反对

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
 楼主| 发表于 2016-7-6 11:51:19 | 显示全部楼层
龙之谷 发表于 2016-7-6 10:04
谢谢分享,稍后有时间学习一下...

大神,谢谢。多多交流
回复 支持 反对

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
 楼主| 发表于 2016-7-6 11:51:33 | 显示全部楼层
yyx112358 发表于 2016-7-6 11:21
漂亮!论坛一代更比一代强

谢谢
回复 支持 反对

使用道具 举报

10

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-7-7
在线时间
110 小时
发表于 2016-8-4 10:13:54 | 显示全部楼层

我移植原子的串口中断接收协议,接收到20个数据的时候,标志志位,主函数处理数据(处理完情况标志位),发送数据不够20 的时候,必须加0D0A结束符,但是一旦发送数据过快就死机
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-12-23
在线时间
7 小时
发表于 2016-12-28 15:00:11 | 显示全部楼层
楼主,如果是接收的数据每一包中间会有大于1个字节的延时,并且每一包数据都是不确定的,
没有一个标识来表示是一包数据的开头与结尾,那么每次遇到这个延时就会进入中断将数据发出去,
这样数据就不完整,是否有方法可以解决?(如果在数据接收完后加入一个延时,比如20MS,如果还有数据
就继续接收,没有数据进来就发出去,那么这个延时是否应该是在进入中断前,这样的延时改放在程序的什么地方比较合适)
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-12-23
在线时间
7 小时
发表于 2016-12-28 15:06:16 | 显示全部楼层
楼主,如果是接收的数据每一包中间会有大于1个字节的延时,并且每一包数据都是不确定的,
没有一个标识来表示是一包数据的开头与结尾,那么每次遇到这个延时总线空闲就会进入中断将数据发出去,
这样数据就不完整,是否有方法可以解决?(如果在数据接收完后加入一个延时,比如20MS,如果还有数据
就继续接收,没有数据进来就发出去,那么这个延时是否应该是在进入中断前,这样的延时改放在程序的什么地方比较合适)
回复 支持 反对

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
 楼主| 发表于 2016-12-30 20:31:48 | 显示全部楼层
wdxYHC 发表于 2016-12-28 15:06
楼主,如果是接收的数据每一包中间会有大于1个字节的延时,并且每一包数据都是不确定的,
没有一个标识来 ...

你说的是一条命令不是一次直接发送的情况吧?这个我个人觉得就像是高速来兼容低速。可以独立的设计一个命令数据缓存,DMA接收到数据了就直接写到这个命令数据缓存,程序来判断这个命令数据缓存是否接收完成,如果接收完成了就解析这条命令。
如果一条命令没有起始标记或者没有结束标记,那怎么来确定这条命令呢?如果命令允许,建议至少加一个命令头
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-1-11
在线时间
25 小时
发表于 2017-2-7 09:49:08 | 显示全部楼层
楼主直接用的工程测试,环境keil 5,用串口助手 测试,只有发送到acsii码为(0x?0)的字符才会触发 IDEL中断,
比如
发送 (123456789)不产生IDEL中断
发送(1234567890)可以正常,0 的 acsii码为 0x30
回复 支持 反对

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
 楼主| 发表于 2017-2-9 19:06:37 | 显示全部楼层
520sky 发表于 2017-2-7 09:49
楼主直接用的工程测试,环境keil 5,用串口助手 测试,只有发送到acsii码为(0x?0)的字符才会触发 IDEL中断 ...

请重新下载测试下,这个工程我之前是测试后才上传的。测试没有问题
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-8-28
在线时间
20 小时
发表于 2017-2-21 18:26:21 | 显示全部楼层
楼主 ,正好学习下
回复 支持 反对

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7206
金钱
7206
注册时间
2016-11-30
在线时间
622 小时
发表于 2017-4-20 09:28:56 | 显示全部楼层
mark!正要用!谢谢楼主分享!
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2017-4-20 10:39:53 | 显示全部楼层
mark, 有空研究下
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
 楼主| 发表于 2017-4-21 08:02:13 | 显示全部楼层
最新的版本请移步到:http://www.openedv.com/forum.php?mod=viewthread&tid=91338         3楼
回复 支持 反对

使用道具 举报

11

主题

94

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2016-12-12
在线时间
55 小时
发表于 2017-4-21 10:29:41 | 显示全部楼层
顶一个!
回复 支持 反对

使用道具 举报

37

主题

142

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2016-9-13
在线时间
73 小时
发表于 2017-12-27 16:07:07 | 显示全部楼层
谢谢分享,很棒
回复 支持 反对

使用道具 举报

6

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-3-30
在线时间
33 小时
发表于 2017-12-28 09:39:32 | 显示全部楼层
你好,请问这个程序能用在串口屏的接收吗?看了程序感觉没什么问题,就是不能接收串口屏的信息,能指点一下吗谢谢
回复 支持 反对

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
 楼主| 发表于 2017-12-28 16:51:58 | 显示全部楼层
lichunfandian 发表于 2017-12-28 09:39
你好,请问这个程序能用在串口屏的接收吗?看了程序感觉没什么问题,就是不能接收串口屏的信息,能指点一下 ...

这个是接收串口的连续的数据的,只要是串口数据就行。串口屏是没问题的
回复 支持 反对

使用道具 举报

6

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-3-30
在线时间
33 小时
发表于 2017-12-29 16:43:58 | 显示全部楼层
513393302@qq.co 发表于 2017-12-28 16:51
这个是接收串口的连续的数据的,只要是串口数据就行。串口屏是没问题的

这个程序我连到电脑串口是完全没问题的,可是一连上串口屏就没反应,线都接的对,我再看看吧!谢谢
回复 支持 反对

使用道具 举报

16

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
327
金钱
327
注册时间
2019-3-11
在线时间
50 小时
发表于 2019-4-26 10:59:39 | 显示全部楼层
楼主这把操作秀的很
回复 支持 反对

使用道具 举报

8

主题

161

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5186
金钱
5186
注册时间
2013-3-16
在线时间
610 小时
发表于 2024-6-14 11:38:26 | 显示全部楼层
串口DMA接收不定长数据
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2018-7-30
在线时间
40 小时
发表于 2024-6-17 10:42:04 | 显示全部楼层
谢谢分享,稍后有时间学习一下
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 01:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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