求助,关于串口通讯?
:( 用CVI编程实现PC和单片机的通讯,使用了一个定时器控件,实现的功能是给单片机发送一定数据后停止。但运行过程中,不能停止,而且界面上的其它按钮不能响应。哪位高手给看看,什么原因。谢谢! 如果它是不断循环,哪前面的控件就点不到了,要加前面板的系统事件处理才行!最好上传程序!不能停止要看程序架构!没有程序没有办法分析的!论坛上面有一些是关于CVI和ARM通信的例子,不过是用USB的,不是串口,呵呵!现把程序传上去,帮忙看看,谢谢~!
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;
} :handshake 压缩一下程序文件吧兄弟,这样发上来运行不了!
程序文件传上去,帮忙调试一下~!
程序见附件 兄弟,您的文件有问题吧?打不开呢!您将整个文件压缩一下,然后上传上来,才1K多应该是出问题了,打不开呢!比如UIR还有CWS以及PRJ文件都压进去,否则只有一个C没有办法调试的!呵呵!不过我现在下不下来文件,只有0K,不知道什么回事! 确实是空的!打不开呢!重新上传文件~!
不好意思,昨天可能压缩的时候出问题了。请各位高手帮忙看看~! timer里面的循环有问题具体说说!
劳驾说具体一些,谢谢! 不太清楚你的步进电机通讯协议,看你的描述程序应该是进入了 do{
strLen=GetInQLen(channel);
ComRd(channel,readBuf,strLen);
}while(readBuf!=0x88);
这个死循环,这样来读串好像很不好,很容易就死循环了!最好加一个循环次数的限制。建议你自己设个中断来调试一下,观察一下readBuf的值会不会等于0x88。
说得不对,勿怪啊!:lol 我感觉和上面的兄弟的想法应该是一样的!在那里等待了!用串口的事件估计更合适!它可以安装事件的! 步进电机程序是这样的:当电机运行完一个步长,也就是l加1,就向上位机发送0x88这个数,因此readbuf应该能等于0x88的,请各位高手再看看,多谢了! 兄弟用一个事件installcomevent那个东东,名字差不多的,来读数据,自动读的,当有收到的时候就读,然后读到了再处理,这样就很方便,您这个是扫描的,收不到就一直在等着!while(readBuf!=0x88);
回复 1# chenyuan1030 的帖子
用多线程吧。0.1S周期的Timer回调下要处理COM口数据的传输很容易死。
页:
[1]