...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
/*****************************************************************************/
/*! Function to handle I/O-data. Using to handle the I/O data from different
* devices in own threads.
* Packet Transfer and I/O Data exchange
* \return CIFX_NO_ERROR on success */
/*****************************************************************************/
DWORD WINAPI IODataHandler(LPVOID hChannel)
{
long lRet = CIFX_NO_ERROR;
/* Read and write I/O data (32Bytes). Output data will be incremented each cyle */
unsigned char abRecvData[64] = { 0 };
unsigned char abSendData[64] = { 0 };
unsigned long ulCycle = 0;
uint32_t ulState = 0;
/* Do I/O Data exchange until a key is hit */
while (!_kbhit())
{
if (CIFX_NO_ERROR != (lRet = xChannelIORead(hChannel, 0, 0, sizeof(abRecvData), abRecvData, IO_WAIT_TIMEOUT)))
{
printf("IO Data read return not zero!\r\n");
return;
}
else
{
printf("IORead Data:");
DumpData(abRecvData, sizeof(abRecvData));
if (CIFX_NO_ERROR != (lRet = xChannelIOWrite(hChannel, 0, 0, sizeof(abRecvData), abRecvData, IO_WAIT_TIMEOUT)))
{
printf("IO Data write return not zero!\r\n");
return;
}
else
{
printf("IOWrite Data:");
DumpData(abSendData, sizeof(abSendData));
memset(abSendData, ulCycle + 1, sizeof(abSendData));
}
}
}
}
/*****************************************************************************/
/*! Function to demonstrate communication channel functionality
* Packet Transfer and I/O Data exchange
* \return CIFX_NO_ERROR on success */
/*****************************************************************************/
long ChannelDemo(HANDLE hDriver, char* szBoard[], uint32_t ulChannel[], uint32_t channelCount)
{
HANDLE* hChannels;
hChannels = malloc(channelCount * 4);
HANDLE hChannel = NULL;
long lRet = CIFX_NO_ERROR;
for (uint32_t i = 0; i < channelCount; i++) {
printf("---------- Communication Channel demo ----------\r\n");
lRet = xChannelOpen(hDriver, szBoard, ulChannel, &hChannel);
if (CIFX_NO_ERROR != lRet)
{
printf("Error opening Channel!");
}
else
{
...
...
...
/* Set Host Ready to signal the filed bus an application is ready */
lRet = xChannelHostState(hChannel, CIFX_HOST_STATE_READY, &ulState, HOSTSTATE_TIMEOUT);
if (CIFX_NO_ERROR != lRet)
{
printf("Error setting host ready!\r\n");
}
else
{
/* Switch on the bus if it is not automatically running (see configuration options) */
lRet = xChannelBusState(hChannel, CIFX_BUS_STATE_ON, &ulState, 0L);
if (CIFX_NO_ERROR != lRet)
{
printf("Unable to start the filed bus!\r\n");
}
else
{
DWORD dwThreadID = 0;
hAppThreads[i] = CreateThread( NULL, 0, IODataHandler, hChannels[i], 0, &dwThreadID);
}
}
}
/* Wait for all threads terminated */
lRet = WaitForMultipleObjects(channelCount, hAppThreads, TRUE, INFINITE);
/* Close all Channel-Handler */
for (uint32_t i = 0; i < channelCount; i++) {
xChannelClose(ulChannel[i]);
}
free(hChannels);
}
} |
...