查看: 3790|回复: 2

[项目] [GD32F150R8]03、与Labview 之VISA 串口通信中断FIFO优化

[复制链接]
  • TA的每日心情
    奋斗
    2023-7-8 16:17
  • 签到天数: 971 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-7-27 22:33:15 | 显示全部楼层 |阅读模式
    分享到:

    GD32 F150R8 与 PC端LabView 通信之VISA串口通信
    https://www.cirmall.com/bbs/foru ... 9&fromuid=23447
    实现了基本的通讯。

    [GD32F150R8]02、与Labview 之VISA 串口通信2
    https://www.cirmall.com/bbs/foru ... 5&fromuid=23447

    对其进行扩展,采用command line 的方法,当大型任务的时候,就是也以command line 的方法进行扩展

    最终以
    UIF_CMD UIF_CMDTAB[] = {UIF_CMDS_ALL};

    UIF_SETCMD UIF_SETCMDTAB[]={
            {"led",0,1,uif_cmd_led,"set led"}
    };
    的方法对任务不断的扩展。

    但在上述两例中,虽然实现了Labview有通信,但是不实用。原因在于查询的方法接收数据,无限的等待是无法接收的。
    对于查询方式发送,一般的情况下是可以接受的。
    如果从实用的角度上看,就要把查义接收数据,修改成中断。 这样采用了FIFO进行实现,代码如下:
    1. /***************************************************************************************/
    2. char    sFifoUart2RxBuffer[(128)] = {0};
    3. uint8_t    sFifoUart2RxTail = 0;
    4. uint8_t    sFifoUart2RxHead = 0;
    5. uint8_t    sFifoUart2RxCounter = 0;

    6. bool Fifo_Uart2Rx_Add_Data(char Data)
    7. {
    8.         USART_INT_Set(USART1,USART_INT_RBNE,DISABLE);
    9.                 if ((sFifoUart2RxTail == sFifoUart2RxHead)
    10.                   && (sFifoUart2RxCounter != 0))
    11.                 {
    12.                         USART_INT_Set(USART1,USART_INT_RBNE,ENABLE);
    13.                         return false;
    14.                 }
    15.                
    16.                 sFifoUart2RxBuffer[sFifoUart2RxHead] = Data;
    17.                 sFifoUart2RxHead = (sFifoUart2RxHead == (128 - 1)) ?
    18.                                                                 0 : (sFifoUart2RxHead + 1);
    19.                 sFifoUart2RxCounter++;
    20.         USART_INT_Set(USART1,USART_INT_RBNE,ENABLE);
    21.         return true;
    22. }


    23. bool Fifo_Uart2Rx_Get_Data(char *pData)
    24. {
    25.         USART_INT_Set(USART1,USART_INT_RBNE,DISABLE);
    26.                 if (((sFifoUart2RxTail == sFifoUart2RxHead)
    27.                   && (sFifoUart2RxCounter == 0))
    28.                   || (pData == (char *)0))
    29.                 {
    30.                         USART_INT_Set(USART1,USART_INT_RBNE,ENABLE);
    31.                         return false;
    32.                 }
    33.                
    34.                 (*pData) = sFifoUart2RxBuffer[sFifoUart2RxTail];
    35.                 sFifoUart2RxTail = (sFifoUart2RxTail == (128 - 1)) ?
    36.                                                                 0 : (sFifoUart2RxTail + 1);
    37.                 sFifoUart2RxCounter--;
    38.         USART_INT_Set(USART1,USART_INT_RBNE,ENABLE);
    39.         return true;
    40. }

    41. bool Fifo_Uart2Rx_Reset(void)
    42. {
    43.         USART_INT_Set(USART1,USART_INT_RBNE,DISABLE);
    44.                 sFifoUart2RxCounter = 0 ;
    45.                 sFifoUart2RxTail = 0;
    46.                 sFifoUart2RxHead = 0;
    47.          USART_INT_Set(USART1,USART_INT_RBNE,ENABLE);
    48.         return false;
    49. }
    复制代码
    1. void EVB_Uart2Config(void)
    2. {

    3.         NVIC_InitPara NVIC_InitStructure;
    4.        
    5.     USART_InitPara USART_InitStructure;
    6.     GPIO_InitPara GPIO_InitStructure;

    7.     /* Enable GPIOA clock */
    8.     RCC_AHBPeriphClock_Enable( RCC_AHBPERIPH_GPIOA , ENABLE );

    9.     /* Enable USART1 APB clock */
    10.     RCC_APB1PeriphClock_Enable( RCC_APB1PERIPH_USART2 , ENABLE );

    11.     /* USART1 Pins configuration **************************************************/
    12.     //GPIO_DeInit( GPIOA );

    13.     /* Configure the GPIO ports */

    14.     /* Connect pin to Periph */
    15.     GPIO_PinAFConfig( GPIOA , GPIO_PINSOURCE2, GPIO_AF_1 );
    16.     GPIO_PinAFConfig( GPIOA , GPIO_PINSOURCE3, GPIO_AF_1 );

    17.     /* Configure pins as AF pushpull */
    18.     GPIO_InitStructure.GPIO_Pin     = GPIO_PIN_2 | GPIO_PIN_3;
    19.     GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_AF;
    20.     GPIO_InitStructure.GPIO_Speed   = GPIO_SPEED_50MHZ;
    21.     GPIO_InitStructure.GPIO_OType   = GPIO_OTYPE_PP;
    22.     GPIO_InitStructure.GPIO_PuPd    = GPIO_PUPD_NOPULL;
    23.     GPIO_Init( GPIOA , &GPIO_InitStructure);


    24.     USART_DeInit( USART2 );

    25.     USART_InitStructure.USART_BRR                 = 115200;
    26.     USART_InitStructure.USART_WL                  = USART_WL_8B;
    27.     USART_InitStructure.USART_STBits              = USART_STBITS_1;
    28.     USART_InitStructure.USART_Parity              = USART_PARITY_RESET;
    29.     USART_InitStructure.USART_HardwareFlowControl = USART_HARDWAREFLOWCONTROL_NONE;
    30.     USART_InitStructure.USART_RxorTx              = USART_RXORTX_RX | USART_RXORTX_TX;
    31.     USART_Init(USART2, &USART_InitStructure);

    32.         Fifo_Uart2Rx_Reset();
    33.        
    34.         NVIC_PRIGroup_Enable(NVIC_PRIGROUP_0);
    35.     NVIC_InitStructure.NVIC_IRQ = USART2_IRQn;
    36.     NVIC_InitStructure.NVIC_IRQPreemptPriority = 0;
    37.     NVIC_InitStructure.NVIC_IRQSubPriority = 3;
    38.     NVIC_InitStructure.NVIC_IRQEnable = ENABLE;
    39.     NVIC_Init(&NVIC_InitStructure);
    40.        
    41.         USART_ClearINTBitState(USART2,USART_INT_RBNE);
    42.     USART_INT_Set(USART2,USART_INT_RBNE,ENABLE);

    43.     /* USART enable */
    44.     USART_Enable(USART2, ENABLE);
    45.    
    46. }
    复制代码
    1. bool UsartGetFifoByte(char* c)
    2. {
    3.         return Fifo_Uart2Rx_Get_Data(c);
    4. }
    复制代码
    当FIFO为空是返回false ,成功时返回true
    这样就有效地提高了实用的价值

    评分

    参与人数 1与非币 +5 收起 理由
    loveeeboard + 5 三周年铜板双倍!

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2014-12-24 12:35
  • 签到天数: 26 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2015-7-27 23:26:14 | 显示全部楼层
    哈哈哈,我会LabVIEW,有空可以切磋,原来做了几个月的软体工程师。现在做窗帘了。还是留个QQ吧,1399866558.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-7-8 16:17
  • 签到天数: 971 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-7-28 20:35:35 | 显示全部楼层
    五哥 发表于 2015-7-27 23:26
    哈哈哈,我会LabVIEW,有空可以切磋,原来做了几个月的软体工程师。现在做窗帘了。还是留个QQ吧,139986655 ...

    呵呵,努力着呢!~1696933323
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-3-28 22:37 , Processed in 0.141347 second(s), 20 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.