Basic understanding of serial communication and knowledge of the installation process for a serial port is required.
The final setup of the machine to run the example should be: camera -> GPIO -> TTL-RS232 -> RS232 port
#include <iostream>
#include <sstream>
using namespace Spinnaker;
using namespace Spinnaker::GenApi;
using namespace Spinnaker::GenICam;
using namespace std;
#define COM_PORT_COUNT_MAX 256
#define TWO_SECOND_DELAY 2000
#define SERIAL_PORT_COMMUNICATION_TIMEOUT_MILLISECOND 1000
#define SERIAL_PORT_BAUD_RATE 19200
#define SERIAL_PORT_STOP_BITS 0
#define SERIAL_PORT_PARITY_BITS 0
#define SERIAL_PORT_DELAY 1500
#define DATA_BITS 8
#define MILLISECOND 1000
{
int result = 0;
cout << endl << "*** DEVICE INFORMATION ***" << endl << endl;
try
{
FeatureList_t features;
CCategoryPtr category = nodeMap.GetNode(
"DeviceInformation");
{
category->GetFeatures(features);
FeatureList_t::const_iterator it;
for (it = features.begin(); it != features.end(); ++it)
{
cout << pfeatureNode->GetName() << " : ";
cout << (
IsReadable(pValue) ? pValue->ToString() :
"Node not readable");
cout << endl;
}
}
else
{
cout << "Device control information not available." << endl;
}
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
int result = 0;
cout << endl << endl << "*** SET SERIAL PORT, OPEN COM PORT, FILE ACCESS SETTINGS ***" << endl << endl;
try
{
cout << endl << "Setup Serial Port Settings " << endl;
CEnumerationPtr ptrSerialPortSelector = nodeMap.GetNode(
"SerialPortSelector");
{
cout << "Unable to set Serial Port Selector. Aborting..." << endl << endl;
return -1;
}
ptrSerialPortSelector->SetIntValue(0);
{
cout << "Unable to set Serial Port Source. Aborting..." << endl << endl;
return -1;
}
ptrSerialPortSource->SetIntValue(0);
CEnumerationPtr ptrSerialPortBaudRate = nodeMap.GetNode(
"SerialPortBaudRate");
{
cout << "Unable to set Serial Port BaudRate. Aborting..." << endl << endl;
return -1;
}
CIntegerPtr ptrSerialPortDataBits = nodeMap.GetNode(
"SerialPortDataBits");
{
cout << "Unable to set Serial Port Data Bits. Aborting..." << endl << endl;
return -1;
}
CEnumerationPtr ptrSerialPortStopBits = nodeMap.GetNode(
"SerialPortStopBits");
{
cout << "Unable to set Serial Port Stop Bits. Aborting..." << endl << endl;
return -1;
}
{
cout << "Unable to set Serial Port Parity. Aborting..." << endl << endl;
return -1;
}
{
cout << "Unable to set Line Selector. Aborting..." << endl << endl;
return -1;
}
ptrLineSelector->SetIntValue(2);
{
cout << "Unable to set Line Mode. Aborting..." << endl << endl;
return -1;
}
ptrLineMode->SetIntValue(1);
{
cout << "Unable to set Line Source. Aborting..." << endl << endl;
return -1;
}
ptrLineSource->SetIntValue(30);
cout << endl << "Setup File Access Settings " << endl;
{
cout << "Unable to set File Selector. Aborting..." << endl << endl;
return -1;
}
ptrFileSelector->SetIntValue(9);
CEnumerationPtr ptrFileOperationSelector = nodeMap.GetNode(
"FileOperationSelector");
{
cout << "Unable to set File Operation Selector. Aborting..." << endl << endl;
return -1;
}
ptrFileOperationSelector->SetIntValue(0);
{
cout << "Unable to set File Open Mode. Aborting..." << endl << endl;
return -1;
}
ptrFileOpenMode->SetIntValue(2);
CCommandPtr ptrFileOperationExecute = nodeMap.GetNode(
"FileOperationExecute");
{
cout << "Unable to execute File Operation. Aborting..." << endl << endl;
return -1;
}
cout << endl << "Execute file access open" << endl;
ptrFileOperationExecute->Execute();
CEnumerationPtr ptrFileOperationStatus = nodeMap.GetNode(
"FileOperationStatus");
{
cout << "Unable to get File Operation Status. Aborting..." << endl << endl;
return -1;
}
CEnumEntryPtr ptrFileStatusSuccess = ptrFileOperationStatus->GetEntryByName(
"Success");
if (ptrFileOperationStatus->GetIntValue() != ptrFileStatusSuccess->GetValue())
{
cout << "Failed to open the file in the File Access Control." << endl;
return 1;
}
cout << endl << "Open COM Port Handle" << endl;
string comPort;
{
comPort = "\\\\.\\COM" + to_string(static_cast<long long>(comPortIndex));
hFileHandle = CreateFileA(
comPort.c_str(),
GENERIC_READ | GENERIC_WRITE,
0,
nullptr,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
nullptr);
if (hFileHandle == INVALID_HANDLE_VALUE)
{
comPort = "";
continue;
}
COMMTIMEOUTS comTimeout;
if (!GetCommTimeouts(hFileHandle, &comTimeout))
{
cout << "Failed to get the timeout settings for COM" + to_string(static_cast<long long>(comPortIndex)) +
". Windows Error Code: " + to_string(static_cast<long long>(GetLastError()))
<< endl;
return -1;
}
if (!SetCommTimeouts(hFileHandle, &comTimeout))
{
cout << "Failed to get the timeout settings for COM" + to_string(static_cast<long long>(comPortIndex)) +
". Windows Error Code: " + to_string(static_cast<long long>(GetLastError()))
<< endl;
return -1;
}
PurgeComm(hFileHandle, PURGE_TXCLEAR);
cout << endl
<< "COM" + to_string(static_cast<long long>(comPortIndex)) << " port is connected to the Device"
<< endl;
DCB comSettings = {0};
comSettings.DCBlength = sizeof(comSettings);
if (!GetCommState(hFileHandle, &comSettings))
{
cout << "Failed to get the communication settings for COM " +
to_string(static_cast<long long>(comPortIndex)) +
". Windows Error Code: " + to_string(static_cast<long long>(GetLastError()))
<< endl;
return -1;
}
if (!SetCommState(hFileHandle, &comSettings))
{
cout << "Failed to set the communication settings for COM " +
to_string(static_cast<long long>(comPortIndex)) + ". Windows Error Code: "
<< endl;
return -1;
}
break;
}
if (comPort == "")
{
cout << "The device was not found to be connected to a COM port between COM0 and COM" +
to_string(static_cast<long long>(COM_PORT_COUNT_MAX)) + ".";
}
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
int result = 0;
try
{
DWORD bytesWritten = 0;
char* data = "ABCD";
if (!WriteFile(hFileHandle, data, 4, &bytesWritten, nullptr))
{
cout << "Failed to write the test data to COM port Windows Error Code: " +
to_string(static_cast<long long>(GetLastError()))
<< endl;
return -1;
}
Sleep(
CIntegerPtr ptrFileOperationResult = nodeMap.GetNode(
"FileOperationResult");
{
cout << "Unable to get File Operation Result. Aborting..." << endl << endl;
return -1;
}
{
cout << "Unable to get File Size. Aborting..." << endl << endl;
return -1;
}
CIntegerPtr ptrFileAccessLength = nodeMap.GetNode(
"FileAccessLength");
{
cout << "Unable to set File Access Length. Aborting..." << endl << endl;
return -1;
}
CRegisterPtr ptrFileAccessBuffer = nodeMap.GetNode(
"FileAccessBuffer");
{
cout << "Unable to set File Access Buffer. Aborting..." << endl << endl;
return -1;
}
CEnumerationPtr ptrFileOperationSelector = nodeMap.GetNode(
"FileOperationSelector");
{
cout << "Unable to set File Operation Selector. Aborting..." << endl << endl;
return -1;
}
CCommandPtr ptrFileOperationExecute = nodeMap.GetNode(
"FileOperationExecute");
{
cout << "Unable to execute File Operation. Aborting..." << endl << endl;
return -1;
}
CEnumerationPtr ptrFileOperationStatus = nodeMap.GetNode(
"FileOperationStatus");
{
cout << "Unable to get File Operation Status. Aborting..." << endl << endl;
return -1;
}
cout << endl << "Set File Access to read operation " << endl;
ptrFileOperationSelector->SetIntValue(2);
unsigned int totalBytesRead = 0;
totalBytesRead = (unsigned int)ptrFileOperationResult->GetValue();
char* serialDataRx = "";
serialDataRx = new char[(unsigned int)ptrFileAccessBuffer->GetLength()];
string dataRead = "";
while (ptrFileSize->GetValue() > 0)
{
ptrFileOperationExecute->Execute();
CEnumEntryPtr ptrFileStatusSuccess = ptrFileOperationStatus->GetEntryByName(
"Success");
if (ptrFileOperationStatus->GetIntValue() != ptrFileStatusSuccess->GetValue())
{
cout << "Failed to read the file in the File Access Control." << endl;
}
memset(serialDataRx, 0, (unsigned int)ptrFileAccessBuffer->GetLength());
ptrFileAccessBuffer->Get((uint8_t*)serialDataRx, ptrFileAccessBuffer->GetLength());
dataRead.append(serialDataRx, (unsigned int)ptrFileOperationResult->GetValue());
}
cout << endl << "Data received is : " << dataRead << endl;
CCommandPtr serialReceiveQueueClear = nodeMap.GetNode(
"SerialReceiveQueueClear");
{
cout << "Unable to execute Serial Receive Queue Clear. Aborting..." << endl << endl;
return -1;
}
serialReceiveQueueClear->Execute();
delete[] serialDataRx;
serialDataRx = nullptr;
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
int result = 0;
try
{
cout << endl << "Set File Access to write mode " << endl;
CIntegerPtr ptrFileAccessLength = nodeMap.GetNode(
"FileAccessLength");
{
cout << "Unable to set File Access Length. Aborting..." << endl << endl;
return -1;
}
CRegisterPtr ptrFileAccessBuffer = nodeMap.GetNode(
"FileAccessBuffer");
{
cout << "Unable to set File Access Buffer. Aborting..." << endl << endl;
return -1;
}
CEnumerationPtr ptrFileOperationSelector = nodeMap.GetNode(
"FileOperationSelector");
{
cout << "Unable to set File Operation Selector. Aborting..." << endl << endl;
return -1;
}
CCommandPtr ptrFileOperationExecute = nodeMap.GetNode(
"FileOperationExecute");
{
cout << "Unable to exectue File Operation. Aborting..." << endl << endl;
return -1;
}
CEnumerationPtr ptrFileOperationStatus = nodeMap.GetNode(
"FileOperationStatus");
{
cout << "Unable to get File Operation Status. Aborting..." << endl << endl;
return -1;
}
ptrFileOperationSelector->SetIntValue(3);
ptrFileAccessLength->SetValue(4);
char serialDataTx[] = "ABCD";
ptrFileAccessBuffer->Set((uint8_t*)serialDataTx, 4);
ptrFileOperationExecute->Execute();
CEnumEntryPtr ptrFileStatusSuccess = ptrFileOperationStatus->GetEntryByName(
"Success");
if (ptrFileOperationStatus->GetIntValue() != ptrFileStatusSuccess->GetValue())
{
cout << "Failed to write the file in the File Access Control." << endl;
return -1;
}
DWORD bytesRead = 0;
unsigned char* tempBytesRead[4] = {0};
if (!ReadFile(hFileHandle, tempBytesRead, 4, &bytesRead, nullptr))
{
cout << "Failed to read the test data from COM port Windows Error Code: " +
to_string(static_cast<long long>(GetLastError()))
<< endl;
return -1;
}
string dataTransmitted(reinterpret_cast<const char*>(tempBytesRead), 4);
cout << endl << "Data transmitted was " << dataTransmitted << endl;
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
int result = 0;
try
{
CEnumerationPtr ptrFileOperationSelector = nodeMap.GetNode(
"FileOperationSelector");
{
cout << "Unable to set File Operation Selector. Aborting..." << endl << endl;
return -1;
}
CCommandPtr ptrFileOperationExecute = nodeMap.GetNode(
"FileOperationExecute");
{
cout << "Unable to exectue File Operation. Aborting..." << endl << endl;
return -1;
}
CEnumerationPtr ptrFileOperationStatus = nodeMap.GetNode(
"FileOperationStatus");
{
cout << "Unable to get File Operation Status. Aborting..." << endl << endl;
return -1;
}
ptrFileOperationSelector->SetIntValue(1);
cout << endl << "Execute file access close" << endl;
ptrFileOperationExecute->Execute();
CEnumEntryPtr ptrFileStatusSuccess = ptrFileOperationStatus->GetEntryByName(
"Success");
if (ptrFileOperationStatus->GetIntValue() != ptrFileStatusSuccess->GetValue())
{
cout << "Failed to close the file in the File Access Control." << endl;
}
PurgeComm(hFileHandle, PURGE_RXCLEAR);
PurgeComm(hFileHandle, PURGE_TXCLEAR);
cout << endl << "Close Com Port handle" << endl;
CloseHandle(hFileHandle);
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
int result = 0;
int err = 0;
try
{
INodeMap& nodeMapTLDevice = pCam->GetTLDeviceNodeMap();
pCam->Init();
HANDLE hFileHandle;
if (err < 0)
{
return err;
}
result = result |
SerialRx(pCam, nodeMap, hFileHandle);
result = result |
SerialTx(pCam, nodeMap, hFileHandle);
result = result |
CleanUp(nodeMap, hFileHandle);
pCam->DeInit();
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
int result = 0;
cout << "Application build date: " << __DATE__ << " " << __TIME__ << endl << endl;
unsigned int numCameras = camList.
GetSize();
cout << "Number of cameras detected: " << numCameras << endl << endl;
if (numCameras == 0)
{
system->ReleaseInstance();
cout << "Not enough cameras!" << endl;
cout << "Done! Press Enter to exit..." << endl;
getchar();
return -1;
}
for (unsigned int i = 0; i < numCameras; i++)
{
cout << endl << "Running example for camera " << i << "..." << endl;
cout << endl << "Camera " << i << " example complete..." << endl << endl;
}
pCam = nullptr;
system->ReleaseInstance();
cout << endl << "Done! Press Enter to exit..." << endl;
getchar();
return result;
}