chenyuan1030 发表于 2008-5-29 09:28:48

求助,关于串口通讯?

:( 用CVI编程实现PC和单片机的通讯,使用了一个定时器控件,实现的功能是给单片机发送一定数据后停止。但运行过程中,不能停止,而且界面上的其它按钮不能响应。哪位高手给看看,什么原因。谢谢!

cpubbs 发表于 2008-5-29 09:56:49

如果它是不断循环,哪前面的控件就点不到了,要加前面板的系统事件处理才行!最好上传程序!不能停止要看程序架构!没有程序没有办法分析的!论坛上面有一些是关于CVI和ARM通信的例子,不过是用USB的,不是串口,呵呵!

chenyuan1030 发表于 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=0x0a;
      if(p==0)
                        trans=0xac;//扫查电机反转 前进
      if(p==1)
                        trans=0xad;//扫查电机正转 后退
         if(p==2)
                        trans=0xab;//主轴电机反转 向左
         if(p==3)
                        trans=0xaa;//主轴电机正转 向右
            trans=n;
                        trans=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!=0x88);
                                          if(readBuf==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;
}

cpubbs 发表于 2008-5-29 13:04:28

:handshake 压缩一下程序文件吧兄弟,这样发上来运行不了!

chenyuan1030 发表于 2008-5-29 14:04:25

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

程序见附件

cpubbs 发表于 2008-5-29 20:46:06

兄弟,您的文件有问题吧?打不开呢!您将整个文件压缩一下,然后上传上来,才1K多应该是出问题了,打不开呢!比如UIR还有CWS以及PRJ文件都压进去,否则只有一个C没有办法调试的!呵呵!不过我现在下不下来文件,只有0K,不知道什么回事!

cpubbs 发表于 2008-5-29 20:46:23

确实是空的!打不开呢!

chenyuan1030 发表于 2008-5-30 09:57:17

重新上传文件~!

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

duanzhixiao 发表于 2008-5-31 10:53:11

timer里面的循环有问题

chenyuan1030 发表于 2008-5-31 11:35:38

具体说说!

劳驾说具体一些,谢谢!

duanzhixiao 发表于 2008-5-31 19:18:07

不太清楚你的步进电机通讯协议,看你的描述程序应该是进入了                                    do
                                    {                               
                                             strLen=GetInQLen(channel);
                                         ComRd(channel,readBuf,strLen);
                                          }while(readBuf!=0x88);
这个死循环,这样来读串好像很不好,很容易就死循环了!最好加一个循环次数的限制。建议你自己设个中断来调试一下,观察一下readBuf的值会不会等于0x88。
说得不对,勿怪啊!:lol

cpubbs 发表于 2008-6-1 01:43:40

我感觉和上面的兄弟的想法应该是一样的!在那里等待了!用串口的事件估计更合适!它可以安装事件的!

chenyuan1030 发表于 2008-6-2 14:42:51

步进电机程序是这样的:当电机运行完一个步长,也就是l加1,就向上位机发送0x88这个数,因此readbuf应该能等于0x88的,请各位高手再看看,多谢了!

cpubbs 发表于 2008-6-6 09:12:14

兄弟用一个事件installcomevent那个东东,名字差不多的,来读数据,自动读的,当有收到的时候就读,然后读到了再处理,这样就很方便,您这个是扫描的,收不到就一直在等着!while(readBuf!=0x88);

huhuyo 发表于 2008-6-6 20:13:21

回复 1# chenyuan1030 的帖子

用多线程吧。0.1S周期的Timer回调下要处理COM口数据的传输很容易死。
页: [1]
查看完整版本: 求助,关于串口通讯?