cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1856|回复: 14

求助,关于串口通讯?

[复制链接]
发表于 2008-5-29 09:28:48 | 显示全部楼层 |阅读模式
用CVI编程实现PC和单片机的通讯,使用了一个定时器控件,实现的功能是给单片机发送一定数据后停止。但运行过程中,不能停止,而且界面上的其它按钮不能响应。哪位高手给看看,什么原因。谢谢!
发表于 2008-5-29 09:56:49 | 显示全部楼层
如果它是不断循环,哪前面的控件就点不到了,要加前面板的系统事件处理才行!最好上传程序!不能停止要看程序架构!没有程序没有办法分析的!论坛上面有一些是关于CVI和ARM通信的例子,不过是用USB的,不是串口,呵呵!
 楼主| 发表于 2008-5-29 11:34:58 | 显示全部楼层

现把程序传上去,帮忙看看,谢谢~!

int CVICALLBACK Start (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)   //开始按钮回调函数
{
        switch (event)
                {
                case EVENT_COMMIT:
                GetCtrlVal (panelHandle, PANEL_START, &start);
                if(start)
                {
               
   /*获得扫查参数*/
   GetCtrlVal (panelHandle, PANEL_LENGTH, &length);
   GetCtrlVal (panelHandle, PANEL_WIDTH, &width);
   GetCtrlVal (panelHandle, PANEL_DEPTH, &depth);
  
  /*获取面板电机参数*/
  GetCtrlVal (panelHandle, PANEL_DIRECTION,&p);      
  GetCtrlVal (panelHandle, PANEL_STEP,&step);            
  GetCtrlVal (panelHandle, PANEL_FREQUENCY,&f);                
  GetCtrlVal (panelHandle, PANEL_XFS,&xfs);            
n= step/(0.0208/xfs);   
Unitime=n/f;
SetCtrlAttribute (panelHandle, PANEL_TIMER,ATTR_INTERVAL,1*Unitime);
T=1000000/f;               
loop=T/100;         
trans[0]=0x0a;
        if(p==0)
                        trans[1]=0xac;  //扫查电机反转 前进
        if(p==1)
                        trans[1]=0xad;  //扫查电机正转 后退
         if(p==2)
                        trans[1]=0xab;  //主轴电机反转 向左
         if(p==3)
                        trans[1]=0xaa;  //主轴电机正转 向右
            trans[2]=n;
                        trans[3]=loop;
                       
                       
OpenComConfig(channel,"",Baud,0,8,1,256,256);                                SetCtrlVal(panelHandle, PANEL_LED, 1);   
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED,1);
                         }
                }
                else
                 {
                   SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED,0);
                   SetCtrlVal(panelHandle, PANEL_LED, 0);
                 }
                        break;
                }
        return 0;
}

int CVICALLBACK Timer (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)  //定时器回调函数
{
        int strLen;
        switch (event)
                {
                case EVENT_TIMER_TICK:
            if(l<length)
                               {
                                if(start)
                                       {  FlushOutQ(channel);               
                                      ComWrt(channel,trans,4);
                                    do
                                      {                               
                                             strLen=GetInQLen(channel);
                                           ComRd(channel,readBuf,strLen);
                                          }while(readBuf[0]!=0x88);
                                          if(readBuf[0]==0x88)
                                          SetCtrlVal (panelHandle, PANEL_TEXTBOX, readBuf);
                                       }
                                   }
                               if(l==length)
                                   {
                                      SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED,0);
                                      if(GetOutQLen(Channel))                //若缓冲区数据已被取走,则关闭串口
                                    {
                                          if(GetOutQLen(Channel)==0)
                                          CloseCom(Channel);
                                    }
                                                SetCtrlVal (panelHandle, PANEL_LED, 0);           //运行指示灯灭
                                          SetCtrlVal (panelHandle, PANEL_START, 0);  //启动按钮弹出
                           }
                         l++;
                        break;
                }
        return 0;
}
发表于 2008-5-29 13:04:28 | 显示全部楼层
压缩一下程序文件吧兄弟,这样发上来运行不了!
 楼主| 发表于 2008-5-29 14:04:25 | 显示全部楼层

程序文件传上去,帮忙调试一下~!

程序见附件

本帖子中包含更多资源

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

x
发表于 2008-5-29 20:46:06 | 显示全部楼层
兄弟,您的文件有问题吧?打不开呢!您将整个文件压缩一下,然后上传上来,才1K多应该是出问题了,打不开呢!比如UIR还有CWS以及PRJ文件都压进去,否则只有一个C没有办法调试的!呵呵!不过我现在下不下来文件,只有0K,不知道什么回事!
发表于 2008-5-29 20:46:23 | 显示全部楼层
 楼主| 发表于 2008-5-30 09:57:17 | 显示全部楼层

重新上传文件~!

不好意思,昨天可能压缩的时候出问题了。请各位高手帮忙看看~!

本帖子中包含更多资源

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

x
发表于 2008-5-31 10:53:11 | 显示全部楼层
 楼主| 发表于 2008-5-31 11:35:38 | 显示全部楼层

具体说说!

劳驾说具体一些,谢谢!
发表于 2008-5-31 19:18:07 | 显示全部楼层
不太清楚你的步进电机通讯协议,看你的描述程序应该是进入了                                    do
                                      {                               
                                             strLen=GetInQLen(channel);
                                           ComRd(channel,readBuf,strLen);
                                          }while(readBuf[0]!=0x88);
这个死循环,这样来读串好像很不好,很容易就死循环了!最好加一个循环次数的限制。建议你自己设个中断来调试一下,观察一下readBuf[0]的值会不会等于0x88。
说得不对,勿怪啊!
发表于 2008-6-1 01:43:40 | 显示全部楼层
我感觉和上面的兄弟的想法应该是一样的!在那里等待了!用串口的事件估计更合适!它可以安装事件的!
 楼主| 发表于 2008-6-2 14:42:51 | 显示全部楼层
步进电机程序是这样的:当电机运行完一个步长,也就是l加1,就向上位机发送0x88这个数,因此readbuf[2]应该能等于0x88的,请各位高手再看看,多谢了!
发表于 2008-6-6 09:12:14 | 显示全部楼层
兄弟用一个事件installcomevent那个东东,名字差不多的,来读数据,自动读的,当有收到的时候就读,然后读到了再处理,这样就很方便,您这个是扫描的,收不到就一直在等着!while(readBuf[0]!=0x88);
发表于 2008-6-6 20:13:21 | 显示全部楼层

回复 1# chenyuan1030 的帖子

用多线程吧。0.1S周期的Timer回调下要处理COM口数据的传输很容易死。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-22 00:25 , Processed in 0.635920 second(s), 5 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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