搜索
bottom↓
回复: 2

GPIB设备开发,驱动TNT5002时Timeout的问题

[复制链接]

出0入0汤圆

发表于 2018-7-19 20:12:51 | 显示全部楼层 |阅读模式
正在做GPIB开发,用STM32驱动TNT5002作GPIB设备,在NI网站一找到一个软件包ESP-488,把程序移植到STM32上后可以通过GPIB和上位机通信了,但每次上位机发送一个SCPI指令给STM32后,STM32回复上位机之前TNT5002都会产生一个超时错误,下面是main函数的代码


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <termios.h>
  4. #include <unistd.h>

  5. #include "gpmc.h"
  6. #include "NGPIB_IO.h"
  7. #include "IO_PARAM.h"
  8. #include "main.h"

  9. int flag = 0;

  10. char buf[50];


  11. int main(void)
  12. {
  13.         char keystroke;
  14.         int spoll_count=0;

  15.         Mem_Init();
  16.         Gpmc_Init();

  17.         Initialize_Interface();                  /* Initialize TNT                 */
  18.         Set_Timeout(0xc,TRUE);                    /* Change timeout to 1 sec.       */
  19.         Set_4882_Status(SRE,0x10);               /* Set SRQ on MAV                 */
  20.         Set_Address_Mode(0);                     /* Set to single primary mode     */
  21.         Change_Primary_Address(12);                                        /* Set primary address            */

  22.         while(keystroke!='q')
  23.         {
  24.                 /* Loop until 'q' pressed         */

  25.                 do
  26.                 {
  27.                         if(Read_GPIB_Lines()&0x8000)
  28.                                 printf("\nATN asserted");
  29.                         Update_INTERFACE_STATUS();           /* Update status word             */
  30.                         usleep(1000);
  31.                 }
  32.                 while(Read_GPIB_Lines()&0x8000);     /*  Continue when ATN not asserted Update_INTERFACE_STATUS()*/
  33.                                                                                           /*  calls CPT_Handler() which validates the HS488 and mult- */
  34.                                                                                           /*  primary addresses. These bytes must be read from the GPIB*/
  35.                                                                                           /*  before an I/O function can be called. */
  36.                 //当ATN未断言时继续Update_INTERFACE_STATUS()调用CPT_Handler(),该CPT_Handler()验证HS488和多主地址。
  37.                 //必须先从GPIB读取这些字节,然后才能调用I/O功能。
  38.                 if(INTERFACE_STATUS&SPOLL)
  39.                 {
  40.                         /* If SPOLL set                   */
  41.                         Set_4882_Status(STB,spoll_count++);  /*   Set count of SPOLL           */
  42.                         Clear_4882_Status(STB,0xff);         /*   Clear STB                    */
  43.                 }

  44.                 else if(INTERFACE_STATUS&LACS)
  45.                 {
  46.                         /* If listen addressed            */

  47.                         Receive(buf,50,EOI);                 /* Read up to 50 bytes            */

  48.                          /*************************************
  49.                           *
  50.                           *  Parse commands/data
  51.                           *
  52.                           *************************************/
  53.                         if( strcmp(buf , "*IDN?\n") == 0 )
  54.                         {
  55.                                 flag = 1;
  56.                         }
  57.                         else if( strcmp(buf , "1234\n") == 0 )
  58.                         {
  59.                                 flag = 2;
  60.                         }
  61.                         else if( strcmp(buf , "56\n") == 0 )
  62.                         {
  63.                                 flag = 3;
  64.                         }
  65.                         else if( strcmp(buf , "78900\n") == 0 )
  66.                         {
  67.                                 flag = 4;
  68.                         }
  69.                         else
  70.                         {
  71.                                 flag = 0;
  72.                         }

  73.                         if(DATA_COUNT>0)
  74.                         {
  75.                                 /* If bytes were received         */
  76.                                 Set_4882_Status(STB,0x10);         /*   Set MAV bit in STB           */
  77.                                 /*   Print to stdio               */
  78.                                 printf("\nReceived %lu data bytes\n",DATA_COUNT);

  79.                                 printf("\nReceive %x = %s\n",buf, buf);
  80.                         }
  81.                 }
  82.                 else if(INTERFACE_STATUS&TACS)
  83.                 {
  84.                         /* If talk addressed              */
  85.                         /* Send status data               */
  86.                         if( flag ==0 )
  87.                         {
  88.                                 DATA_COUNT = 0;
  89.                                 flag = 0;
  90.                         }
  91.                         if( flag == 1 )
  92.                         {
  93.                                 flag = 0;
  94.                                 Send("flag = 1",8,EOI);
  95.                         }
  96.                         if( flag == 2 )
  97.                         {
  98.                                 flag = 0;
  99.                                 Send("flag = 2",8,EOI);
  100.                         }
  101.                         if( flag == 3 )
  102.                         {
  103.                                 flag = 0;
  104.                                 Send("flag = 3",8,EOI);
  105.                         }
  106.                         if( flag == 4 )
  107.                         {
  108.                                 flag = 0;
  109.                                 Send("flag = 4",8,EOI);
  110.                         }

  111.                         if(DATA_COUNT>0)
  112.                         {
  113.                                 Clear_4882_Status(STB,0x10);       /*  Clear MAV bit                 */
  114.                                 /* If data bytes sent print it    */
  115.                                 printf("\nSent     %lu data bytes",DATA_COUNT);
  116.                         }
  117.                 }

  118.                 if(INTERFACE_STATUS&ERR)
  119.                 {
  120.                         /* If EABO report it              */
  121.                         //INTERFACE_ERROR = ENOL(1):没有听者
  122.                         //INTERFACE_ERROR = EARG(2):函数参数错误或不能进行某种参数设置
  123.                         //INTERFACE_ERROR = EABO(3):超时
  124.                         printf("\nGPIB error has occured (INTERFACE_ERROR = %d)",INTERFACE_ERROR);
  125.                         INTERFACE_STATUS&=~ERR;
  126.                 }
  127.         }

  128.         Interface_Off();                         /* Disable interface              */

  129.         Gpmc_free();
  130.         Mem_free();

  131.         return 0;
  132. }
复制代码


初始化中的Set_Timeout(0xc,TRUE); 函数没搞明白作用,而且如果我这里设置的超时时间是1秒,那上位机发送SCPI指令后TNT5002要过1秒才会回复上位机,没有明白这个超时的作用是什么,还有为什么INTERFACE_STATUS会报错误,附上ESP-488软件包,请大家帮我看看,谢谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入8汤圆

发表于 2021-2-19 15:52:04 | 显示全部楼层
楼主最后用TNT5002跑起来了没有?和NI TNT4882驱动方式一下么?

出0入0汤圆

发表于 2021-3-9 22:23:38 | 显示全部楼层
期待后续进展,楼主后面超时问题解决了吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 19:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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