|
|
- 串口中断函数连接求助!
作者:fatfox 时间:2006-5-23 16:59:00
用intConnect()连接中断服务程序的时候,第一个参数:中有宏定义:INUM_TO_IVEC(some int num),编译的时候一切通过,当网络下载目标模块到目标机时,提示出错。信息为:
Unresolved symbols encountered while:
Errors while downloading H:/school/prj/Project2/PENTIUMgnu/serialcom1.o:
_INUM_TO_IVEC
请问如何解决这个问题?
另外,小弟想测试串口1的中断服务程序是否已经正常连接上了,写了如下代码:
#include "vxWorks.h"
#include "intLib.h"
#include "sysLib.h"
#include "ioLib.h"
#include "taskLib.h"
#include "logLib.h"
void intCom1( void );
int fd=0;
void root1( void )
{
fd = open ( "/tyCo/0", O_RDWR, 0 );
ioctl( fd, FIOBAUDRATE, 9600 );
ioctl( fd, SIO_HW_OPTS_SET, CS8|PARENB|PARODD );
if ( ( intConnect( ((VOIDFUNCPTR *)(0x04<<2), (VOIDFUNCPTR)intCom1, 0 )) == ERROR )
printf(" failed to connect com1!\n ");
taskDelay(1800);
}
void intCom1 ( void )
{
/ logMsg( "ok int is happened/n",0, 0, 0, 0, 0, 0 );
}
然后网络加载目标模块到目标机,在shell中执行命令:sp root1
然后通过串口调试助手从台式机上给目标机的串口1发数据。可结果是shell中和目标机屏幕上没有任何输出!!这是否意味着中断服务程序没有连接成功??
还请赐教!!谢谢!!
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
作者:asdffdsa 时间:2006-5-25 8:57:52
第一个问题你可以试着加入其它一些头文件,好像是"iv.h"
第二个问题你可以尝试用select去实现
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
作者:fatfox 时间:2006-5-25 10:32:07
谢谢楼上的,第一个问题解决了呵呵!
我现在写了一个小程序来测试vxworks里面用串口往pc台式机发数据:
void test( void )
{
int i=0;
char cval='D';
char * pcval=&cval;
fd = open ( "/tyCo/1", O_RDWR, 0 );
ioctl( fd, SIO_HW_OPTS_SET, CS8|PARENB|PARODD );
while ( i<20 )
{
if ( write( fd, pcval, 1 ) == ERROR ) printf( "write to com if failed!\n" );
i++;
taskDelay(50);
}
}
编译、下载到目标机,然后在shell上执行: sp test
结果在台式机上的串口调试助手中根本没有收到数据,而且vxworks也没有错误输出。请问何故??
另外如果我把设备名称改为:"/tyCo/0", 也就是用串口1发送,程序运行是一直不退出,在shell上用 i 命令查看,发现任务一直在pend状态,可是换成
"/tyCo/1", 也就是串口2就不会这样,我的串口1并没有使用啊,请问是什么原因造成任务pend 的??
恳请指教!!
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
作者:fatfox 时间:2006-5-25 18:59:30
我为了改变数据位或者校验位时使用了ioctl中对硬件底层的SIO开头的命令控制字设置数据位或者校验位,然后串口发数据时在pc台式机上串口调试助手就再也收不到数据了,而且从此以后无论对vxworks串口怎样设置都不行。这个时候我注意到了write()返回的字节数是正确的,并且我用ioctl读取这个时候串口的IO_HW_OPTS_GET的硬件选项参数、SIO_MODE_GET的工作模式参数发现与串口工作正常时候的2个参数完全一样,可是台式机上的串口调试助手就是不能收到数据!!唯一的办法就是重新复位pc104板。
我起初怀疑是SIO命令控制字的支持有问题,可是我如果用ioctl(fd, SIO_BAUD_SET, baudRate)设置波特率就不会有问题。
还望赐教。谢谢!!!!
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
作者:fatfox 时间:2006-5-24 9:39:20
另外,小弟最近看了vxworks下的SCC驱动程序结构,现在有一个问题:当串口工作在中断模式下面,当数据到达时将会有一个中断产生,可是在系统对串口设备第二次初始化时已经吧该中断连接到了SCC驱动中的ISR程序上由它来负责调用上层的回调函数,那么用户自己的程序如何知道要发送给自己的数据何时到达并用read()去读取呢??
小弟前些时候编写过DOS下的串口读写,只要对寄存器设置并且挂接自己的中断服务程序就可以了,现在在pc104下感觉对vxoworks下的串口读写一头雾水不知从何下手,还请高手指点!!
谢谢了!!
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|