在Windows2000下用多线程实现1394串行总线通信
3.3.2初始化程序
在开始通信前,首先要对串口资源、链路层寄存器及程序设置进行初始化,其中包括链路层寄存器初始化、打开驱动设备、打开硬件中断、定义临界区对像及收发缓冲区等工作。
CCriticalSection m_cs; file://定义临界区对像
bool ISA_Init() file://打开驱动设备
bool ISA_IntAEnable() file://打开硬件使能
List rBuf,sBuf file://定义收发缓冲区
void BusInit() file://链路层寄存器初始化
链路层寄存器初始化是1394串行总线能正常工作的基础,下图是链路层寄存器初始化的流图。复位中断寄存器IntFlagReg,使其为零;写中断屏蔽寄存器IntMaskReg,打开中断允许使能位、发送中断位及接收中断位;写FIFO控制寄存器FifoCtrlReg,清除接收和发送FIFO,并设置接收和发送FIFO的大小;写物理层芯片访问寄存器PhyAccessReg,初始化总线复位;写控制寄存器ControlReg,打开发送,接收使能位等。
javascript:window.open(this.src);" style="cursor:pointer;"/>
3.3.3中断处理程序
InterruptHandle()是一个全局的中断处理函数,它一直在等待硬件中断,一旦有中断到来就立即响应。具体形式如下:
UINT InterruptHandle (LPVOID wParam)
{ while(1)
{ ISA_WriteByte(0x502,0x01); file://开中断
WD_IntWait(hWD,&Intrp); file://等待中断
…… file://判断中断类型,复位中断寄存器
if(RxDta) file://接收中断
{ Data = QuadletReadLLC(GRFStatusReg); file://读GRF状态寄存器
WriteCount = (BYTE)Data & 0xff; file://获得接收数据包的大小
pt = (PLISTBLOCK)malloc(sizeof(LISTBLOCK)); file://申请节点pt存放数据包
pd = (DWORD*)malloc(WriteCount*sizeof(DWORD));
pt->pdata = pd;
pt->next = NULL;
for(i=0;i<=WriteCount;i++,pd++) file://读GRF的数据
*pd = QuadletReadLLC(GRFReg);
ps = &rBuf; file://给链表rBuf尾插入数据节点pt
while(ps->next!=NULL) ps=ps->next;
ps->next = pt;
SendMessage(hWnd,WM_MY_MESSAGE,0,0); file://发送接收到数据包的消息
}
if(TxRdy) file://发送中断
{ m_cs.Lock(); file://锁定临界资源
p = &sBuf;
if(p->next!=NULL) file://sBuf不为空
{ pd = p->pdata;
sBuf->next = p->next; file://删除链表sBuf的第一个节点
free(p); file://释放p
QuadletWriteLLC(ATF_First, *pd); file://写第1个Quadlet到ATF
pd++;
for(i=1;i<=WriteCount-2;i++,pd++) file://第2~(WriteCount-1)个Quadlet
QuadletWriteLLC(ATF_Continue, *pd);
QuadletWriteLLC(ATF_ContinueUpdata, *pd); file://第WriteCount个Quadlet
}
m_cs.Unlock(); file://解锁临界资源
}
return 0;
}
3.3.4 解释处理程序
解释处理程序实际上是用户自定义的一个消息处理函数,它一直在等待中断处理程序发来的接收到数据包的消息。如果有消息到达,就从rBuf中取出数据包进行解释。如果是自标识包,将接收到的数据放到自标识缓冲区SelfIDbuf中;如果是读请求包,从dataBuf中取出数据,并根据读请求数据包的包头构造相应的读响应包放到sBuf中;如果是写请求包,从rBuf中取出数据部分放到数据缓冲区dataBuf中等待做进一步的处理,并根据写请求数据包的包头构造相应的写响应包放到sBuf中。
4 结束语
本文针对实际应用中对1394串行总线通信实时性和可靠性的要求 ,采用中断的方法来接收和发送数据,并提出了在Windows2000下运用多线程技术来实现1394串行总线异步通信的方法,有效的解决了在串口通信中出现的数据丢失和不稳定问题,提高了系统的执行效率和资源的利用率,实践证明这是一种有效的途径。