2回答

0收藏

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

GD32 GD32 4632 人阅读 | 2 人回复 | 2015-07-27


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 三周年铜板双倍!

查看全部评分

分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

五哥

发表于 2015-7-27 23:26:14 | 只看该作者

哈哈哈,我会LabVIEW,有空可以切磋,原来做了几个月的软体工程师。现在做窗帘了。还是留个QQ吧,1399866558.
板凳

dvd1478

发表于 2015-7-28 20:35:35 | 只看该作者

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

呵呵,努力着呢!~1696933323
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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