29.07.2011 - fundamental new
This commit is contained in:
58
piserial.cpp
58
piserial.cpp
@@ -9,19 +9,21 @@ PISerial::PISerial(PIString name, void * data_, SerialFunc slot): PIThread() {
|
||||
dataSize = headerSize = 0;
|
||||
headerPtr = 0;
|
||||
ret_func = slot;
|
||||
buffer = new char[BUFFER_SIZE];
|
||||
sbuffer = new char[BUFFER_SIZE];
|
||||
//buffer = new char[BUFFER_SIZE];
|
||||
//sbuffer = new char[BUFFER_SIZE];
|
||||
#ifdef WINDOWS
|
||||
hCom = 0;
|
||||
#endif
|
||||
ispeed = ospeed = B115200;
|
||||
ispeed = ospeed = S115200;
|
||||
}
|
||||
|
||||
|
||||
PISerial::~PISerial() {
|
||||
terminate();
|
||||
delete buffer;
|
||||
delete sbuffer;
|
||||
/*if (buffer != 0) delete buffer;
|
||||
buffer = 0;
|
||||
if (sbuffer != 0) delete sbuffer;
|
||||
sbuffer = 0;*/
|
||||
}
|
||||
|
||||
|
||||
@@ -48,6 +50,24 @@ void PISerial::terminate() {
|
||||
}
|
||||
|
||||
|
||||
int PISerial::convertSpeed(PISerial::Speed speed) {
|
||||
switch (speed) {
|
||||
case S110: return B110;
|
||||
case S300: return B300;
|
||||
case S600: return B600;
|
||||
case S1200: return B1200;
|
||||
case S2400: return B2400;
|
||||
case S4800: return B4800;
|
||||
case S9600: return B9600;
|
||||
case S19200: return B19200;
|
||||
case S38400: return B38400;
|
||||
case S57600: return B57600;
|
||||
case S115200: return B115200;
|
||||
}
|
||||
return B115200;
|
||||
}
|
||||
|
||||
|
||||
void PISerial::begin() {
|
||||
sbuffIndex = 0;
|
||||
startIndex = 0;
|
||||
@@ -89,7 +109,7 @@ void PISerial::run() {
|
||||
{
|
||||
//cout << "vsdfgvb" << endl;
|
||||
memcpy(pbuffer,&sbuffer[startIndex+headerSize],dataSize);
|
||||
if (ret_func(data, pbuffer))
|
||||
if (ret_func(data, pbuffer, dataSize))
|
||||
{
|
||||
startIndex = 0;
|
||||
sbuffIndex = -1;
|
||||
@@ -143,7 +163,7 @@ void PISerial::run() {
|
||||
b = buffer[i];
|
||||
sbuffer[sbuffIndex] = b;
|
||||
if (sbuffIndex == dataSize - 1) {
|
||||
if (ret_func != 0) ret_func(data, sbuffer);
|
||||
if (ret_func != 0) ret_func(data, sbuffer, dataSize);
|
||||
sbuffIndex = -1;
|
||||
}
|
||||
sbuffIndex++;
|
||||
@@ -163,7 +183,7 @@ bool PISerial::init() {
|
||||
#ifdef WINDOWS
|
||||
hCom = CreateFileA(devName.stdString().c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);
|
||||
if(hCom == INVALID_HANDLE_VALUE) {
|
||||
cout << "[PISerial] Unable to open " << devName << endl;
|
||||
cout << "[PISerial] Unable to open \"" << devName << "\"" << endl;
|
||||
return false;
|
||||
}
|
||||
fd = 0;
|
||||
@@ -174,7 +194,7 @@ bool PISerial::init() {
|
||||
times.WriteTotalTimeoutConstant = 0;
|
||||
times.WriteTotalTimeoutMultiplier = 1;
|
||||
if (SetCommTimeouts(hCom, ×) == -1) {
|
||||
cout << "[PISerial] Unable to set timeouts for " << devName << endl;
|
||||
cout << "[PISerial] Unable to set timeouts for \"" << devName << "\"" << endl;
|
||||
CloseHandle(hCom);
|
||||
fd = -1;
|
||||
return false;
|
||||
@@ -184,12 +204,12 @@ bool PISerial::init() {
|
||||
GetCommState(hCom, &sdesc);
|
||||
desc = sdesc;
|
||||
desc.DCBlength = sizeof(desc);
|
||||
desc.BaudRate = ispeed;
|
||||
desc.BaudRate = convertSpeed(ispeed);
|
||||
desc.ByteSize = 8;
|
||||
desc.fParity = params[PISerial::IgnoreParityControl] ? 0 : 1;
|
||||
desc.StopBits = params[PISerial::TwoStopBits] ? TWOSTOPBITS : ONESTOPBIT;
|
||||
if (SetCommState(hCom, &desc) == -1) {
|
||||
cout << "[PISerial] Unable to set comm state for " << devName << endl;
|
||||
cout << "[PISerial] Unable to set comm state for \"" << devName << "\"" << endl;
|
||||
CloseHandle(hCom);
|
||||
fd = -1;
|
||||
return false;
|
||||
@@ -197,7 +217,7 @@ bool PISerial::init() {
|
||||
#else
|
||||
fd = open(devName.data(), O_NOCTTY | O_RDWR);
|
||||
if(fd == -1) {
|
||||
cout << "[PISerial] Unable to open " << devName << endl;
|
||||
cout << "[PISerial] Unable to open \"" << devName << "\"" << endl;
|
||||
return false;
|
||||
}
|
||||
fcntl(fd, F_SETFL, 0);
|
||||
@@ -206,16 +226,20 @@ bool PISerial::init() {
|
||||
sdesc = desc;
|
||||
desc.c_iflag = desc.c_oflag = desc.c_lflag = 0;
|
||||
desc.c_cflag = CLOCAL | CREAD | CSIZE;
|
||||
if (params[PISerial::TwoStopBits]) desc.c_cflag &= CSTOPB;
|
||||
if (params[PISerial::IgnoreParityControl]) desc.c_iflag &= IGNPAR ; // | INPCK | IGNBRK | IGNCR;
|
||||
if (params[PISerial::TwoStopBits]) desc.c_cflag |= CSTOPB;
|
||||
if (!params[PISerial::ParityControl]) {
|
||||
desc.c_iflag |= INPCK;
|
||||
desc.c_cflag |= PARENB;
|
||||
if (!params[PISerial::ParityOdd]) desc.c_cflag |= PARODD;
|
||||
}
|
||||
desc.c_cc[VMIN] = 0;
|
||||
desc.c_cc[VTIME] = 1;
|
||||
|
||||
cfsetispeed(&desc, ispeed);
|
||||
cfsetospeed(&desc, ospeed);
|
||||
cfsetispeed(&desc, convertSpeed(ispeed));
|
||||
cfsetospeed(&desc, convertSpeed(ospeed));
|
||||
|
||||
if(tcsetattr(fd, TCSANOW, &desc) < 0) {
|
||||
cout << "[PISerial] Can`t set attributes for " << devName << endl;
|
||||
cout << "[PISerial] Can`t set attributes for \"" << devName << "\"" << endl;
|
||||
close(fd);
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user